Unity3D游戏引擎最详尽基础教程

article/2025/11/4 23:04:46

关注公众号 风色年代(itfantasycc) 200G Unity资料合集送上~

 

转自:http://blog.sina.com.cn/s/blog_7c336a8301013son.html

我一直向所有想做游戏的朋友推荐Unity3D,为什么呢?首先是因为专业,Unity3D非常强大,用它创建一个类似MiniGore这样的3D平面射击游戏简直轻而易举,而就连使命召唤这样的大型3d游戏,如果素材得当也不在话下。二是因为易用,他的操作非常容易,而使用的脚本语言又是JavaScript或者C#,不仅非常简单,也让各个种类的程序员都非常容易上手。再次,就是因为免费,如果你不使用Pro或者Mobile的内容的话,Unity3d就是完全免费的。还有就是对3D模型的兼容性,几乎任何3d模型都可以导入到unity中,可以说是一个很方便的特性。

 

今天,我就来讲讲Unity3D的基础操作,这可以说是一个新手必读吧,读完之后,你一定会惊叹,原来做一个游戏这么简单。

 

第一节 加入重力

 

我们先打开Unity3d,新建一个场景(Scene),新建的时候应该会有对话框要求你加入哪些Asset Package,记得选择Physics Material,因为后面我们一定要用的哦亲。

 

如果创建的时候没加,你可以再后来的Asset菜单里加:

 

 

之后,我们建立一个Cude,调整一下x和z的大小,我这里调成了25,让它变成一个地板,你也可以放一个texture上去,看起来更加真实,我这里从简,再创建一个sphere,在component中选择Physics中的RigidBody,前提是选中你的sphere物体,之后会看到这个Sphere的inpector中加入一个component叫做RigidBody,调整好Camera运行一下,你就会发现Sphere受到重力的影响自动掉落到地板上。

 

 

之后,通过我们之前引入的Physics Materials资源包,你还可以选择这个物体的物理性质,我这里选择Bouncy(跳跳),落下之后,这个物体就会蹦来蹦去的,呵呵

 

 

 

第二节 检测碰撞

 

下面我们通过简单的JavaScript语句来检测碰撞,这在制作游戏中是很有用的,比如说检测到子弹和敌人的碰撞之后,可以使用我们后来要讲到destory命令消灭敌人。

 

这次我们新建一个Terrain项目,在用Grass贴图来覆盖住它,如果你找不到贴图的话,记得在Asset菜单里找找,看看哪些资源你还没有引入进去。

 

然后再加入一个Cube项目,我这里叫做PlayerCube,为他加上重力,之后选择bouncy性质,然后我们再新建一个Cude,调整y和z的值让他变成一堵墙,放置好,命名为Wall,别忘了给Terrain改名为Terrain,

 

之后我们在Asset菜单中建立一个JavaScript项目,改名为CollisionDetect,双击打开,如果你使用的是Unity 3.5的话,就会打开MonoDev,这是一个新工具还是很好用的,在其中新建一个函数,别管Start和Update函数,我们待会会讲。

 

加入以下代码:

 


function OnCollisionEnter(theCollision : Collision){if(theCollision.gameObject.name=="Terrain"){Debug.Log("Hit terrain");}else if(theCollision.gameObject.name=="Wall"){Debug.Log("Hit the wall");}}

 

如果看不懂这些代码的话,也没关系,JavaScript是最好学的编程语言,Google一下吧,保存这个JS文件,然后拖到我们的PlayerCube上。

 

这时候我们运行,就会看到PlayerCube到处蹦,碰到Terrain的时候,控制台就会显示Hit Terrain,碰到wall的时候就会显示Hit the wall。

 

第三节  检测用户输入

 

下面我们来讲一下如何检测用户的键盘和鼠标的操作。

 

就用我们上次的那个场景,这次我们给PlayerCube加上我们可以控制的动作。就是通过“wasd”或者上下左右键来控制移动。

 

请注意,如果要使用这里使用的方法来控制移动,那么所控制的物体不能够是一个物理世界的物体,也就是说你要把RigidBody这个component删掉,如果你想要在物理世界里移动物体的话,你就需要我们在下面会讲到的力(force)。

 

首先我们新建一个JavaScript文件,这里命名为InputDetect吧,输入下面的代码:

 


