using System.Collections; using System.Collections.Generic; using UnityEngine; using Sirenix.OdinInspector; /// /// 地藏Boss类,继承于Enemy /// public class DiZang : Enemy { // _____ _ _ _ // | __ \ | | | (_) // | |__) | _| |__ | |_ ___ // | ___/ | | | '_ \| | |/ __| // | | | |_| | |_) | | | (__ // |_| \__,_|_.__/|_|_|\___| /// /// 攻击之间的间隔时间 /// [Header("攻击之间的间隔时间")][FoldoutGroup("地藏")] public float timeBetweenAttacks; /// /// 到底在上面还是下面生成爱欲品的玩家位置Y轴的界限 /// [Header("到底在上面还是下面生成爱欲品的玩家位置Y轴的界限")][FoldoutGroup("地藏")] public float aiYuPinBuildLimit; [Header("爱欲品怪物预制体")][FoldoutGroup("地藏")] public GameObject aiYuPin; /// /// 场景上方的落怪点组,用来召唤爱欲品 /// [Header("场景上方的落怪点组")][ListDrawerSettings][FoldoutGroup("地藏")] public List throwingPointGroupUp; /// /// 场景下方的落怪点组,用来召唤爱欲品 /// [Header("场景下方的落怪点组")][ListDrawerSettings][FoldoutGroup("地藏")] public List throwingPointGroupDown; /// /// 使用召唤爱欲品后有多少时间的后摇 /// [Header("使用召唤爱欲品后有多少时间的后摇")][FoldoutGroup("地藏")] public float CallAiYuPinEndTime; // _____ _ _ // | __ \ (_) | | // | |__) | __ ___ ____ _| |_ ___ // | ___/ '__| \ \ / / _` | __/ _ \ // | | | | | |\ V / (_| | || __/ // |_| |_| |_| \_/ \__,_|\__\___| private MoneyBox moneyBox; private delegate IEnumerator Action(); private enum PlayerState{上半,下半}; private MyPlayer player; /// /// 本次使用的落怪点位置组 /// [Header("本次使用的落怪点位置组")][ListDrawerSettings][FoldoutGroup("地藏")] [SerializeField][ListDrawerSettings][ReadOnly] private List throwingPointGroupUse; private Bell myBell; private DiZangsHadn myHand; // _____ _ _ ____ _ // / ____| | | | _ \ | | // | | __ _| | | |_) | __ _ ___| | __ // | | / _` | | | _ < / _` |/ __| |/ / // | |___| (_| | | | |_) | (_| | (__| < // \_____\__,_|_|_|____/ \__,_|\___|_|\_\ void Start(){ Init(); } // _ _ _ // | \ | | | | // | \| | ___ _ __ _ __ ___ __ _| | // | . ` |/ _ \| '__| '_ ` _ \ / _` | | // | |\ | (_) | | | | | | | | (_| | | // |_| \_|\___/|_| |_| |_| |_|\__,_|_| private void Init(){ //找到组件和物体 moneyBox = FindObjectOfType(); player = FindObjectOfType(); myBell = transform.Find("钟").GetComponent(); myHand = transform.Find("手").GetComponent(); //告诉钟自己是主人 myBell.owner = this; } /// /// 执行一次攻击 /// private new IEnumerator ATK(){ //等待攻击间隔 yield return new WaitForSeconds(timeBetweenAttacks); //决定行动 //如果有钱,则执行拿钱 if(moneyBox.hasMoney)StartCoroutine(TakeTheMoney()); else{ //否则,随机执行召唤或者敲钟 Action action = ((Random.Range(-1f,1f) > 0) ? (Action)RingTheBell : (Action)CallAiYuPin); StartCoroutine(action()); } } /// /// 召唤爱欲品的时候Call这个 /// private IEnumerator CallAiYuPin(){ Debug.Log("正在使用:召唤"); //确定玩家在上半边还是下半边 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(){ Debug.Log("正在使用:敲钟"); yield return new WaitForEndOfFrame(); myBell.ATK(player); } /// /// 拿钱的时候Call这个 /// private IEnumerator TakeTheMoney(){ yield return new WaitForEndOfFrame(); Debug.Log("正在使用:拿钱"); myHand.ATK(); } // ______ _ // | ____| | | // | |____ _____ _ __ | |_ // | __\ \ / / _ \ '_ \| __| // | |___\ V / __/ | | | |_ // |______\_/ \___|_| |_|\__| protected override void OnFindThePlayer(Transform target){ if(state == State.wander){ state = State.atk; StartCoroutine(ATK()); } } /// /// 攻击结束的时候触发,重新开始新一轮攻击 /// public void ATKEnd(){StartCoroutine(ATK());} }