在 AR 中的特定位置实例化一个对象(stationaryPrefab)。一旦发生,就会产生有限数量的对象(enemyPrefab)。 我希望他们做的是 - 非常缓慢地移向“stationaryPrefab”对象。
这是我已经完成的。实例化两种类型的对象。但当涉及到让这些游戏对象移动时,它似乎并没有真正起作用。这是我的第一个 Unity 项目,所以请不要因为这个凌乱的代码对我太严厉:
public class Spawner : MonoBehaviour
{
public GameObject enemyPrefab;
public GameObject stationaryPrefab;
public int maxEnemy = 5;
private GameObject[] enemies;
public float timeSpawn = 3f;
private float timer;
public float distance = 5;
public float speed;
private void Start()
{
timer = timeSpawn;
}
private void Update()
{
timer -= Time.deltaTime;
if (timer <= 0)
{
timer = timeSpawn;
if (transform.childCount < maxEnemy)
{
enemies.Append(Instantiate(enemyPrefab, UnityEngine.Random.insideUnitSphere * distance, Quaternion.identity, transform));
foreach (GameObject enemyInstance in enemies)
{
enemyInstance.transform.position = Vector3.MoveTowards(enemyInstance.transform.position, stationaryPrefab.transform.position, speed);
Console.Write(enemyInstance.name);
}
}
}
}
}
好吧,由于计时器检查,您只能在生成对象时移动对象。
您很可能希望将生成与运动分开:
private void Update()
{
timer -= Time.deltaTime;
if (timer <= 0)
{
timer = timeSpawn;
if (transform.childCount < maxEnemy)
{
enemies.Append(Instantiate(enemyPrefab, UnityEngine.Random.insideUnitSphere * distance, Quaternion.identity, transform));
}
}
foreach (GameObject enemyInstance in enemies)
{
enemyInstance.transform.position = Vector3.MoveTowards(enemyInstance.transform.position, stationaryPrefab.transform.position, speed * Time.deltaTime);
}
}
如果要在运行时追加对象,您还应该使用
List
而不是数组
我认为敌人在某些时候也会被摧毁,你也应该考虑使用其中一种
对象池 - 这意味着您并不总是使用
Instantiate
和 Destroy
,而只是禁用对象 (SetActive(false)
) 并在下一次生成时重新使用相同的实例。
或管理类型本身的现有实例,例如
public class Enemy : MonoBaheviour
{
private static readonly HashSet<Enemy> instances = new ();
public static IReadOnlyCollection<Enemy> Instances => instances;
private void Awake()
{
instances.Add(this);
}
private void OnDestroy()
{
instances.Remove(this);
}
}
这样您就可以随时访问所有现有实例/检查金额,而无需自己跟踪:
if (Enemy.Instances.Count < maxEnemy)
{
Instantiate(enemyPrefab, UnityEngine.Random.insideUnitSphere * distance, Quaternion.identity, transform);
}
foreach(var enemyInstance in Enemy.Instances)
{
enemyInstance.transform.position = Vector3.MoveTowards(enemyInstance.transform.position, stationaryPrefab.transform.position, speed * Time.deltaTime);
}