Unity behavior tree node development-character animation state control

Shown below Unity 行为树节点开发——角色动画状态控制.

using UnityEngine;
using MR_LBS.Client.Unity3D;
using System.Collections;
using System.Collections.Generic;
using Pathfinding;
using MR_LBS.Common;
using System;
using Random = UnityEngine.Random;

namespace BehaviorDesigner.Runtime.Tasks
{
    
    
    [TaskDescription("播放小怪物动画")]
    [TaskCategory("GC_YS")]
    [TaskIcon("Assets/MR_LBS/Behavior Designer Movement/Editor/Icons/mm.png")]
    public class SetMonsterAnim : Action
    {
    
    
        public SharedAnimalState state;
        public SharedBool isRandom;
        //public SharedBool includeBigSkill;

        public string stateP;
        public MonsterState monsterState;


        public SharedAnimalState minRandom;
        public SharedAnimalState maxRandom;

        MonsterControlBase monsterControl;
        BehaviorTree tree;
        int random;
        Monster monster;
        //技能数组池,用于伪随机技能
        List<int> list = new List<int>();

        public override void OnAwake()
        {
    
    
            monsterControl = gameObject.GetComponentInPorC<MonsterControlBase>();
            //Debug.Log(this.FriendlyName);
            tree = (BehaviorTree)base.Owner;
            monster = monsterControl.Monster_P;
            for (int i = 1; i < 11; i++)
            {
    
    
                list.Add(i);
            }
        }

