效果——拖尾效果

使用Trail Renderer组件实现

3d的拖尾暂时没用到

UI拖尾效果

业务逻辑:画面上有几个不同位置的UI,在同一时间,所有UI各放出一条光线汇聚到一个位置
思路:

  • 之前想用shader来实现,还没有好的思路
  • 偶然间看到Trail Renderer的效果,决定用这个来渲染在UI前来模拟。
    注意:
  1. 相机层级关系:需要把trail renderer渲染在UI之前。UI需要单独相机来渲染,trail renderer也用一个单独相机渲染,改变相机层级即可。
  2. 点位获取:UI位置直接使用ui的transform.position即可,是ui的世界坐标位置,然后设置好的挂有trail renderer组件的物体位置设为ui位置。以及一个目标位置。
  3. 路径绘制:这里我直接用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();
                //}
            });
        }
    }
}

你可以使用 Processing 中的 `lerp()` 函数来实现拖尾效果。具体实现方法如下: 1. 定义一个数组,用于存储路径上的点的位置信息。 2. 在 `draw()` 函数中,将当前位置信息加入数组中。 3. 使用 `lerp()` 函数计算每个点的位置,从而实现拖尾效果。 4. 在数组长度超过一定值时,删除数组中的第一个元素。 以下是一个简单的示例代码: ```java float[] pathX = new float[50]; // 存储路径上的点的 x 坐标 float[] pathY = new float[50]; // 存储路径上的点的 y 坐标 int pathIndex = 0; // 当前位置在数组中的索引 void setup() { size(600, 400); stroke(255); } void draw() { background(0); // 计算当前位置 float x = mouseX; float y = mouseY; // 将当前位置加入数组中 pathX[pathIndex] = x; pathY[pathIndex] = y; pathIndex++; // 绘制路径上的点 for (int i = 0; i < pathIndex; i++) { float alpha = map(i, 0, pathIndex, 0, 255); stroke(255, alpha); float px = lerp(pathX[i], pathX[pathIndex-1], 1.0/50*(pathIndex-i)); float py = lerp(pathY[i], pathY[pathIndex-1], 1.0/50*(pathIndex-i)); point(px, py); } // 当数组长度超过一定值时,删除数组中的第一个元素 if (pathIndex >= 50) { for (int i = 0; i < pathIndex-1; i++) { pathX[i] = pathX[i+1]; pathY[i] = pathY[i+1]; } pathIndex--; } } ``` 在这个示例代码中,我们使用了 `lerp()` 函数来计算路径上的每个点的位置,从而实现了拖尾效果。同时,我们限制了数组的长度为 50,当数组长度超过 50 时,删除数组中的第一个元素,以保证程序的运行速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值