Unity 2D 轨迹渲染器碰撞

Posted

技术标签:

【中文标题】Unity 2D 轨迹渲染器碰撞【英文标题】:Unity 2D Trail Renderer Collision 【发布时间】:2018-07-26 05:36:11 【问题描述】:

我正在制作 2D Unity 游戏,但我面临着我的游戏所依赖的一个主要问题。

我在我的播放器上附加了一个轨迹渲染器组件,我需要让渲染器成为一个碰撞器,充当一个 MeshCollider 我只是不知道是否可以制作一个碰撞器采用 2D 轨迹渲染器的形状。

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

有人说创建一个空的游戏对象附加轨迹渲染器组件,然后添加一个碰撞器。但也不起作用。 我尝试关注 this WIKI,但我的 Trail Renderer 发生碰撞,但效果不佳,但我也需要将标签分配给 trail。

我可以写一些脚本来实现我的目标吗?或者UnityEngine 有一个 渲染解决方案。提前致谢。

EDIT1:

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

EDIT2:

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

【问题讨论】:

wiki.unity3d.com/index.php/TrailRendererWith2DCollider @SpoocyCrep 我尝试了这个脚本,但正如我所提到的,它无法与我的游戏一起使用。 轨迹沿着你画的圆圈,对吗?轨迹在屏幕上显示多长时间? 好吧,我认为它不起作用,因为我将脚本分配给了播放器的一个空子对象,我将尝试将脚本分配给播放器,然后看看会发生什么 “创建一个空的游戏对象附加轨迹渲染器组件”是建议的方式,因为他们说唯一的渲染器应该是游戏对象上的轨迹渲染器 【参考方案1】:

我会这样做的方式如下:

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

创建一个空游戏对象的预制件,其中包含您的轨迹大小的碰撞器,并将其附加到脚本中。

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

创建一个collider prefab的池(使用越多越昂贵,但更准确。)

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;
        
    

    检查是否在屏幕上绘制轨迹,如果没有,隐藏所有对撞机。

    否则,在池中运行并搜索隐藏的对撞机。

    找到隐藏的对撞机后,使其在轨迹游戏对象的位置上可见。

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

通过使池变大,丢失对撞机的机会将降低,玩弄它直到找到适合您需要的东西。

编辑:

要让 Collider 在一段时间后隐藏,请执行以下操作:

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);

【讨论】:

我还是个 Unity 的初学者,所以 Pooling 对我来说是个新鲜事物解决方案。 这看起来很有意义,但在我的情况下,路径长度是可变的,所以我无法将 poolSize 设置为特定数字。 你能解释一下线索在你的游戏中是如何运作的吗?变量是什么意思? 很抱歉,这些问题对于我能够理解和帮助您很重要。你说轨迹没有固定长度,它还可以,并且可以预料,它会在多少时间后消失\它会自动消失吗? 游戏的概念是用鼠标移动你的玩家,如果敌人碰到你变化的尾巴就让他们被杀死。谢谢!【参考方案2】:

这是另一个技巧,可以创建一个创建圆形对撞机的脚本(Maybee 不是完美的,但一个很好的解决方案);

脚本将实例化圆形碰撞器gameObject,它坚持其初始实例化位置(不改变位置),根据TrailRenderer宽度放大和缩小圆形碰撞器gameObject图表在检查器中,当其生命周期等于TrailRenderer 的生命周期时,圆形对撞机将自行销毁。

【讨论】:

“这里是……”在哪里?我看不到任何链接 @canbax 意思是生成具有静态位置作为玩家位置的圆形对撞机的想法。这些对撞机会随着时间的推移而减小它们的大小。这清楚吗?没有参考链接,这只是想法。谢谢。 我的错 ;) 放大或缩小并没有真正帮助我猜。轨迹可能是任意抛物线

以上是关于Unity 2D 轨迹渲染器碰撞的主要内容,如果未能解决你的问题,请参考以下文章

unity编辑碰撞器不见

2D 对象碰撞 Unity

Unity -- Collider(碰撞器与触发器)

unity碰撞检测(碰撞器,触发器)

OpenGL-渲染流程

Unity3d -- Collider(碰撞器与触发器)