代码之家  ›  专栏  ›  技术社区  ›  Bak Stak

Unity二维轨迹渲染器碰撞

  •  1
  • Bak Stak  · 技术社区  · 7 年前

    我制作二维统一游戏,但我面临着一个主要问题,这是我的游戏所依赖的。

    我在播放器上附加了一个轨迹渲染器组件,我需要的是使渲染器成为一个碰撞器,充当一个“网格碰撞器” MeshCollider I just not find out if i t is possible to make a collider to take the shape of a 2d trail renderer.

    我搜索过谷歌,但没有一个很好的解决方案:

    • 有人说创建一个空的游戏对象,连接轨迹渲染器组件,然后添加一个碰撞器。但这两者都不起作用。
    • 我尝试遵循 this wiki and my trail renderer collischeds but is not nice but I need to assign the tag to the trail too.

    我是否可以编写一些脚本来实现我的目标或 渲染解决方案。提前感谢。

    edit1:

    在我复制脚本并运行它之后,轨迹会发生碰撞,但当玩家不移动时,它会表现得很呆板。

    edit2:

    游戏基本上是一个具有 transform.position 等于鼠标位置的玩家。因此轨迹没有特定的长度。

    . 中桥对撞机 我只是不知道是否有可能让一个对撞机成为一个二维轨迹渲染器的形状。

    我搜索过谷歌,但没有一个性能良好的解决方案:

    enter image description here

    我能写一些剧本来实现我的目标吗? UnityEngine 有一个 呈现解决方案。提前谢谢。

    Eddi1:

    在我复制了脚本并运行它之后,轨迹会发生碰撞,但当玩家不移动时,它会表现得很呆板。

    编辑2:

    游戏基本上是一个 transform.position 等于鼠标位置,所以轨迹没有特定的长度。

    2 回复  |  直到 7 年前
        1
  •  3
  •   SpoocyCrep    7 年前

    我的方法如下:

    创建一个脚本并将其附加到跟踪的对象上。

    用轨迹大小的碰撞器创建一个空游戏对象的预设,并将其附加到脚本上。

    public TrailRenderer trail; //the trail
    public GameObject TrailFollower;
    public GameObject ColliderPrefab;
    

    创建一个碰撞器预制池(使用越多,成本越高,但越精确)。

    public int poolSize=5;
    GameObject[] pool;
    
    void Start()
    {
        trail = GetComponent<TrailRenderer>();
        pool = new GameObject[poolSize];
        for (int i = 0; i < pool.Length; i++)
        {
            pool[i] = Instantiate(ColliderPrefab);
        }
    }
    

    现在,在更新游戏时,您应该执行以下操作:

     void Update () {
        if (!trail.isVisible)
        {
            for (int i = 0; i < pool.Length; i++)
            {
                pool[i].gameObject.SetActive(false);
    
            }
        }
        else
        {
            TrailCollission();
        }
    
    }
    
    void TrailCollission()
    {
        for (int i = 0; i < pool.Length; i++)
        {
            if (pool[i].gameObject.activeSelf == false)
            {
                pool[i].gameObject.SetActive(true);
                pool[i].gameObject.transform.position = TrailFollower.gameObject.transform.position;
                return;
            }
        }
    }
    
    1. 检查是否在屏幕上绘制轨迹,否则隐藏所有碰撞器。

    2. 否则,在池子上跑,寻找隐藏的对撞机。

    3. 当发现隐藏的对撞机时,使其在轨迹游戏对象的位置上可见。

    (如果不是所有的轨迹都立即消失,您还可以添加IEnumerator,在需要的时间后隐藏它)。

    如果把游泳池的面积扩大,失踪的对撞机的可能性就会降低,你可以在那里玩到你找到适合你需要的东西为止。

    编辑:

    要使碰撞器在一段时间后隐藏,请执行以下操作:

    private IEnumerator hide(float waitTime, GameObject p)
    {
        while (true)
        {
            yield return new WaitForSeconds(waitTime);
            p.SetActive(false);
    
            yield break;
        }
        yield break;
    }
    

    设置好位置后调用

    hide(time,pool[i].gameObject);
    StartCoroutine(hide);
    
        2
  •  0
  •   Joe Bek    7 年前

    下面是另一个技巧,制作一个创建循环碰撞器的脚本( 梅比不是完美的,而是一个很好的解决方案 ;

    脚本将实例化循环碰撞器 gameObject 坚持其初始的实例化位置( 不改变位置 )放大和缩小圆对撞机 游戏对象 根据 TrailRenderer 检测仪中的宽度图,当其寿命等于 拖曳器 的一生。