AR 中的 MoveTowards 问题

问题描述 投票:0回答:1

在 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);
                }
            }
        }
        
    }
}
c# unity-game-engine augmented-reality vuforia
1个回答
0
投票

好吧,由于计时器检查,您只能在生成对象时移动对象。

您很可能希望将生成与运动分开:

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);
     }
    
© www.soinside.com 2019 - 2024. All rights reserved.