我制作 2D unity 游戏,但我面临着我的游戏所依赖的一个主要问题。
我将一个轨迹渲染器组件附加到我的播放器上,我需要的是使渲染器成为一个碰撞器,充当MeshCollider我只是不知道是否可以使碰撞器呈现 2D 的形状轨迹渲染器。
我在谷歌上搜索过,但没有找到一个性能良好的解决方案:
我可以编写一些脚本来实现我的目标吗?或者Unity Engine有渲染方案吗?
在我复制脚本并运行它之后,轨迹会发生碰撞,但当玩家不移动时它会表现得很愚蠢。
游戏基本上是一个玩家的
transform.position
等于鼠标位置。所以轨迹没有特定的长度。
我的做法如下:
创建一个脚本并将其附加到跟踪所遵循的对象。
创建一个空游戏对象的预制件,其碰撞器大小与轨迹大小相同,并将其附加到脚本中。
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;
}
}
}
检查屏幕上是否绘制了轨迹,如果没有,则隐藏所有碰撞器。
否则,在池子上运行并搜索隐藏的对撞机。
(如果不是所有踪迹立即消失,您还可以添加 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);
这是另一个技巧,制作一个创建圆形碰撞器的脚本(也许不是完美的,但一个很好的解决方案);
脚本将实例化圆形碰撞器
gameObject
,并保持其初始实例化位置(不改变位置),根据检查器中的gameObject
宽度图放大和缩小圆形碰撞器TrailRenderer
,以及当圆形对撞机的生命周期等于 TrailRenderer
的生命周期时,它会自我毁灭。