#pragma strictvar Player : GameObject;function Start () {}function Update () {Player = GameObject.Find("PlayerCube");if(Input.GetKey(KeyCode.W)){Debug.Log("Hit w");Player.transform.Translate(Vector3.forward * 2);}else if(Input.GetKey(KeyCode.S)){Debug.Log("Hit s");Player.transform.Translate(Vector3.back * 2);}else if(Input.GetKey(KeyCode.A)){Debug.Log("Hit a");Player.transform.Translate(Vector3.left * 2);}else if(Input.GetKey(KeyCode.D)){Debug.Log("Hit d");Player.transform.Translate(Vector3.right * 2);}}

 

这时,我们运行这个游戏,就可以通过“WASD”来控制PlayerCube的移动了。

 

 

第四节 使用Prefab复制和控制物体

 

我们可以直接把Prefab看做是个妈,她能生好多小孩,如果妈妈的DNA变了,小孩的跟着变,就是说你可以用Prefab创建物体,然后通过这个Prefab修改所有这类物体的性质,这对于批量生成的敌人或者NPC来说很有用。

 

首先,先创建一个Prefab,我这里命名为“Mother”,之后新建一个Sphere物体,当然你也可以建一些其他的物体,之后给这个Sphere加上你想要的性质,我加入了RigidBody和Bouncy,之后将Sphere拖到Mother上,你会发现mother变蓝了,之后你就可以随意拖一些mother物体到屏幕上去,你会发现所有的Prefab创建出的物体在清单上都是蓝色的,说明他们都有共同的性质。

 

 

当然,作用于一个Prefab上的脚本也会作用到它的子物体上去。

 

第五节 使用Destroy命令消灭物体

 

我们游戏中怎么能够没有敌人呢?有敌人就得能够消灭他们,这时候,我们就会使用Destroy命令了。

 

在这里,我们使用上次Mother生出来的小球球作为敌银,一旦我们的PlayerCube碰撞到了小球的话,就是用Destroy让小球消失。

 

新建一个JavaScript脚本,输入以下代码:

 


#pragma strictvar mother : GameObject;function Start () {}function Update () {}function OnCollisionEnter(theCollision : Collision){mother = GameObject.Find("Mother");if(theCollision.gameObject.name=="Mother"){Debug.Log("Hit mother");Destroy(mother);}}

 

这段代码很好懂吧,就是检验碰撞,然后销毁碰撞到的Mother物体,别忘了把Destroy的JavaScript文件拖到PlayerCube上去。运行一下,就可以看到碰撞到的物体都被消灭了。

 

 

第六节 使用Instantiate命令创造物体

 

我们直接在界面创造的物体都只是会在界面被初始化的时候加载,那么,如果为了节约内存或者其他什么事情,我想要在游戏过程中添加物体,那该怎么办呢?你猜对了,就是用instantiate命令。

 

这个命令就是英文实例化的意思,下面我们给碰撞之后消失的mother物体继续初始化一些,也就是说消灭了一些,又来了一大波···

 

为什么非要用mother呢?因为只有拥有Prefab的物体才能够使用这个命令哦亲。

 


function Update () {var instance : GameObject = Instantiate (PreFab,transform.position,transform.rotation);}

 

注意:这样的话,每次刷新一帧都会出现一个新的mother物体,你的内存也许会受不了哦,更合理的方法是按下空格键,然后出现一个新的物体,你可以自己做吗?试试看

 

你可能已经注意到了,每一个初始化的脚本都会默认有两个函数,就是:

Update()函数 —— 每刷新一帧都会检查并执行

Start()函数 —— 只在场景初始化的时候执行

 

第七节 使用Timer计时器

 

这次,我们要让一个计时器倒数,倒数到0的时候创建一个mother物体,来看Javascript代码吧:

 


#pragma strictvar myTimer : float = 5.0;function Start () {}function Update () {if (myTimer >= 0){myTimer -= Time.deltaTime;guiText.text=(""+myTimer);}if (myTimer <= 0){guiText.text = ("Done");}}

 

把这个脚本拖到GUItext控件上,你会发现我们所期待的效果。

 

 

第八节 让物体动起来

 

其实让物体行动的技巧,我们已经会了,不是吗?

 

如果你觉得不是的话,没有认真的看上面的文章哦,我就再给你讲一次吧。

 

请特别注意,这种方法不适合物理世界的物体,如果向移动物理世界的物体,请看下一节:

 

创建一个Cylinder物体,之后将下面的脚本附着在上面。

 


#pragma strictvar myObject : GameObject;function Start () {}function Update () {myObject.gameObject.Find("Cylinder");myObject.transform.Translate(Vector3(0,0,1));}

 