        public override void OnStart()
        {
    
    
            //var fireTargetss = (SharedGameObject)tree.GetVariable("FireTarget");
            //Debug.Log(fireTargetss.Value.name + "1111");
            //skillGradesReturn = skillGradesGet;

            //if (FriendlyName == "BigSkill")
            //{
    
    
            //    ((SharedBool)tree.GetVariable("OnBigSkill")).Value = false;
            //    Debug.LogError("stop big skill!");
            //}
            if (!isRandom.Value)
            {
    
    
                monsterControl.PlayAnimation(state.Value);
                if (FriendlyName == "BigSkill")
                {
    
    
                    ((SharedBool)tree.GetVariable("OnBigSkill")).Value = false;
                    //Debug.LogError("stop big skill!");
                }
            }
            else
            {
    
    
                //休闲动画
                var fireTarget = (SharedGameObject)tree.GetVariable("FireTarget");
                if (fireTarget == null)
                {
    
    
                    Debug.Log("播放休闲动画");
                    random = UnityEngine.Random.Range((int)minRandom.Value, (int)maxRandom.Value + 1);
                    monsterControl.PlayAnimation((MonsterState)random);
                    return;
                }
                /*******/

                GameObject target = fireTarget.Value;

                if (target != null && target.GetComponent<Collider>().enabled)
                {
    
    
                    //Debug.Log("随机释放技能"+monster.Name);
                    if (monster.RareGrade == RareGrade.S)
                    {
    
    
                        //如果为Pet,不随机S技能
                        if (this.gameObject.layer == LayerMask.NameToLayer("Pet"))
                        {
    
    
                            //Debug.Log(this.gameObject.name+monster.State);
                            if (monster.State != MonsterState.SkillA && monster.State != MonsterState.SkillD && monster.State != MonsterState.SkillC && monster.State != MonsterState.SkillS)
                            {
    
    
                                //10次攻击,2次skill3,三次skill2,4次skill1,1次大招
                                if (list.Count == 0)
                                {
    
    
                                    for (int i = 1; i < 10; i++)
                                    {
    
    
                                        list.Add(i);
                                    }
                                }
                                random = Random.Range(0, list.Count);
                                if (8 <= list[random] && list[random] <= 9)
                                {
    
    
                                    monsterControl.PlayAnimation(MonsterState.SkillA);
                                    //Debug.Log("Pet 随机到了 A 技能");
                                }
                                else if (5 <= list[random] && list[random] <= 7)
                                {
    
    
                                    monsterControl.PlayAnimation(MonsterState.SkillC);
                                    //Debug.Log("Pet 随机到了 C 技能");
                                }
                                else
                                {
    
    
                                    monsterControl.PlayAnimation(MonsterState.SkillD);
                                    //Debug.Log("Pet 随机到了 D 技能");
                                }
                                list.RemoveAt(random);
                            }
                        }
                        //如果为Enemy,随机S技能
                        if (this.gameObject.layer == LayerMask.NameToLayer("Enemy"))
                        {
    
    
                            if (monster.State != MonsterState.SkillA && monster.State != MonsterState.SkillD && monster.State != MonsterState.SkillC && monster.State != MonsterState.SkillS)
                            {
    
    
                                //10次攻击,2次skill3,三次skill2,4次skill1,1次大招
                                if (list.Count == 0)
                                {
    
    
                                    for (int i = 1; i < 11; i++)
                                    {
    
    
                                        list.Add(i);
                                    }
                                }

                                random = Random.Range(0, list.Count);


                                if (8 <= list[random] && list[random] <= 9)
                                {
    
    
                                    monsterControl.PlayAnimation(MonsterState.SkillA);
                                }
                                else if (5 <= list[random] && list[random] <= 7)
                                {
    
    
                                    monsterControl.PlayAnimation(MonsterState.SkillC);
                                }
                                else if (list[random] == 10)
                                {
    
    
                                    //敌人大招在冷却时间内不能释放大招
                                    //if (monsterControl.bigSkillSign)
                                    //{
    
    
                                    //    Debug.Log("大招在冷却时间内!!!");
                                        monsterControl.PlayAnimation(MonsterState.SkillD);
                                    //}
                                    //else
                                    //    monsterControl.PlayAnimation(MonsterState.SkillS);
                                }
                                else
                                {
    
    
                                    monsterControl.PlayAnimation(MonsterState.SkillD);

                                }
                                list.RemoveAt(random);

                            }
                        }

                    }
                    else if (monster.RareGrade == RareGrade.A)
                    {
    
    
                        if (monster.State != MonsterState.SkillA && monster.State != MonsterState.SkillD && monster.State != MonsterState.SkillC)
                        {
    
    
                            //10次攻击,2次skill3,三次skill2,4次skill1,1次大招
                            if (list.Count == 0)
                            {
    
    
                                for (int i = 1; i < 10; i++)
                                {
    
    
                                    list.Add(i);
                                }
                            }

                            random = Random.Range(0, list.Count);


                            if (8 <= list[random] && list[random] <= 9)
                            {
    
    
                                monsterControl.PlayAnimation(MonsterState.SkillA);
                            }
                            else if (5 <= list[random] && list[random] <= 7)
                            {
    
    
                                monsterControl.PlayAnimation(MonsterState.SkillC);
                            }
                            else
                            {
    
    
                                monsterControl.PlayAnimation(MonsterState.SkillD);

                            }
                            list.RemoveAt(random);

                        }
                    }
                    else if (monster.RareGrade == RareGrade.B)
                    {
    
    
                        if (monster.State != MonsterState.SkillD && monster.State != MonsterState.SkillC)
                        {
    
    
                            //10次攻击,2次skill3,三次skill2,4次skill1,1次大招
                            if (list.Count == 0)
                            {
    
    
                                for (int i = 1; i < 8; i++)
                                {
    
    
                                    list.Add(i);
                                }
                            }

                            random = Random.Range(0, list.Count);


                            if (5 <= list[random] && list[random] <= 7)
                            {
    
    
                                monsterControl.PlayAnimation(MonsterState.SkillC);
                            }
                            else
                            {
    
    
                                monsterControl.PlayAnimation(MonsterState.SkillD);

                            }
                            list.RemoveAt(random);

                        }
                    }
                    else if (monster.RareGrade == RareGrade.C)
                    {
    
    
                        if (monster.State != MonsterState.SkillD && monster.State != MonsterState.SkillC)
                        {
    
    
                            //10次攻击,2次skill3,三次skill2,4次skill1,1次大招
                            if (list.Count == 0)
                            {
    
    
                                for (int i = 1; i < 8; i++)
                                {
    
    
                                    list.Add(i);
                                }
                            }
                            random = Random.Range(0, list.Count);
                            if (5 <= list[random] && list[random] <= 7)
                            {
    
    
                                monsterControl.PlayAnimation(MonsterState.SkillC);
                            }
                            else
                            {
    
    
                                monsterControl.PlayAnimation(MonsterState.SkillD);

                            }
                            list.RemoveAt(random);

                        }
                    }
                    else if (monster.RareGrade == RareGrade.D)
                    {
    
    
                        if (monster.State != MonsterState.SkillD)
                        {
    
    
                            monsterControl.PlayAnimation(MonsterState.SkillD);
                        }
                    }

                   
                }
                //目标为null时不能释放技能
                else
                {
    
    
                    random = Random.Range((int)minRandom.Value, (int)maxRandom.Value + 1);
                    //只播放休闲动画
                    if (random > 5)
                        monsterControl.PlayAnimation((MonsterState)random);
                }
            }
        }

       
        //播放过程中,running
        public override TaskStatus OnUpdate()
        {
    
    
            
            //stateP = /*GetComponent<MonsterControlBase>().Monster_P.State.ToString()*/ gameObject.name + "    " + GetComponent<MonsterControlBase>().GetType().ToString();
            monsterState = GetComponent<MonsterControlBase>().Monster_P.State;
            var fireTarget = (SharedGameObject)tree.GetVariable("FireTarget");
            //Debug.Log(fireTarget.Value.name + "22222");
            //如果在释放技能中 攻击对象消失或者死亡 或者 攻击对象身上的碰撞体处于 未启用状态 则返回状态成功
            //当前攻击目标为空有两种可能
            if (fireTarget == null || fireTarget.Value == null || !fireTarget.Value.GetComponentInChildren<Collider>().enabled)
            {
    
    
                //一种情况是目标是我杀死的,所以目标为空了,这种情况下就应该让我自然释放完技能进入冷却
                //当怪物杀死敌人并且技能放完后
                if ((int)tree.GetVariable("KillerUID").GetValue() ==
            gameObject.GetInstanceID() && (monster.State != MonsterState.SkillA || monster.State != MonsterState.SkillB ||
            monster.State != MonsterState.SkillC || monster.State != MonsterState.SkillD || monster.State != MonsterState.SkillS))
                {
    
    
                    //Debug.Log("I killed the target but now I can enter the idle state");
                    //对比完 UID 之后 要清除当前的记录
                    tree.SetVariableValue("KillerUID",0);
                    return TaskStatus.Success;
                }
                //如果怪物不是我杀死的则可以打断当前状态
                if ((int)tree.GetVariable("KillerUID").GetValue() !=
            gameObject.GetInstanceID() && (monster.State == MonsterState.SkillA || monster.State == MonsterState.SkillB ||
            monster.State == MonsterState.SkillC || monster.State == MonsterState.SkillD || monster.State == MonsterState.SkillS))
                {
    
    
                    return TaskStatus.Success;
                }
            }

            stateP = monster.State.ToString();

            switch (monster.State)
            {
    
    
                case MonsterState.SkillD:
                case MonsterState.SkillC:
                case MonsterState.SkillB:
                case MonsterState.SkillA:
                case MonsterState.SkillS:
                    //Debug.Log(monster.State);
                    //Debug.Log("Return running");
                    return TaskStatus.Running;
            }
            //Debug.Log("Return success");
            return TaskStatus.Success;
        }
    }
}

Guess you like

Origin blog.csdn.net/qq_43505432/article/details/111572258