using System.Collections; using System.Collections.Generic; using UnityEngine; using Sirenix.OdinInspector; /// /// 地藏Boss类,继承于Enemy /// public class DiZang : Enemy { // _____ _ _ _ // | __ \ | | | (_) // | |__) | _| |__ | |_ ___ // | ___/ | | | '_ \| | |/ __| // | | | |_| | |_) | | | (__ // |_| \__,_|_.__/|_|_|\___| /// /// 攻击之间的间隔时间 /// [Header("攻击之间的间隔时间")][FoldoutGroup("地藏")] public float timeBetweenAttacks; /// /// 塞钱箱 /// private MoneyBox moneyBox; private delegate IEnumerator Action(); private enum PlayerState{上半,下半}; private MyPlayer player; /// /// 到底在上面还是下面生成爱欲品的玩家位置Y轴的界限 /// [Header("到底在上面还是下面生成爱欲品的玩家位置Y轴的界限")] public float aiYuPinBuildLimit; /// /// 爱欲品小怪的预制体,召唤功能会用到 /// [Header("爱欲品怪物预制体")][FoldoutGroup("地藏")] public GameObject aiYuPin; /// /// 场景上方的落怪点,用来召唤爱欲品 /// [Header("场景上方的落怪点组")][ListDrawerSettings][FoldoutGroup("地藏")] public List throwingPointGroupUp; /// /// 场景下方的落怪点,用来召唤爱欲品 /// [Header("场景下方的落怪点组")][ListDrawerSettings][FoldoutGroup("地藏")] public List throwingPointGroupDown; /// /// 本次使用的落怪点位置组 /// private List throwingPointGroupUse; /// /// 使用召唤爱欲品后有多少时间的后摇 /// public float CallAiYuPinEndTime; private delegate void NullAction(); private void Init(){ moneyBox = FindObjectOfType(); player = FindObjectOfType(); } protected override void OnFindThePlayer(Transform target){ if(state == State.wander){ state = State.atk; StartCoroutine("ATK"); } } void Start(){ Init(); } private new IEnumerator ATK(){ //等待攻击间隔 yield return new WaitForSeconds(timeBetweenAttacks); //决定行动 //如果有钱,则执行拿钱 if(moneyBox.hasMoney)StartCoroutine(TakeTheMoney()); else{ //否则,随机执行召唤或者敲钟 Action action = ((Random.Range(-1f,0f) > 0) ? (Action)RingTheBell : (Action)CallAiYuPin); StartCoroutine(action()); } } /// /// 召唤爱欲品的时候Call这个 /// private IEnumerator CallAiYuPin(){ yield return new WaitForEndOfFrame(); //确定玩家在上半边还是下半边 PlayerState playerState = ((player.transform.position.y > aiYuPinBuildLimit) ? PlayerState.上半: PlayerState.下半); //根据玩家位置状态确定所用落怪位置组 throwingPointGroupUse = ((playerState == PlayerState.上半) ? throwingPointGroupUp : throwingPointGroupDown); //创建一个储存生成的爱欲品的列表,用于使他们在一段时间后开始Seek List aiYuPins = new List(); //遍历位置组 foreach(ThrowingPoint t in throwingPointGroupUse){ //生成一个爱欲品 AiYuPin temp =Instantiate( aiYuPin, t.transform.position,//在位置组中元素的位置 Quaternion.identity ).GetComponent(); //初始化爱欲品 //该状态为wander使其先保持不动 temp.state = State.wander; //修改爱欲品面部朝向 if(t.dir.x == -1) temp.transform.rotation = Quaternion.Euler( temp.transform.rotation.x, -180f, temp.transform.localScale.z ); //根据投掷点内信息给予爱欲品投掷速度 temp.GetComponent().velocity = t.dir * t.strength; //把这个爱欲品加入列表 aiYuPins.Add(temp); } //一段时间后,使他们开始Seek yield return new WaitForSeconds(0.8f); foreach(AiYuPin a in aiYuPins){ a.state = State.seek; } //等待攻击后摇结束 yield return new WaitForSeconds(CallAiYuPinEndTime); //发送信号,本次攻击宣告结束 ATKEnd(); } /// /// 敲钟的时候Call这个 /// private IEnumerator RingTheBell(){ yield return new WaitForEndOfFrame(); Debug.Log("地藏正在敲钟"); } /// /// 拿钱的时候Call这个 /// private IEnumerator TakeTheMoney(){ yield return new WaitForEndOfFrame(); Debug.Log("地藏正在拿钱"); } private void ATKEnd(){StartCoroutine(ATK());} }