moba类游戏开发日志(六)Monster的生成与移动

monster和我们控制的主角在本质上并没有什么区别,只不过主角的移动受我们玩家的控制,而monster算是“自由”的(笑)

因此我们可以类比主角的实例化,用近似的操作去实例化monster,或者直接将预制体拖进scene中

如果是只需要一只monster这种方法没有问题,但是如果我们需要简单的控制多只monster并且在固定位置生成,这种方法显然效率低下且在游戏一开始就会占用大量资源

为了解决这个问题,我开始想,既然单个monster我们可以传进去需要的transform以及prefab,那么对于多个monster可不可以给他们指定一个parent,然后大家都从parent上面get我们需要的参数

显然这种方法是可以的,但是如何指定每隔一段时间再生成monster呢?这里便需要引入协程了,具体生成monster的实现如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CreateSoldier : MonoBehaviour
{    
    [SerializeField]
    private GameObject soldierPrefab;

    [SerializeField]
    private Transform startTran;

    [SerializeField]
    private Transform soldierParent;
    bool isCreateSoldier = true;
    public int soldierCount = 2;

    [SerializeField]
    Transform[] towers;

    void Start()
    {
        // print(tower.position.x);
        // print(tower.position.y);
        StartCoroutine(Creat(0,1,5));
    }
    void CreateSmartSoldier(Transform startTRan,Transform[] towers)
    {
        GameObject obj = Instantiate(soldierPrefab,startTran.position,Quaternion.identity) as GameObject;
        obj.transform.parent = soldierParent;
        
        SmartSoldier soldier = obj.GetComponent<SmartSoldier>();
        soldier.towers = towers;
        // print(soldier.tower.position.x);
        // print(soldier.tower.position.y);
    }

    private IEnumerator Creat(float time,float delyTime,float spwanTime)
    {
        yield return new WaitForSeconds(time);
        while(isCreateSoldier)
        {
            for(int i = 0;i < soldierCount; i++)
            {
                CreateSmartSoldier(startTran,towers);
                yield return new WaitForSeconds(delyTime);
            }
            yield return new WaitForSeconds(spwanTime);
        }
    }
}

生成monster之后monster的一个简单的移动其实和角色移动控制没啥区别,这里就不说了,难点在于自动寻路与寻路-攻击-再寻路这一逻辑的实现,具体下次自己实现了再写