【发布时间】:2019-05-07 22:30:43
【问题描述】:
我有这段代码,用来实例化一个精灵
AppleSpawner.cs
public class appleSpawner : MonoBehaviour
{
private int isRunning = 1;
private readonly int[] positions = { -10, -5, 0, 5, 10 };
public int NumberOfSeconds;
System.Random rand = new System.Random();
private void Update()
{
if (isRunning == 1) StartCoroutine(Wait());
}
public IEnumerator Wait()
{
int randomX = rand.Next(5);
isRunning = 0;
yield return new WaitForSeconds(NumberOfSeconds);
Instantiate(this, new Vector3(randomX, 5, 0), transform.rotation);
}
}
问题#1:这是在实例化新副本之间等待 X 秒的最佳/最简单方法吗?
我也有一个角色,有一个 oncollision 事件,如果它与其中一个副本发生冲突,它应该摧毁它。这很好用,问题是,如果我与最后生成的副本发生碰撞,它会破坏它,然后副本停止生成。
character.cs
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "apple")
{
Destroy(collision.gameObject);
points++;
text.text = "points: " + pont;
}
}
【问题讨论】:
-
您的播放器碰撞的每个对象似乎都是
AppleSpawner,是您的实例化的来源,而Character最终会破坏。如果您想继续生成对象,您可以实例化另一个名为Apple的类,而碰撞将破坏该类。 -
我真的不明白这一点(Unity 初学者)我正在破坏一个新复制的苹果精灵,不是吗?
-
在这种情况下,ApplySpawner 正在生成自己的实例,因此当最后一个实例被销毁时,它无法再次生成自己。将
Instantiate(this, new Vector3(randomX, 5, 0), transform.rotation);更改为this以外的其他值应该可以解决所有精灵都被销毁后的生成问题。 -
您正在销毁新复制的精灵,但这些副本是
AppleSpawner,如果它们是Apple或其他一些游戏对象,AppleSpawner不会受到Apple碰撞的影响 -
这可能是一个比硬编码游戏对象更好的选择,你可以有一个
public GameObject gObjToSpawn并传入你要生成的精灵游戏对象并在Instantiate(gObjToSpawn, new Vector3(randomX, 5, 0), transform.rotation);中使用它
标签: c# unity3d instantiation