首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单位二维航迹渲染器碰撞

单位二维航迹渲染器碰撞
EN

Stack Overflow用户
提问于 2018-07-26 05:36:11
回答 2查看 4K关注 0票数 3

我制作2D统一游戏,但我面临一个重大问题,我的游戏所依赖的。

我把一个轨迹渲染器组件附加到我的播放器上,我需要的是让渲染器成为一个对撞机,作为一个MeshCollider,我只是不知道是否有可能使对撞机以2D轨迹渲染器的形状出现。

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

  • 有人说,创建一个空的游戏对象,附加跟踪渲染器组件,然后向它添加一个对撞机。但也不起作用。
  • 我试图跟随这个WIKI和我的tried碰撞,但不是很好,但我也需要分配标记的线索。

是否有我可以编写的脚本来实现我的目标,或者UnityEngine预先有一个呈现solution.Thanks。

EDIT1:

在我复制了脚本并运行它之后,轨迹就会发生碰撞,但是当玩家不移动时,它会表现出愚蠢的行为。

EDIT2:

游戏基本上是一个玩家,它的transform.position等于鼠标的position.So,轨迹没有特定的长度。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-26 06:41:53

我这样做的方式如下:

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

使用对撞机创建一个空gameObject预制件,并将其附加到脚本中。

代码语言:javascript
复制
public TrailRenderer trail; //the trail
public GameObject TrailFollower;
public GameObject ColliderPrefab;

创建一个对撞机预制件池(您使用的越多,它就越昂贵,但更准确)。

代码语言:javascript
复制
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);
    }
}

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

代码语言:javascript
复制
 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,在所需的时间之后将其隐藏起来)。

通过使水池更大,丢失对撞机的机会就会降低,在你找到适合你需要的东西之前,你可以玩它。

编辑:

要让对撞机在一段时间后隐藏起来,请执行以下操作:

代码语言:javascript
复制
private IEnumerator hide(float waitTime, GameObject p)
{
    while (true)
    {
        yield return new WaitForSeconds(waitTime);
        p.SetActive(false);

        yield break;
    }
    yield break;
}

在设置好位置后调用这个

代码语言:javascript
复制
hide(time,pool[i].gameObject);
StartCoroutine(hide);
票数 3
EN

Stack Overflow用户

发布于 2018-07-26 07:45:43

这是另一个技巧,让脚本创建圆环对撞机(梅比不是完美的,而是一个很好的解决方案);

脚本将实例化附着在初始实例化位置(不改变位置)的圆环对撞机gameObject,根据检查器中的TrailRenderer宽度图放大和缩小圆环对撞机gameObject,当其寿命等于TrailRenderer的寿命时,圆环对撞机会自行销毁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51531677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档