2017-08-14 60 views
0

我有一个脚本,目前通过设置位置(点产卵)产生敌人。我想知道如何才能让它们在玩家距离产卵点不到50米时产卵。当玩家在周围时产生人工智能(Unity3d/C#)

漂移管理人:

public class WanderingManager : MonoBehaviour { 

    public Transform[] wanderingPoints; 

    void getNewPos(GameObject target){ 
     target.SendMessage("setNewWanderPos", wanderingPoints[Random.Range(0, wanderingPoints.Length)].position, SendMessageOptions.DontRequireReceiver); 
    } 
} 

敌人Manager脚本:

[RequireComponent(typeof运算(WanderingManager))]

public class EnemyManager: MonoBehaviour { 

    public int maxZombies = 7; 
    public float spawnInterval = 5.0f; 
    public string zombiesTag = "Zombie", playerTag = "Player"; 
    public GameObject[] ZombiePrefabs = null; 

    private GameObject player = null; 
    private ArrayList Zombies = new ArrayList(); 
    private float lastTime = -10.0f; 
    private bool loaded = false; 
    private WanderingManager manager; 
    void Start() { 
     manager = GetComponent<WanderingManager>(); 
     findPlayer(); 
    } 

    // Update is called once per frame 
    void LateUpdate() { 

     if(player == null && loaded){ 
      StartCoroutine(Restart()); 
     } 

     if(Time.time > lastTime){ 
      for(int i=0; i<Zombies.Count; i++){ 
       if(Zombies[i] == null){ 
        Zombies.RemoveAt(i); 
       } 
      } 

      if(Zombies.Count > maxZombies){ 
       Zombies.RemoveAt(Zombies.Count - 1); 
      }else{ 
       Transform point = manager.wanderingPoints[Random.Range(0, manager.wanderingPoints.Length)]; 
       GameObject Z = Instantiate(ZombiePrefabs[Random.Range(0, ZombiePrefabs.Length)], point.position, point.rotation * Quaternion.Euler(0.0f, Random.Range(0.0f, 180.0f), 0.0f)) as GameObject; 
       Zombies.Add(Z); 
      } 
      lastTime = Time.time + spawnInterval; 
     } 
    } 

    void findPlayer(){ 
     GameObject newPlayer = GameObject.FindWithTag(playerTag); 
     if(newPlayer != null && !newPlayer.name.Contains("Clone")){ 
      player = newPlayer; 
      loaded = true; 
     }else if(newPlayer != null && newPlayer.name.Contains("Clone")){ 
      Destroy(newPlayer); 
      retrySearch(); 
     } 
    } 

    void retrySearch(){ 
     findPlayer(); 
    } 

    IEnumerator Restart(){ 

     yield return new WaitForSeconds(10.0f); 

     SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); 
    } 
} 

任何帮助将不胜感激。谢谢!

回答

1

只做一次距离检查。像这样的:

if (Vector3.Distance(player.transform.position,enemySpawn.transform.position) < 50): 
{ 
    spawnEnemyLogic(); 
} 
+0

我不知道我怎么没有想到这一点。谢谢@oxrock! – papi

+0

如果你想节省一些CPU的电源,使用'if((player.transform.position - enemySpawn.transform.position).sqrMagnitude <50 * 50)'。 Vector3.Distance()使用一个'Mathf.Sqrt()',在这种情况下浪费了CPU的功率。 –