本人目前大一,双非一本,谨以此博客,记录日后的unity学习过程与算法训练。希望能同大家一起进步!也希望三年后回过头来能看到一个优秀而拼搏的自己!
话不多说,上我的第一个demo(虽然是跟着视频做的)就是一个简陋版的贪吃蛇啦!
首先是添加最基础的scene,我们添加plane,player,再添加几个cube然后通过改变他们的参数来控制它们的大小及形状。需要注意的是,为了让我们的每一个游戏物体都看起来生动,我们需要为他们添加材质。
在Project操作框下面的Assets里面新增一个文件夹Mretrails来存放我们所有游戏物体所需要使用到的材质。如图,我已经添加好了player,plane以及food的材质。
我们可以在每个材质的属性里面更改它们的颜色,光滑度,阴影等参数,设置成我们需要的大小之后,我们需要通过拖拽的方式将我们的每个材质逐一对应地作用到我们的游戏物体上。
之后我们的每个游戏物体就具有自己的颜色跟某些特性啦。
虽然我的很简陋,不过凑合着看,这就是最简陋的效果(doge)。
而后,我们需要对我们的player给它添加上一个Rigidbody组件,这个组件的意思是3D刚体组件,通过将它添加到我们的某个游戏物体上,那么该物体就能会拥有最基础的物理属性,比如重力。
之后,我们就可以通过script来控制我们的刚体组件从而控制我们小球的运动。
控制小球运动有很多种形式,我们可以通过控制unity自带的轴控制 ,也可以直接赋予小球恒定的速度来控制他的运动。这里的话,我是通过控制轴来控制小球的运动,也就是通过键盘的w,s,a,d这四个按键来控制。
首先我们需要在Assets里面新增一个scripts的文件夹来存放我们在游戏开发过程中的代码,然后我们在scripts文件夹里面新增一个c#script,命名为player,用它来控制我们的player也就是小球的逻辑表现。
下面就是控制小球运动的代码。
首先我们定义一个公开变量 public Rigidbody rd,用它来指定我们小球的刚体组件。
然后,我们通过如下代码来控制小球的运动。
我们在unity自带的Update方法里面写进如上代码,定义一个变量h来获得我们的水平轴,也就是左右方向,然后定义一个变量v来 获得我们的垂直轴,控制前后方向。
通过刚体的AddForce组件来获得力,Vector3表示一个三维向量的力,即vector3(左右,上下,前后),然后将我们的h跟v赋值到Vector3里面,就大功告成了!在这之后,你的player小球就会拥有移动的能力啦。是不是很厉害呢(bushi
因为我们需要做的是一个类似于贪吃蛇的小游戏demo,所以在这之后,我们应该做什么呢?没错,就是创建一些食物来供我们的player吃。我们将其称为food。由于博主也是刚刚入门,所以food就是用一些完全一致的cube来充当。在这里,我们又将接触到新的概念——预制体。
什么是预制体呢?
在Unity3D里面我们叫它Prefab;我们也可以这样理解:当制作好了游戏组件(场景中的任意一个gameobject),我们希望将它制作成一个组件模版,用于批量的套用工作,例如说场景中本质上要重复使用的东西,比如:敌人、士兵、子弹或者一个砖块完全相同的墙体。这里说本质是因为默认生成的prefab其实和模版是一模一样的。就像是克隆体,但生成的位置、角度或者一些属性不同(这个就好像c++里边的类一样);
这样看来,Prefab对于我们开发unity3d相当重要。
好了,下边开始介绍如何制作Prefab。
首先我们要在Assets里面新建一个空的文件夹,将它命名为Prefabs,然后在Scene里面新建我们需要的游戏物体,将它拖拽到我们的Prefabs里,就建成一个预制体了。之后我们可以直接在我们的Prefab里面将我们放进去的游戏物体拖到我们的场景中,就形成一个个拥有相同属性的food啦。如下图。
所有黄色的小方块就是我们的food。之后我们对它们在场景界面进行的所有操作,只需要更改Prefabs里面的food就可以了 ,非常方便。为了在对它们书写脚本时一致,我们还需要将Prefabs里面的food的标签添加为Food,这样我们在书写脚本时,只需要获取到预制体上面的Food标签,就可以对他们所有进行控制了。
如上图,我们将预制体的Tag定义为Food。
在游戏中,大部分具有效果的道具它们都是比较特别的,比如会旋转,具有光效,由于刚入门,在这里我们就只设置了旋转效果。新建一个代码页,命名为Food,我们用它来控制我们的食物。我们通过transform类来获取到Rotate这一函数,也就是自身的旋转函数。Transform.Rotate传入了一个欧拉角三元组,只有一个参数“角度”,我们用它来使物体每秒自己旋转一定的角度。代码如下:
这个代码的效果就是让我们的食物每帧顺时针地旋转5° 。
解决了player的移动,food的动效,接下来我们要考虑的,就是游戏最核心的部分,控制我们的player吃到食物后并且消除它。这里又要引入unity API的两个重要组件:碰撞器与触发器。
要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动。碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞。如果两个刚体相互撞在一起,除非两个对象有碰撞体时物理引擎才会计算碰撞,在物理模拟中,没有碰撞体的刚体会彼此相互穿过。
物体发生碰撞的必要条件:两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体。
碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。
- 当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;
- 当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器。
例子:
碰撞器:汽车被撞飞、皮球掉在地上又弹起效果。
触发器:人站在靠近门的位置门自动打开效果。
那在这里,很明显我们需要我们的食物变成触发器,即:在发生碰撞后,没有碰撞效果,直接吃掉食物,那食物又该怎么吃,我们采用最简单的办法,直接将这个物体销毁,就能让我们的food看起来是被吃掉一样啦。
所以我们的代码设计思路是:在player与food发生碰撞时,利用触发检测,销毁掉食物,我们的吃小球方法就完成啦。代码如下。
具体的语法就不再详细解释啦,这里我们调用unity自带的方法OnTriggerEnter,在发生触发时,如果触发物体的标签是食物,就用Destory这一函数摧毁掉该物体。over~
在游戏中,还有一个相当重要的API,就是我们的main camera。它控制着我们进行游戏时的主视角,在这个游戏中,我们需要让我们的游戏物体始终处在视野*,于是我们又需要用新的脚本来控制我们的相机的移动。这里其实是一个很简单的数学算法,保证我们相机跟游戏物体的坐标相对不变,就可以实现让我们的player始终处在视野*。新建代码页,来控制我们主相机的跟随。
最后的部分,为了让我们的demo更像一个真正的游戏,我们给它添加两个UI文本,一个来显示分数,一个显示胜利条件。
代码如下。
至此,我们这个极简版的贪吃蛇demo就算完成啦。说难不难,但对于刚接触unity的同学来说,这种入门demo其实是很适合新手的。这也是本博主的第一个游戏demo,大喊一声:好耶!
也希望以后能做出更多更优质的demo,跟大家一起进步,干巴爹!