第九节 使用物理世界的力

 

这里是我们讲移动物体的重点,因为大部分的物体移动都是在物理世界完成的,而如果想要在物理世界移动东西,除了position和rotation的移动之外,就是使用“力”了,在高中学过经典物理学的人都知道,要使物体用移动,木有力是不行的,那么我们就开始吧,再新建一个什么物体,我新建了一个Capsule。

 

之后,我会在这个物体的上方加一个力,让它用力的向下飞,触碰到地之后,通过bouncy这个性质再弹回来。新建一个JavaScript文件,就叫做Force吧,加入如下代码:

 


#pragma strictvar Power : float = 500.0;function Start () {rigidbody.AddForce(Vector3(0,Power,0));}function Update () {}

 

运行之后,会发现capsule其实是个很有幽默感的物体。

 

 

第十节 使用贴图和材质

 

贴图和材质能够使你的虚拟3D世界看起来更加真实,不幸的是,需要大量在PS和AI中的设计工作,最近我一想到要打开PS就有点烦···呜呜。

 

闲话少说,我已经做好了一个贴图,怎么使用在材质上呢?之后我们怎么才能通过材质使用到其他物体之上呢?

 

 

就像你看到的一样,我是直接拖进去的···

 

之后我们从新建菜单中选择Material这一项,之后选中material,将贴图拖进material的贴图选框里,之后,就可以拖动这个Material赋给任何物体了。

 

 

第十一节 使用声效和音乐

 

音效和音乐对于一个游戏来说是非常重要的,一个寂静无声的世界是无聊的,而且不真实,什么?你说声效和音乐是一个东西?那你就错了,声效是,比如说发射子弹的声音,什么东西爆炸的声音等等,而音乐则是背景音乐什么的,不一样的亲。

 

对于音乐来说,往往使用立体声音乐,而对于生效来说,我们随便使用一个简单的音乐文件就可以了。

 

想要在Unity3D中播放音乐,你需要两样东西,一个是监听器,一个是音乐源,监听器是Camera的一个组件,所以你不用担心,你唯一需要增加的就是音乐源。

 

直接将项目中的音乐拖放到Audio Source项就可以播放,但是如果我们想要在某个特定的点上 播放音乐该怎么办呢?答案就是,写一个脚本,新建一个脚本,输入如下代码:

 


#pragma strictvar myClip : AudioClip;function Start () {AudioSource.PlayClipAtPoint(myClip,transform.position);}function Update () {}

 

之后将这个脚本拖放到我们的物体上,最后,将音频文件拖放到AudioSource选项框中。

 

第十二节 使用关节

 

关节在3D游戏之中的应用非常广,主要在于物理世界的重力影响,下面我们就通过关节来制作一个钟摆。

 

这次我们新建一个场景,松了一口气?刚才的场景是不是太乱了?你做的时候可以整理一下嘛,呵呵

 

新建一个cube作为地面,之后一个cube放在上空作为摆垂,之后用几个capsule分别用component中的fixed joint连接起来,之后最上面的那个capsule与世界相连,使用Hinge Joint,这样的话,他会默认与世界相连,不用担心,看图

 

 

第十三节 使用Axes

 

在Edit – Project Setting – input 中可以查看各种形式的input,这些input方法在unity中被叫做Axes。

 

我们创建一个JavaScript,叫做GetAxes,输入以下内容:

 


#pragma strictfunction Start () {}function Update () {var Honriz : float = Input.GetAxis("Honrizontal");Debug.Log(Honriz);}

 

在拖放脚本之后,运行这个场景,看看控制台输出了什么,你就明白了。

 

 

第十四节 使用触发器

 

触发器一般用于检测一个物体是否处于一个空间内,他是怎么做到的呢?

 

首先,他创造一个大的物体,之后将他的randerer属性去掉,他就隐形了,这样,我们再把他的isCollide属性去掉,他就不会发生碰撞了,之后,我们只需要用脚本检测物体是否与这个物体碰撞就可以了。

 

我们新建一个场景,做一个地板,再做一个底座,叠加起来,再在他们的上空做一个方块,设置rigidbody属性,将底座设置成为我们刚才说的那种隐形的状态,之后新建一个JavaScript脚本,输入代码

 


#pragma strictfunction Start () {}function Update () {}function OnTriggerEnter (myTrigger : Collider) {if(myTrigger.gameObject.name == "box"){Debug.Log("Hit");}}

 

