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;
}
}
}