Effect(三)—— fyLinkRibbon

本文介绍了一款名为fyLinkRibbon的Unity粒子系统组件,该组件用于创建动态的带状轨迹效果,如丝带飘动等。文章详细解释了如何通过设置参数来调整效果,并介绍了关键函数的功能及用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录为:Assets/Scripts/Effect/fyParticleSystem/目录下
fyLinkRibbon.cs

using UnityEngine;
using System.Collections.Generic;

[ExecuteInEditMode]
public class fyLinkRibbon: fyRibbonTrail
{
    //运动速度
    public float mSpeed = 1.0f;

    //目标对象
    public Transform target = null;

    //是否连接
    private bool bLink = false;

    //相机的Transform
    private Transform mCamerTrans;

    public fyLinkRibbon()
    {

    }

    //获取相机Transform
    public Transform GetCameraTrans()
    {
        if (mCamerTrans == null)
        {
            GameObject camera = GameObject.Find ("Main Camera");

            if (camera != null)
            {
                mCamerTrans = camera.transform;
            }
        }

        return mCamerTrans;
    }

    //继承下来
    public override void ReCreate()
    {
        base.ReCreate ();
        renderObj.name = "fyLinkRibbon";
    }

    //功能函数
    public void Link(Transform targetObj)
    {
        if (targetObj == null)
        {
            return;
        }

        //绑定目标物体
        target = targetObj;

        //距离过近,没法连接
        Vector3 sourcePos = source.position;
        Vector3 targetPos = target.position;

        float dist = Vector3.Distance (sourcePos, targetPos);
        //距离过近,返回
        if (dist > 0.00001f)
        {
            bLink = true;
        }
    }

    public override void UpdateRibbon(float deltaTime)
    {
        //未创建或者未连接
        if (!bCreated || !bLink || mMesh == null)
        {
            return;
        }

        Vector3 sourcePos = source.position;
        Vector3 targetPos = target.position;

        float length = Vector3.Distance (sourcePos, targetPos);

        Vector3 dir = targetPos - sourcePos;
        dir.Normalize ();

        Vector3 normal;
        //世界坐标朝向
        if (mOrientType == OrientType.World_Type)
        {
            mNormal.Normalize ();
            normal = mNormal;
        }
        //BillBoard朝向
        else if (mOrientType == OrientType.BillBoard_Type)
        {
            Transform trans = GetCameraTrans ();
            //朝向z轴
            Vector3 forward = trans.forward;

            //获得x轴方向
            Vector3 v1 = Vector3.Cross (forward, new Vector3 (0, 1, 0));
            normal = Vector3.Cross (v1, dir);
            normal.Normalize ();
        }

        //初始RibbonElement Pool
        elemPosPool = new Vector3[(maxElement + 1) * 2];
        elemUVPool = new Vector2[(maxElement + 1) * 2];

        float totalElemLength = maxElement * segLength;

        //真实最大长度
        float realLength = totalElemLength > length ? length : totalElemLength;

        //遍历修改数据点               
        for (int i = 0; i < elemPosPool.Length / 2.0f; i++)
        {
            float vLength;

            if (i * segLength > length)            
                vLength = length;            
            else
                vLength = i * segLength;

            Vector3 vPos = targetPos - dir * vLength;

            //垂直法向
            Vector3 vDir = Vector3.Cross(dir, mNormal);
            Vector3 p1 = vPos + vDir * segWidth / 2.0f;
            Vector3 p2 = vPos - vDir * segWidth / 2.0f;

            //转为局部坐标
            p1 -= sourcePos;
            p2 -= sourcePos;

            //重置顶点数据
            elemPosPool[i * 2] = p1;
            elemUVPool[i * 2] = new Vector2(1.0f - vLength / realLength, 1.0f);


            elemPosPool[i * 2 + 1] = p2;
            elemUVPool[i * 2 + 1] = new Vector2(1.0f - vLength / realLength, 0.0f);

        }



        mMesh.vertices = elemPosPool;
        mMesh.uv = elemUVPool;
        mMesh.colors = elemColorPool;

        //mMesh.RecalculateNormals();
        //mMesh.RecalculateBounds();
        //mMesh.Optimize();                   
    }

    public override void Reset()
    {
        base.Reset ();
        bLink = false;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值