按下运行,会发现可以检测出Hit。

 

 

第十五节 使用GUI

 

其实我们已经学过了如何使用GUI text,不信,我们就用屏幕上的字代替我们在上面的程序中的Debug.Log现实的内容。

 

你自己能做吗?

 

试试看吧,一个下午写了这么多,有点累。

 

一定要在Unity中加入一个GUI Text,运行一下,就会发现屏幕上的GUI Text会随着你设定的的内容而变化了。

 

之后看些什么?

 

本教程的所有代码在Unity3D 3.5 F5 + Mac OS X Lion上测试可用。

 

欢迎关注我的围脖: @Oratis

在知乎和豆瓣上,我的名字也是Oratis

 

我会把之后发表的教程分享到这些社交网络中。

 

如果你有任何问题,欢迎在底下留言,也欢迎写信给我,我的邮箱地址是: oratis@appkon.com

代码及资料下载:

关注公众号 风色年代(itfantasycc) 200G Unity资料合集送上~

 


http://chatgpt.dhexx.cn/article/RKrlrsIa.shtml

相关文章

30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

前言 &#x1f3ac;【全网首发】 | 30分钟了解所有组件&#xff0c;132个Unity 游戏引擎组件速通&#xff01;一、Mesh 网格1.Mesh Filter2.Mesh Renderer3.Skinned Mesh Renderer4.Text Mesh5.TextMeshPro-Text 二、Effects 特效组件1.Particle System2.Visual Effect3.Trail …

Unity 3D 物理引擎简介 || Unity 3D 物理材质|| Unity 3D 力(AddForce)

Unity 3D 物理引擎简介 早期的游戏并没有强调物理引擎的应用&#xff0c;当时无论是哪一种游戏&#xff0c;都是用极为简单的计算方式做出相应的运算就算完成物理表现&#xff0c;如超级玛丽和音速小子等游戏。 较为常见的物理处理是在跳跃之后再次落到地上&#xff0c;并没有…

Unity游戏引擎介绍及相关学习资源

Unity&#xff08;游戏引擎&#xff09;一般指Unity3D 官网&#xff1a; https://unity.com/ 手册&#xff1a;https://docs.unity3d.com/Manual/ Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的…

垃圾收集器及算法

一、垃圾收集算法 1.分代收集理论 当前虚拟机的垃圾收集都采用分代收集算法&#xff0c;只是根据对象存货周期的不同将内存分为几块。一般java堆分为新生代和老年代&#xff0c;可以根据各个年代的特点选择合适的垃圾收集算法。比如在新生代中&#xff0c;每次收集都会有大量的…

垃圾收集器-CMS

CMS垃圾收集器 文章目录 CMS垃圾收集器前言一、CMS是什么&#xff1f;二、CMS收集的步骤1.初始标记2.并发标记3.重新标记4.并发收集 三、核心参数四、总结 前言 相信大家都或多或少的了解过hotspot虚拟机的垃圾收集器&#xff0c;无论是初代的serialGc(单线程的垃圾收集器)&am…

Java经典垃圾收集器

经典垃圾收集器 1.Serial收集器2.ParNew收集器3.Parallel Scavenge收集器4.Serial Old收集器5.Parallel Old收集器6.CMS收集器7.Garbage First收集器 1.Serial收集器 Serial收集器是最基础&#xff0c;历史最久远的收集器&#xff0c;是一款新生代收集器&#xff0c;新生代收集…

GC 垃圾收集器

GC 垃圾回收算法 和 垃圾收集器之间的关系是什么呢 ? GC算法 (复制 / 标清 / 标整 ) 是内存回收的一种思想 , 垃圾收集器就是 GC算法 的落地实现我们知道没有最完美的 GC算法 , 因此目前为止也没有完美的垃圾收集器 , 只是针对不同的情况选择最适合的收集器来进行分代收集 主要…

7种垃圾收集器

如果说收集算法是内存回收的方法论&#xff0c;那么垃圾收集器就是内存回收的具体实现。 Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定&#xff0c;因此不同的厂商、版本的虚拟机所提供的垃圾收集器都可能会有很大差别&#xff0c;并且一般都会提供参数供用户根据…

垃圾收集器简介

HotSpot JVM收集器 上面有7中收集器&#xff0c;分为两块&#xff0c;上面为新生代收集器&#xff0c;下面是老年代收集器。如果两个收集器之间存在连线&#xff0c;就说明它们可以搭配使用。 Serial(串行GC)收集器 Serial收集器是一个新生代收集器&#xff0c;单线程执行&…

