工程基于Unity learn的教程Ruby’s Adventure: 2D Beginner
https://learn.unity.com/project/ruby-s-2d-rpg?language=en
文章用于自己对学习内容进行梳理
Start及Awake
在开发中想实现一个按键投出投掷物的功能,首先在创造了一个投掷物的预设并加上了rigidbody,在给它添加向某个方向的force时需要获取到这个组件才能进行操作,一开始的写法是这样
/image-20200123160902109.png)
在prefab被实例化时调用start获取到上面的组件,但会有报错
/image-20200123161138003.png)
错误原因是在执行Launch时rigidbody2d并没有内容,因为unity在实例化一个物体时不会马上调用start方法,而是在下一帧开始调用。unity提供了一个Awake()方法,可以在物体被创建时马上调用,逻辑流程图如下
/image-20200123162343327.png)
测试:
/image-20200123162645252.png)
/image-20200123162711130.png)
可以看到执行顺序为OBJ被实例化以后先是执行了awake,然后执行了我们自定义的函数,最后才在第一次Update之前执行了start,一开始报错的原因就是因为自定义函数里面需要用到的对象并没有生成,故只需将初始化放入awake方法即可解决问题
设置两个layer不会相撞
当飞行物遇到敌人时,需要销毁飞行物并对敌人执行事件,可以通过碰撞箱的组件,来判断范围,并使用
/image-20200123163110755.png)
这个方法可以判断是否与其他的碰撞箱接触,但实际情况下角色本身也会有碰撞箱,如果飞行物从角色自身发出时就会碰到角色的碰撞箱而执行该方法,解决方法为可以在项目设置里修改两个对象所属的layer是否会发生碰撞判定
/image-20200123163611782.png)
虚拟摄像机的边界问题
使用vcam做主角的视野跟随时,如果想要不显示地图外,或者视角跟随想要到场景边界就停止,可以使用Cinemachine的一个拓展
/image-20200123164333931.png)
记得勾选Confine Screen Edges,实现原理为创建一个全场景大小的碰撞箱(需要注意的是目前碰撞仅支持Polygon Collider),同时要在项目设置中按上面的方法取消掉这个confinder层与其他层的碰撞,因为此时你的人物处于一个巨型的碰撞箱内,不取消碰撞的话会被推出地图外
静态变量
要想让一个方法变成任何脚本都能使用,可以使用static members,这个变量只有单独的一个内存,所以改变后所有使用该变量的obj里的内容都会改变,比如在A类里有一个static members B,其他脚本使用时直接可以用A.B来得到这个变量,现在我想设置一个人物的血条,当人物的血量变化时,调动血条obj的函数来改变血条的常数,故可用把血条的实例作为一个static members
/image-20200123170458701.png)
其他脚本中调用即可,注意要设置成public
/image-20200123170324366.png)