Unity Destroying Instantiated 克隆停止实例化
Unity Destroying Instantiated clone stops instantiating
我有这段代码,可以实例化一个精灵
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 来了:这甚至是 best/easiest 在实例化新副本之间等待 X 秒的方法吗?
我也有一个角色,有一个碰撞事件,如果它与其中一个副本发生碰撞,它应该摧毁它。这工作正常,问题是,如果我与 最后生成的副本 发生碰撞,它会破坏它,然后副本 停止生成 。
character.cs
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "apple")
{
Destroy(collision.gameObject);
points++;
text.text = "points: " + pont;
}
}
首先,创建一个名为 "Applespawner" 的新空游戏对象。把Applespawner.cs放进去。
改变这个
private void Update()
{
if (isRunning == 1) StartCoroutine(Wait());
}
到
private void Start()
{
if (isRunning == 1) StartCoroutine(Wait());
}
您在 Awake()
中将 isRunning
设置为 0,在 Update 函数中调用 IEnumerator 没有任何意义。
您应该将此行添加到您的 Applespawner.cs public GameObject Apple = null;
并将您的 Apple 预制件附加到编辑器中 Applespawner.cs 的 Apple 插槽。如果您不知道如何制作预制件,google它。
我认为有 2 种最好的方法可以每隔 X 秒启动一次游戏对象。
第一种方式
public IEnumerator Wait()
{
while(true){
yield return new Waitforseconds(X seconds);
Instantiate an object.
}
}
第二种方式
float spawnRate = 1f;
float nextTimeToSpawn = 0;
private void Update()
{
if (Time.time >= nextTimeToSpawn){
nextTimeToSpawn = Time.time + 1f / spawnRate;
//Spawn something
}
}
我个人更喜欢第二种方式。希望这会有所帮助。
不要将不同的职责混为一谈class。
它使您的代码 bug-prone 变得越来越难以维护,因为 class 变得越来越大。你应该有一个生成苹果的生成器,以及一个带有碰撞器的苹果预制件。两个不同的脚本。
public class Spawner : MonoBehaviour {
private static readonly int[] positions = { -10, -5, 0, 5, 10 };
public int NumberOfSeconds;
private System.Random rand = new System.Random();
public GameObject Prefab;
public IEnumerator Start() {
while (true) {
int randomX = positions[rand.Next(5)];
Instantiate(Prefab, new Vector3(randomX, 5, 0), transform.rotation);
yield return new WaitForSeconds(NumberOfSeconds);
}
}
}
具有该组件的对象在您的情况下不应该有碰撞器或精灵,因此它们永远不会在与玩家碰撞时被破坏。生成的预制件是玩家收集或避免的常规苹果。
由于生成器不会生成另一个生成器,我们将生成逻辑置于循环中。
您可能需要数组中的随机位置而不是原始随机数,所以我修复了它。
概括。
现在你的刷怪箱只有一个功能——刷怪。它不再与苹果绑定,所以你可以用另一个生成器生成胡萝卜。逻辑保持不变。
Start
中的魔法是什么?
您可以使 Start
成为协程。它的工作方式与任何其他协程一样:运行s 直到 yield return
、yield break
或函数结束。后两者结束协程,否则等待,然后继续运行ning。它比 Update
控制协同程序中的标志更好。
如果您需要一个每帧 运行 的脚本,请使用 Update
。
我有这段代码,可以实例化一个精灵
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 来了:这甚至是 best/easiest 在实例化新副本之间等待 X 秒的方法吗?
我也有一个角色,有一个碰撞事件,如果它与其中一个副本发生碰撞,它应该摧毁它。这工作正常,问题是,如果我与 最后生成的副本 发生碰撞,它会破坏它,然后副本 停止生成 。
character.cs
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "apple")
{
Destroy(collision.gameObject);
points++;
text.text = "points: " + pont;
}
}
首先,创建一个名为 "Applespawner" 的新空游戏对象。把Applespawner.cs放进去。
改变这个
private void Update()
{
if (isRunning == 1) StartCoroutine(Wait());
}
到
private void Start()
{
if (isRunning == 1) StartCoroutine(Wait());
}
您在 Awake()
中将 isRunning
设置为 0,在 Update 函数中调用 IEnumerator 没有任何意义。
您应该将此行添加到您的 Applespawner.cs public GameObject Apple = null;
并将您的 Apple 预制件附加到编辑器中 Applespawner.cs 的 Apple 插槽。如果您不知道如何制作预制件,google它。
我认为有 2 种最好的方法可以每隔 X 秒启动一次游戏对象。
第一种方式
public IEnumerator Wait() { while(true){ yield return new Waitforseconds(X seconds); Instantiate an object. } }
第二种方式
float spawnRate = 1f; float nextTimeToSpawn = 0; private void Update() { if (Time.time >= nextTimeToSpawn){ nextTimeToSpawn = Time.time + 1f / spawnRate; //Spawn something } }
我个人更喜欢第二种方式。希望这会有所帮助。
不要将不同的职责混为一谈class。
它使您的代码 bug-prone 变得越来越难以维护,因为 class 变得越来越大。你应该有一个生成苹果的生成器,以及一个带有碰撞器的苹果预制件。两个不同的脚本。
public class Spawner : MonoBehaviour {
private static readonly int[] positions = { -10, -5, 0, 5, 10 };
public int NumberOfSeconds;
private System.Random rand = new System.Random();
public GameObject Prefab;
public IEnumerator Start() {
while (true) {
int randomX = positions[rand.Next(5)];
Instantiate(Prefab, new Vector3(randomX, 5, 0), transform.rotation);
yield return new WaitForSeconds(NumberOfSeconds);
}
}
}
具有该组件的对象在您的情况下不应该有碰撞器或精灵,因此它们永远不会在与玩家碰撞时被破坏。生成的预制件是玩家收集或避免的常规苹果。
由于生成器不会生成另一个生成器,我们将生成逻辑置于循环中。
您可能需要数组中的随机位置而不是原始随机数,所以我修复了它。
概括。
现在你的刷怪箱只有一个功能——刷怪。它不再与苹果绑定,所以你可以用另一个生成器生成胡萝卜。逻辑保持不变。
Start
中的魔法是什么?
您可以使 Start
成为协程。它的工作方式与任何其他协程一样:运行s 直到 yield return
、yield break
或函数结束。后两者结束协程,否则等待,然后继续运行ning。它比 Update
控制协同程序中的标志更好。
如果您需要一个每帧 运行 的脚本,请使用 Update
。