前端时间对unity开发感兴趣,再加上自己有一些charp的基础。就有了入门游戏开发的想法,跟住siki学院的一个2d贪吃蛇项目做完了(一个17年的项目)。今天来做些总结,不然该忘完了。也是游戏全部写完了,但是临门一脚的时候误点了一个文件。报错也找不到解决想法,所以是没有成品图啦hh。
unity对我的感觉就是,api封装的非常好,一些基本的逻辑需要在代码端实现。而且在那里面,脚本也是一种组件可以拖拽到对象上面,同时脚本中声明的公共属性,也可以从对象中拖拽过来进行实现。
看一下这段代码。public int step,也就是贪吃蛇的步长,这个在unity界面中是可以直接修改的。包括这里面的所有public声明的属性都是可以在unity里面修改的。
GamObject就是对象啦。
unity中也有父子关系,实现的非常简单。把子对象拖到父对象里面就可以了,就像是文件夹的那种包含关系一样。值得一提的unity中父对象是通过transform来实现的
body.transform.SetParent(bodyholder, false);//这是一个给body设置bodyholder为父对象的例子。
同时transform也是管理对象坐标的,这是重中之重。我们知道游戏中物体的运动都离不开坐标熬。
因为script脚本是挂在在unity对象上的,挂上就意味着对象可以使用这些脚本中的方法。
脚本中有三个自带的很重要的函数。分别是
void Awake();//醒来,比start快
void Start();//开始,顾名思义开始执行就有的,一些属性的赋值可以在里面进行
void Update();//update也就是帧更新,默认是每秒60次,也就是60帧。用time.deltatime表示一帧,我们更好的执行帧更新。
InvokeRepeating("move", 0, velocity);这个函数是重复定时器,三个参数。第一个是方法也就是函数,没错unity里面调用函数直接“函数名”这样的,第二个参数是等待时间,0就表示马上开始定时器。velocity是自定义的常量,也就是定时器的间隔。这里是每隔0.05f触发一次定时时间。
public float velocity = 0.05f;
也有单次定时器
我们下面来看一个控制蛇移动的源码。
private Vector3 headPos;//Vector3是一个三维类型,里面记录了x,y,z这样一个三维坐标
public List<Transform> bodyList = new List<Transform>();//一个<Transform>类型的list数组
private void move()
{
private int x;
private int y;
headPos = gameObject.transform.localPosition;
gameObject.transform.localPosition = new Vector3(headPos.x+x,headPos.y+y,headPos.z);
if(bodyList.Count>0)
{
for(int i = bodyList.Count-2;i>=0;i--)
{
bodyList[i + 1].localPosition = bodyList[i].localPosition;
//后面的蛇身依次跟随
}
bodyList[0].localPosition = headPos;
}
}
这是一个实现按下空格使蛇身加速的功能,我们可以看到需要先取消定时器,再设置新的定时器。
if(Input.GetKeyDown(KeyCode.Space))
{
CancelInvoke();
InvokeRepeating("move", 0, velocity-0.2f);
}
另外我感觉x.GetComponent<xxx>()这个获取组件的函数真的是重中之重。
Random.Range(x, y)还有这个随机数生成函数,多用于游戏道具的一些随机掉落。