Unity-live2D 实战篇笔记(特效孵化器,特效自身移动脚本) Unity-live2D**概述**经过之前第一章的学习一些基础的关于live2D的操作学的差不多了然后跟着课程进入了第二章开始实战篇。就这里做个笔记吧。特效孵化器特效孵化器就是产生特效的游戏物体比如产生一些飘零的花瓣与心之类因为要产生特效所以自然要先将特效做成预制体放好。然后这个特效孵化器需要写一个孵化器脚本我们在脚本中用public去获取一下事先做好的预制体再获取一下canvas画布的Transform产生的特效一定要产生在canvas以下否则则显示不出来以方便后续的调用。代码演示如下public GameObject[] effectGos; //获取预制体放入数组 public Transform canvasTrans; //获取canvas的引用接下来我们需要写上一个新的方法作为产生特效的方法。由于产生的特效可能不止一种所以需要用到一个随机数的操作——Random.Range(,);这个随机数方法有俩个重载当使用int型重载时随机数不包含参数中第二个数而当使用float型时随机数包含第二个参数。用这个随机数作为特效数组下标来决定产生的特效是哪一个。产生特效所用的方法是Instantiate(,)第一个参数所生成游戏物体的原型体第二个参数所产生游戏物体的初始坐标第三个参数所产生游戏物体的初始旋转坐标这里第一个就放预制体数组中的某一个第二个直接写孵化器即脚本挂载物体的坐标transform.position就行了,第三个写孵化器的旋转坐标(transform.rotation);另外我们还需要对特效孵化器的孵化方向做随机调整以达到特效不在同一条直线运动的效果。这里用到一个方法——:Quaternion.Euler();参数为一个Vector3型的变量其三个参数分别代表三个角度用这个方放去给transform.rotation赋值即可改变方向为了让方向随机所以我们需要用随机数来做参数但由于是UI界面所以小xy这俩个角就不需要改变了。产生完成以后不要忘记把所产生物体的父对象设置为canvas;代码演示如下:private void CreateEffectGo() { //随机特效编号 int randomIndex Random.Range(0,2); //随机产生角度 transform.rotation Quaternion.Euler(new Vector3(0,0,Random.Range(0,45))); //特效的生成 GameObject effectGo Instantiate(effectGos[randomIndex],transform.position,transform.rotation); //特效设置父对象 effectGo.transform.SetParent(canvaTrans); }写完对应的产生方法以后自然不能忘记调用这里用到一个方法----InvokeRepeating(,);第一个参数是要调用的方法的名称第二个参数是首次调用的时间第三个参数是每隔多少秒调用一次。这个方法直接放在start里调用即可演示代码如下:void Start() { InvokeRepeating(CreateEffectGo,0,2); }特效自身的移动脚本先用public从外获取一个移速的值moveSpeed用来给有关移动坐标的方法去附上参数。再者由于这些特效不断产生所以肯定不能让它一直存在下去于是得有一个销毁代码这里直接用Destroy(,);。第一个参数所需要销毁的游戏物体第二个参数代码运行多少秒后销毁。写入start即可然后是最关键的移动代码这里使用transform.Translate();括号内写入移动速度的方向坐标参数即可这里需要再Unity中在先看看所需要移动的方向与特效自身坐标的方向关系比如需要向自身坐标的x轴方向移动则速度乘方向transform.right。如果要向其反方向移动则加上一个负号即可。做完以上内容之后特效会沿着直线运动不过有些不够绚烂接下来再添加一个可以让他进行曲线运动的代码。我们让物体在原方向移动的同时在Y方向transform.Translate相对应的方向参数为transform.up也获得一个速度并让其每隔一秒随机改变方向。要实现这些我们就需要一个计时器和随机数做方向改变当计时器的时间达到一秒后执行随机数改变方向并让计时器归零。并在update中调用transform.Translate,用transform.up与方向随机数的乘积作为方向用速度参数(moveSpeed)缩小一定比例作为速度大小,再乘上Time.deltaTime来平滑移动。演示代码如下public class E_move : MonoBehaviour { //特效自身的移动 public int Speed; //速度 private int direction0; //方向 private float M_time0; //计时器 // Use this for initialization void Start () { Destroy(gameObject, 10); } // Update is called once per frame void Update () { //初始直线移动 transform.Translate(-transform.right * Speed * Time.deltaTime); //据时间而随机改变的垂直向移动 if(M_time1) { direction Random.Range(-1, 2); transform.Translate(transform.up * Speed/3 * Time.deltaTime); } //计数器的时间堆叠 M_time Time.deltaTime; } }注相关时间变量的操作可以参照初识API这篇初始Unity-API

本月热点