使用Trail Renderer组件实现
3d的拖尾暂时没用到
UI拖尾效果
业务逻辑:画面上有几个不同位置的UI,在同一时间,所有UI各放出一条光线汇聚到一个位置
思路:
- 之前想用shader来实现,还没有好的思路
- 偶然间看到Trail Renderer的效果,决定用这个来渲染在UI前来模拟。
注意:
- 相机层级关系:需要把trail renderer渲染在UI之前。UI需要单独相机来渲染,trail renderer也用一个单独相机渲染,改变相机层级即可。
- 点位获取:UI位置直接使用ui的transform.position即可,是ui的世界坐标位置,然后设置好的挂有trail renderer组件的物体位置设为ui位置。以及一个目标位置。
- 路径绘制:这里我直接用Dotween组件来移动生成的物体
代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class PathCalculate : MonoBehaviour
{
//发射光线的UI
public RectTransform[] tempObj;
//光线汇集目标位置
public RectTransform targetObj;
public Transform parentt;//trail Renderer所在父物体
public GameObject tempPrefab;//trail Renderer预制体
Tweener[] te;//所有光线的tweener
// Start is called before the first frame update
void Start()
{
te = new Tweener[tempObj.Length];
for (int i = 0; i < tempObj.Length; i++)
{
GameObject obj = Instantiate(Resources.Load("Line") as GameObject, tempObj[i].transform.position, Quaternion.Euler(Vector3.zero), parentt);
//每个光线加个偏移,看起来更散一点
Vector3 addPos = new Vector3(Random.Range(-10, 10), Random.Range(-10, 10), Random.Range(-10, 10));
int x = i;//避免i的引用问题
float time = 10;//动画时间
te[i] = obj.transform.DOLocalMove(targetObj.transform.position, time).OnUpdate(() =>
{
//速度越来越快
time -= Time.deltaTime;
if (time < 3)
time = 3;//最快速度
te[x].ChangeEndValue(targetObj.transform.position + addPos, time, true);
//结束条件
//if(time == 3)
//{
// te[x].Kill();
//}
});
}
}
}