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

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

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

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

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

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

EDIT1:

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

EDIT2:

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

【问题讨论】:

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

标签: unity3d 2d collision trail


【解决方案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;
        }
    }
}
  1. 检查是否在屏幕上绘制轨迹,如果没有,隐藏所有对撞机。

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

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

(如果不是所有轨迹都立即消失,您还可以添加 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 意思是生成具有静态位置作为玩家位置的圆形对撞机的想法。这些对撞机会随着时间的推移而减小它们的大小。这清楚吗?没有参考链接,这只是想法。谢谢。
  • 我的错 ;) 放大或缩小并没有真正帮助我猜。轨迹可能是任意抛物线
猜你喜欢
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多