【JVM】7种经典的垃圾收集器

文章目录 1. 垃圾收集器概述2. Serial 收集器3. ParNew 收集器4. Paraller Scavenge 收集器5. Serial Old收集器6. Parller Old收集器7. CMS 收集器8. Garbage First 收集器 本文参考&#xff1a;深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践&#xff08;第3版&#x…

JVM垃圾收集器

一.概述 GC需要完成的三件事:1.哪些内存需要回收? 2.什么时候回收? 3.如何回收 Java内存运行时区域的各个部分&#xff1a; a. 其中程序计数器、虚拟机栈、本地方法栈三个区域随线程而生&#xff0c;随线程而灭&#xff1b;栈中的栈帧随着方法的进入和退出而有条不紊地执行…

垃圾收集算法与垃圾收集器

典型的垃圾收集算法 1.Mark-Sweep&#xff08;标记-清除&#xff09;算法 这是最基础的垃圾回收算法&#xff0c;之所以说它是最基础的是因为它最容易实现&#xff0c;思想也是最简单的。标记-清除算法分为两个阶段&#xff1a;标记阶段和清除阶段。标记阶段的任务是标记出所有…

Java 的七种垃圾收集器

用 C 或 C 这样的编程语言写一个应用时&#xff0c;需要编写代码来销毁内存中不再需要的对象。当应用程序扩展得越来越复杂时&#xff0c;未使用对象被忽略释放的可能性就越大。这会导致内存泄露&#xff0c;最终内存耗尽&#xff0c;在某个时刻将没有更多的内存可以分配。结果…

Java 垃圾收集器

堆内存示意图 垃圾收集算法 1.标记-清除算法 算法分为标记和清除两个阶段。标记出所有需要回收的对象&#xff0c;在标记完成后&#xff0c;统一回收。 缺点&#xff1a; 执行效率不稳定&#xff0c;若堆中有大量对象要被回收&#xff0c;这是必须进行大量标记和清除动作&a…

JVM 垃圾收集器

title: “JVM 垃圾收集器” date: 2022-03-11T16:45:2108:00 draft: false 文章目录 引言术语垃圾收集器介绍Serial 收集器&#xff08;新生代&#xff09;ParNew收集器&#xff08;新生代&#xff09;Parallel Scavenge收集器&#xff08;新生代&#xff09;Serial Old 收集器…

详解ZGC垃圾收集器

从G1垃圾收集器开始&#xff0c;后面的垃圾收集器都不再将堆按照新生代和老年代作为整体进行回收&#xff0c;都采用了局部收集的设计思想。 可能是由于G1作为第一代局部收集的垃圾收集器&#xff0c;所以它继续保留了新生代和老年代的概念&#xff0c;笔者认为从局部收集和分…

JVM——垃圾收集器

目录 引言 垃圾收集器 如何判断对象已死&#xff1f; 引用计数算法&#xff1a; 可达性分析算法&#xff1a; 垃圾收集算法 标记-清除算法 标记-复制算法 标记-整理算法 并发的可达性分析 经典垃圾收集器 内存分配与回收策略 1.对象优先在Eden分配 …

jvm垃圾收集器有哪些

Serial收集器 Serial收集器是最基本&#xff0c;发展最悠久的收集器&#xff0c;在JDK1.3.1之前是虚拟机新生代垃圾回收的唯一选择。这个收集器是一个单线程的。它的单线程的意义并不仅仅说明它只会使用一个CPU或者一条收集线程去完成收集工作&#xff0c;最重要的是&#xff…

经典垃圾收集器(三)

低延迟垃圾收集器 衡量垃圾收集器的三项重要指标&#xff1a;内存占用&#xff08;Footprint&#xff09;、吞吐量&#xff08;Throughput&#xff09;和延迟&#xff08;Latency&#xff09;。三者构成了一个“不可能三角” Shenandoah收集器 Shenandoah相比于G1有什么改进&…

垃圾收集器

如果说垃圾回收算法是内存回收的方法论&#xff0c;那么垃圾收集器就是内存回收的具体实现&#xff0c;java虚拟机实现规范中对垃圾收集器应该如何实现并没有任何规定&#xff0c;因此不同厂商、不同版本的虚拟机提供的垃圾收集器存在很大的差异&#xff0c;接下来我们主要介绍…