拖尾效果

using System.Collections.Generic;
using UnityEngine;
class Wp
{
    public Vector3 point;
    public Vector3 upDir;
    public float time;
    public Wp()
    {

    }
    public Wp(Vector3 p, float t)
    {
        point = p;
        time = t;
    }
}

public class Tuowei : MonoBehaviour
{
    private List<Wp> sections = new List<Wp>();//光效点列表
    private Mesh mesh;
    public float time = 2.0f;
    public Color startColor = Color.white;
    public Color endColor = new Color(1, 1, 1, 0);
    private MeshRenderer meshRenderer;
    private Material trailMaterial;
    public float height = 2.0f;
    public bool isPlay = false;
    void Awake()
    {

        MeshFilter meshF = GetComponent(typeof(MeshFilter)) as MeshFilter;
        mesh = meshF.mesh;
        meshRenderer = GetComponent(typeof(MeshRenderer)) as MeshRenderer;
        trailMaterial = meshRenderer.material;


    }
    void Start()
    {

    }

    // 每帧进行显示更新
    void FixedUpdate()
    {
        if (isPlay)
        {
            Itterate(Time.time);
            UpdateTrail(Time.time);
        }
    }

    public void weStart()
    {
        isPlay = true;
    }

    public void weStop()
    {
        isPlay = false;
        ClearTrail();
    }

    public void Itterate(float itterateTime)
    { //记录拖尾点信息

        Vector3 position = transform.position;
        float now = itterateTime;

        // 将当前信息添加进列表
        if (sections.Count == 0 || (sections[0].point - position).sqrMagnitude > 0)
        {
            Wp section = new Wp();
            section.point = position;
            section.upDir = transform.TransformDirection(Vector3.up);//存入世界方向 
            section.time = now;
            sections.Insert(0, section);

        }
    }
    public void UpdateTrail(float currentTime)
    { // ** call once a frame **

        // 清空mesh显示
        mesh.Clear();
        //
        // 将超时点从列表移除
        while (sections.Count > 0 && currentTime > sections[sections.Count - 1].time + time)
        {
            sections.RemoveAt(sections.Count - 1);
        }
        // 两个点才能形成一个光效
        if (sections.Count < 2)
            return;
        //顶点 颜色 UV数组定义
        Vector3[] vertices = new Vector3[sections.Count * 2];
        Color[] colors = new Color[sections.Count * 2];
        Vector2[] uv = new Vector2[sections.Count * 2];
        //获取列表第一个点
        Wp currentSection = sections[0];
        //
        // 用矩阵代替transform 性能较高
        Matrix4x4 localSpaceTransform = transform.worldToLocalMatrix;
        // 设置 顶点 颜色 UV信息
        for (var i = 0; i < sections.Count; i++)
        {
            currentSection = sections[i];
            float u = 0.0f;
            if (i != 0)
                u = Mathf.Clamp01((currentTime - currentSection.time) / time);
            //
            // 获取朝向
            Vector3 upDir = currentSection.upDir;

            // 根据记录点 创建两个顶点
            vertices[i * 2 + 0] = localSpaceTransform.MultiplyPoint(currentSection.point);
            vertices[i * 2 + 1] = localSpaceTransform.MultiplyPoint(currentSection.point + upDir * height);

            uv[i * 2 + 0] = new Vector2(u, 0);
            uv[i * 2 + 1] = new Vector2(u, 1);

            // 计算插值颜色
            Color interpolatedColor = Color.Lerp(startColor, endColor, u);
            colors[i * 2 + 0] = interpolatedColor;
            colors[i * 2 + 1] = interpolatedColor;
        }

        // 创建三角形信息
        //      1---3---5
        //      |\  |\  |
        //      | \ | \ |
        //      |  \|  \|
        //      0---2---4
        int[] triangles = new int[(sections.Count - 1) * 2 * 3];
        for (int i = 0; i < triangles.Length / 6; i++)
        {
            triangles[i * 6 + 0] = i * 2;
            triangles[i * 6 + 1] = i * 2 + 1;
            triangles[i * 6 + 2] = i * 2 + 2;

            triangles[i * 6 + 3] = i * 2 + 2;
            triangles[i * 6 + 4] = i * 2 + 1;
            triangles[i * 6 + 5] = i * 2 + 3;
        }

        // 对mesh赋值
        mesh.vertices = vertices;
        mesh.colors = colors;
        mesh.uv = uv;
        mesh.triangles = triangles;
    }
    public void ClearTrail()
    {
        //清空显示对象
        if (mesh != null)
        {
            mesh.Clear();
            sections.Clear();
        }
    }
}


转自:http://www.lai18.com/content/1398005.html

posted @ 2017-09-12 16:31  LouisSong  阅读(349)  评论(0编辑  收藏  举报