Unity拖尾组件现实Collider效果 TrailRenderer Collider

目录

 

1.实现思路

2.记录小球生成时间

3.设置小球

4.移动拖尾,动态计算

5.测试


1.实现思路

unity自带组件TrailRenderer不带Collider,如果想实现碰撞触发功能怎么实现呢

在拖尾移动时生成小球,用小球colliderr当做触发器,动态计算小球的存在时间,超时后销毁

2.记录小球生成时间

Point.cs记录小球生成时间,OnTriggerEnter内做触发处理

挂载到小球预设体上面

using UnityEngine;

public class Point : MonoBehaviour
{
    public float createTime;
    void OnTriggerEnter(Collider coll)
    {
            Debug.Log("Do something");
        if (coll.tag == "Fruit")
        {
            Debug.Log("Trail collider  Enter");
            //coll.GetComponent<Fruit>().OnHirt(50);
        }
    }
}

3.设置小球

勾选IsTrigger,变为触发器

取消勾选MeshRenderer,不显示小球;测试时可以显示,测试完成后取消勾选

4.移动拖尾,动态计算

本文用到了对象池,不用自行修改为GameObject.Instantiate、Destory

using UnityEngine;
using System.Collections.Generic;
using UnityEditor;

public class DrawTrailCollider : MonoBehaviour
{
    //拖尾特效持续时长
    public static float overTime = 0.2f;
    public List<Point> pointList = new List<Point>();
    private int maxPoints = 500;
    public int minPixelMove = 5;    // Must move at least this many pixels per sample for a new segment to be recorded
    public float distanceFromCamera = 5.0f;
    private Vector3 previousPosition;
    private int sqrMinPixelMove;
    private bool canDraw = false;

    void Start()
    {
        sqrMinPixelMove = minPixelMove * minPixelMove;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))//调试
        {
            EditorApplication.isPaused = true;
        }

        if (Input.GetMouseButtonDown(0))
        {
            previousPosition = Input.mousePosition;

            AddPoint(GetMousePos());
            canDraw = true;
        }
        else if (Input.GetMouseButton(0) && (Input.mousePosition - previousPosition).sqrMagnitude > sqrMinPixelMove && canDraw)
        {
            previousPosition = Input.mousePosition;
            AddPoint(GetMousePos());

            CheckOverTime();

            if (pointList.Count >= maxPoints)
            {
                canDraw = false;
            }
        }
        else
        {
            if (pointList.Count > 0)
            {
                CheckOverTime();
            }
        }
    }

    Vector3 GetMousePos()
    {
        var p = Input.mousePosition;
        p.z = distanceFromCamera;
        //Vector3 pos = XHSDK.XHSDKManager.Instance.mainCam.ScreenToWorldPoint(p);
        Vector3 pos = Camera.main.ScreenToWorldPoint(p);
        return pos;
    }

    /// <summary>
    /// 增加顶点
    /// </summary>
    public void AddPoint(Vector3 pos)
    {
        GameObject go = ObjectPool._instance.GetObject("Point", pos, Quaternion.identity);
        Point point = go.GetComponent<Point>();
        point.createTime = Time.realtimeSinceStartup;
        pointList.Add(point);
    }

    void CheckOverTime()
    {
        //移除超时的点
        for (int i = 0; i < pointList.Count; i++)
        {            
            if (Time.realtimeSinceStartup - pointList[i].createTime > overTime)
            {
                ObjectPool._instance.SetObjectToPool(pointList[i].gameObject);
                pointList.Remove(pointList[i]);
                i--;
            }
        }
    }
}

 

5.测试

测试基本可以达到想要的效果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack Yan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值