首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在播放器存在时生成AI (Unity3d/C#)

在播放器存在时生成AI (Unity3d/C#)
EN

Stack Overflow用户
提问于 2017-08-15 07:33:12
回答 1查看 67关注 0票数 0

我有一个脚本,当前通过设置位置(点产卵)产生敌人。我在想,如果玩家距离产卵点不到50米,我怎么才能让它们产卵呢?

漫游管理器:

代码语言:javascript
复制
public class WanderingManager : MonoBehaviour {

    public Transform[] wanderingPoints;

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

敌方管理器脚本:

类型( RequireComponent (WanderingManager))

代码语言:javascript
复制
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);
    }
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-15 07:41:32

做个距离检查。如下所示:

代码语言:javascript
复制
if (Vector3.Distance(player.transform.position,enemySpawn.transform.position) < 50):
{
     spawnEnemyLogic();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45684505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档