2017-08-14 14 views
0

現在、設定された位置で敵を生成するスクリプトがあります(ポイントスポーン)。私は、プレイヤーが例えばスポーンポイントから50メートル以内にいるときに、どうやってそれらをスポーンにすることができるのだろうと思っています。プレイヤーが周りにいるときにAIを生成する(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()'を1つ使用します。この場合、CPUパワーが無駄になります。 –

関連する問題