papi
papi

Reputation: 389

Spawn AI when player is around (Unity3d/C#)

I have a script that currently spawns enemies by set positions (point spawn). I am wondering how am I able to make them spawn ONLY when player is, for example, within 50 meters from spawn-point.

Wander Manager:

public class WanderingManager : MonoBehaviour {

    public Transform[] wanderingPoints;

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

Enemy Manager script:

[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);
    }
}

Any help will be appreciated. Thanks!

Upvotes: 0

Views: 113

Answers (1)

oxrock
oxrock

Reputation: 641

Just do a distance check. Something like this:

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

Upvotes: 1

Related Questions