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界面,所以小x,y这俩个角就不需要改变了。
产生完成以后,不要忘记把所产生物体的父对象设置为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 direction=0; //方向
private float M_time=0; //计时器
// 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_time>=1)
{
direction = Random.Range(-1, 2);
transform.Translate(transform.up * Speed/3 * Time.deltaTime);
}
//计数器的时间堆叠
M_time += Time.deltaTime;
}
}
注:相关时间变量的操作可以参照初识API这篇初始Unity-API