Unity 2D Trail渲染器碰撞

时间:2018-07-26 05:36:12

标签: unity3d 2d collision trail

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

我在播放器上附加了一个路径渲染器组件,我需要使渲染器成为对撞机,充当 MeshCollider 我只是不知道是否有可能制造对撞机呈现2D Trail渲染器的形状。

我已经在Google上进行过搜索,但没有一个性能良好的解决方案:

  • 有人说创建一个空的游戏对象,将轨迹渲染器组件连接起来,然后向其添加碰撞器。但这也不行。
  • 我尝试遵循this WIKI,但我的Trail Renderer发生碰撞,但是效果不佳,但我也需要将标记分配给该足迹。

enter image description here

是否可以编写一些脚本来实现我的目标?或者UnityEngine有一个脚本 呈现解决方案。谢谢。

EDIT1:

我复制了脚本并运行它之后,步道发生碰撞,但是当玩家不移动时,它表现得很愚蠢。

EDIT2:

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

enter image description here

2 个答案:

答案 0 :(得分:3)

我的操作方式如下:

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

创建一个空白的gameObject预制件,并使其与路径的大小相撞,并将其附加到脚本中。

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. 当发现隐藏的对撞机时,它会在轨迹gameObject的位置上可见。

(如果并非所有线索都立即消失,您还可以添加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);

答案 1 :(得分:0)

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

脚本将实例化停留在其初始实例化位置(不更改位置)的圆形对撞机gameObject,并根据检查器中的gameObject宽度图,当对撞机的寿命等于TrailRenderer的寿命时,对撞机将自行破坏。