public override BTNode Init() { base.Init(); animator = GetComponent<Animator>(); BTSelector root = new BTSelector(); BTActionDeath death = new BTActionDeath(gameObject); root.AddChild(death); //领地限制的分支,只能在该范围活动 BTConditionEvaluator evaluatorTerritory = new BTConditionEvaluator(BTLogic.And, false, BT.BTConditionEvaluator.ClearChildOpt.OnNotRunning); evaluatorTerritory.AddConditional(new BTCheckWithinDistance(_database.transform, territoryDis, null, BTCheckWithinDistance.DataOpt.FixedPosition), true); BTSimpleParallel goHome = new BTSimpleParallel(); { goHome.SetPrimaryChild(new BTActionCharacterMove(_database.transform, speed, 0.1f, null,BTActionMove.DataOpt.FixedPosition,BTActionMove.UsageOpt.Position, BTDataReadOpt.ReadEveryTick)); goHome.AddChild(new BTActionPlayAnimation(animator, "Walk")); } evaluatorTerritory.child = goHome; root.AddChild(evaluatorTerritory); BTConditionEvaluator evaluatorTarget = new BTConditionEvaluator(BTLogic.And, true, BT.BTConditionEvaluator.ClearChildOpt.OnNotRunning); evaluatorTarget.AddConditional(new BTCheckExistence(_database.transform, defendDis, "Player", BTCheckExistence.CheckOpt.CheckSphere)); //加一层组合,来判断进行哪个动作 BTSelector actionSelector = new BTSelector(); evaluatorTarget.child = actionSelector; //评估是否有碰撞 BTConditionEvaluator evaluatorCollision = new BTConditionEvaluator(BTLogic.And, true, BT.BTConditionEvaluator.ClearChildOpt.OnNotRunning); BTCheckCollision collision = new BTCheckCollision("Player", tolerance, BTCheckCollision.CheckOpt.RayCast); evaluatorCollision.AddConditional(collision); BTSequence attackSubtre = new BTSequence(); { attackSubtre.AddChild(new BTActionPlayAnimation(animator, "Attack")); } evaluatorCollision.child = attackSubtre; actionSelector.AddChild(evaluatorCollision); //没有碰撞则移动 BTSimpleParallel moveTo = new BTSimpleParallel(); { moveTo.SetPrimaryChild(new BTActionCharacterMove(_database.transform, speed, tolerance, target, BTDataReadOpt.ReadEveryTick)); moveTo.AddChild(new BTActionPlayAnimation(animator, "Walk")); } actionSelector.AddChild(moveTo); root.AddChild(evaluatorTarget); //Idle分支 BTActionPlayAnimation palyIdle = new BTActionPlayAnimation(animator, "Idle"); root.AddChild(palyIdle); return root; }
public override BTNode Init() { base.Init(); animator = GetComponent <Animator>(); BTSelector root = new BTSelector(); BTActionDeath death = new BTActionDeath(gameObject); root.AddChild(death); //领地限制的分支,只能在该范围活动 BTConditionEvaluator evaluatorTerritory = new BTConditionEvaluator(BTLogic.And, false, BT.BTConditionEvaluator.ClearChildOpt.OnNotRunning); evaluatorTerritory.AddConditional(new BTCheckWithinDistance(_database.transform, territoryDis, null, BTCheckWithinDistance.DataOpt.FixedPosition), true); BTSimpleParallel goHome = new BTSimpleParallel(); { goHome.SetPrimaryChild(new BTActionCharacterMove(_database.transform, speed, 0.1f, null, BTActionMove.DataOpt.FixedPosition, BTActionMove.UsageOpt.Position, BTDataReadOpt.ReadEveryTick)); goHome.AddChild(new BTActionPlayAnimation(animator, "Walk")); } evaluatorTerritory.child = goHome; root.AddChild(evaluatorTerritory); BTConditionEvaluator evaluatorTarget = new BTConditionEvaluator(BTLogic.And, true, BT.BTConditionEvaluator.ClearChildOpt.OnNotRunning); evaluatorTarget.AddConditional(new BTCheckExistence(_database.transform, defendDis, "Player", BTCheckExistence.CheckOpt.CheckSphere)); //加一层组合,来判断进行哪个动作 BTSelector actionSelector = new BTSelector(); evaluatorTarget.child = actionSelector; //评估是否有碰撞 BTConditionEvaluator evaluatorCollision = new BTConditionEvaluator(BTLogic.And, true, BT.BTConditionEvaluator.ClearChildOpt.OnNotRunning); BTCheckCollision collision = new BTCheckCollision("Player", tolerance, BTCheckCollision.CheckOpt.RayCast); evaluatorCollision.AddConditional(collision); BTSequence attackSubtre = new BTSequence(); { attackSubtre.AddChild(new BTActionPlayAnimation(animator, "Attack")); } evaluatorCollision.child = attackSubtre; actionSelector.AddChild(evaluatorCollision); //没有碰撞则移动 BTSimpleParallel moveTo = new BTSimpleParallel(); { moveTo.SetPrimaryChild(new BTActionCharacterMove(_database.transform, speed, tolerance, target, BTDataReadOpt.ReadEveryTick)); moveTo.AddChild(new BTActionPlayAnimation(animator, "Walk")); } actionSelector.AddChild(moveTo); root.AddChild(evaluatorTarget); //Idle分支 BTActionPlayAnimation palyIdle = new BTActionPlayAnimation(animator, "Idle"); root.AddChild(palyIdle); return(root); }
public void Init() { // 条件 BaseCondiction.ExternalFunc IsDeadFun = () => { if (mMonster.mRoleData.mHp <= 0) { return(true); } else { return(false); } }; var Alive = new PreconditionNOT(IsDeadFun, "活"); var Dead = new Precondition(IsDeadFun, "死"); BaseCondiction.ExternalFunc targetFun = () => { Role targetRole = mMonster.mRoleData.GetTargetRole(); if (targetRole) { return(targetRole.mBuffSystem.EnableSelect()); } else { return(false); } }; var hasTarget = new Precondition(targetFun, "发现目标"); var hasNoTarget = new PreconditionNOT(targetFun, "无目标"); BaseCondiction.ExternalFunc AtkRangeFun = () => { Role targetRole = mMonster.mRoleData.GetTargetRole(); if (targetRole) { float dis = Vector3.Distance(targetRole.transform.position, mMonster.transform.position); if (dis <= mMonster.mSkillInfo.mAtkDistance) { return(true); } else { if (dis > 5)//脱离目标 { mMonster.mRoleData.SetTargetRole(-1); } } } return(false); }; var AtkRange = new Precondition(AtkRangeFun, "在攻击范围内"); var NoAtkRange = new PreconditionNOT(AtkRangeFun, "超出攻击范围"); //BaseCondiction.ExternalFunc HpFun = () => { if (mMonster.mRoleData.mHp <= 50) return true; else return false; }; //var HPLess = new Precondition(HpFun, "快死"); //var HPMore = new PreconditionNOT(HpFun, "健康"); BaseCondiction.ExternalFunc CanMoveFun = () => { return(mMonster.mBuffSystem.CanMove()); }; var canMove = new Precondition(CanMoveFun, "能移动"); var cantMove = new PreconditionNOT(CanMoveFun, "不能移动"); BaseCondiction.ExternalFunc CanAtkFun = () => { return(mMonster.mBuffSystem.CanAtk()); }; var canAtk = new Precondition(CanAtkFun, "能攻击"); var cantAtk = new PreconditionNOT(CanAtkFun, "不能攻击"); //BaseCondiction.ExternalFunc EnableSelectFun = () => //{ // Role targetRole = mMonster.mRoleData.GetTargetRole(); // if (targetRole) // { // return targetRole.mBuffSystem.EnableSelect(); // } // return false; //}; //var enableSelect = new Precondition(EnableSelectFun, "能选"); ////var disableSelect = new PreconditionNOT(EnableSelectFun, "不能选"); //BT Tree mRoot = new BTSelector(); mRoot.name = "Root"; mRoot.Activate(); BTSequence DeadSeq = new BTSequence(); { DeadSeq.AddChild(Dead); // 死亡Action DeadSeq.AddChild(new BTActionWait(5)); DeadSeq.AddChild(new ReviveAction(mMonster)); mRoot.AddChild(DeadSeq); } BTSelector AliveSel = new BTSelector(); BTSequence AliveSeq = new BTSequence(); { AliveSeq.AddChild(Alive); AliveSeq.AddChild(AliveSel); mRoot.AddChild(AliveSeq); } BTSequence followSubtree = new BTSequence(); { followSubtree.AddChild(canMove); followSubtree.AddChild(hasTarget); followSubtree.AddChild(NoAtkRange); //followSubtree.AddChild(HPMore); // 追击Action followSubtree.AddChild(new FollowAction(mMonster)); AliveSel.AddChild(followSubtree); } BTSequence atkSeq = new BTSequence(); { atkSeq.AddChild(canAtk); atkSeq.AddChild(hasTarget); atkSeq.AddChild(AtkRange); //atkSeq.AddChild(HPMore); // 攻击Action atkSeq.AddChild(new AttackAction(mMonster)); atkSeq.AddChild(new BTActionWaitRandom(2.0f, 3.0f)); AliveSel.AddChild(atkSeq); } BTSequence patrolSeq = new BTSequence(); { patrolSeq.AddChild(canMove); patrolSeq.AddChild(hasNoTarget); patrolSeq.AddChild(new BTActionWaitRandom(1.0f, 5.0f)); // 巡逻Action patrolSeq.AddChild(new PatrolAction(mMonster)); AliveSel.AddChild(patrolSeq); } BTSequence IdleSeq = new BTSequence(); { IdleSeq.AddChild(hasNoTarget); // 休息Action IdleSeq.AddChild(new IdleAction(mMonster)); AliveSel.AddChild(IdleSeq); } //BTSequence runAwaySeq = new BTSequence(); //{ // runAwaySeq.AddChild(canMove); // runAwaySeq.AddChild(hasTarget); // runAwaySeq.AddChild(HPLess); // // 逃跑Action // runAwaySeq.AddChild(new RunAwayAction(mMonster)); // AliveSel.AddChild(runAwaySeq); //} }
public override BTNode Init() { _useAnimEvent = true; base.Init(); animator = GetComponent<Animator>(); characterController = GetComponent<CharacterController>(); BTSelector root = new BTSelector(); //键盘控制的分支 BTConditionEvaluator evaluatorKey = new BTConditionEvaluator(BTLogic.And, true, BT.BTConditionEvaluator.ClearChildOpt.OnNotRunning); evaluatorKey.AddConditional(new BTCheckKeyOrTouch(BTCheckKeyOrTouch.ActionExecution.None)); BTSimpleParallel translation = new BTSimpleParallel(); { translation.SetPrimaryChild(new BTActionTranslate(_database.transform, speed, BTDataReadOpt.ReadEveryTick)); //translation.AddChild(new BTActionPlayAnimation(animator, "run")); translation.AddChild(new BTActionAnimTransition(animator,"run",GlobalConfig.AC_STATE_Run,-1)); } evaluatorKey.child = translation; root.AddChild(evaluatorKey); //easyJoystick控制的分支 BTConditionEvaluator evaluatorJoystick = new BTConditionEvaluator(BTLogic.And, true, BT.BTConditionEvaluator.ClearChildOpt.OnNotRunning); evaluatorJoystick.AddConditional(new BTCheckEasyJoystick()); evaluatorJoystick.child = translation; root.AddChild(evaluatorJoystick); //easytouch控制的分支 BTConditionEvaluator evaluatorTouch = new BTConditionEvaluator(BTLogic.And, true, BT.BTConditionEvaluator.ClearChildOpt.OnNotRunning); evaluatorTouch.AddConditional(new BTCheckEasyTouch()); evaluatorTouch.AddConditional(new BTCheckWithinDistance(_database.transform, 1f, "TargetPositon", BTCheckWithinDistance.DataOpt.TouchPosition), true); BTSimpleParallel pathFind = new BTSimpleParallel(); { pathFind.SetPrimaryChild(new BTActionPathFind()); pathFind.AddChild(new BTActionAnimTransition(animator, "run", GlobalConfig.AC_STATE_Run, -1)); } evaluatorTouch.child = pathFind; root.AddChild(evaluatorTouch); //普通攻击的分支 BTConditionEvaluator evaluatorAttack = new BTConditionEvaluator(BTLogic.And, true, BT.BTConditionEvaluator.ClearChildOpt.OnNotRunning); evaluatorAttack.AddConditional(new BTCheckAttack(BTCheckAttackOpt.Common)); BTSimpleParallel catchSubtree = new BTSimpleParallel(); { catchSubtree.SetPrimaryChild(new BTActionAnimTransition(animator, "attack", GlobalConfig.AC_STATE_Atk)); var actionAttack = new BTActionAttack(gameObject, animator, "attack", new TrailEvent(0.35f, 0.51f)); actionAttack.SetAnimFramekEvent(0.5f, AttackMode.Single, 100); catchSubtree.AddChild(actionAttack); } evaluatorAttack.child = catchSubtree; root.AddChild(evaluatorAttack); //技能攻击的分支 BTConditionEvaluator evaluatorSkill = new BTConditionEvaluator(BTLogic.And, true, BT.BTConditionEvaluator.ClearChildOpt.OnNotRunning); evaluatorSkill.AddConditional(new BTCheckAttack(BTCheckAttackOpt.Skill_1)); BTSimpleParallel skillSubtree = new BTSimpleParallel(); { skillSubtree.SetPrimaryChild(new BTActionAnimTransition(animator, "attack_showoff", GlobalConfig.AC_STATE_JUGG_SKILL_Showoff)); var skillAttack = new BTActionAttack(gameObject, animator, "attack_showoff", new TrailEvent(0.35f, 1.3f)); skillAttack.SetAnimFramekEvent(0.6f, AttackMode.Circular, 150); skillAttack.SetAnimFramekEvent(1.0f, AttackMode.Circular, 150); skillSubtree.AddChild(skillAttack); } evaluatorSkill.child = skillSubtree; root.AddChild(evaluatorSkill); BTConditionEvaluator evaluatorSkill_2 = new BTConditionEvaluator(BTLogic.And, true, BT.BTConditionEvaluator.ClearChildOpt.OnNotRunning); evaluatorSkill_2.AddConditional(new BTCheckAttack(BTCheckAttackOpt.Skill_2)); BTSimpleParallel skill_2Tree = new BTSimpleParallel(); { skill_2Tree.SetPrimaryChild(new BTActionAnimTransition(animator, "attack_spin_odachi", GlobalConfig.AC_STATE_JUGG_SKILL_Spin,3)); var skillAttack = new BTActionAttack(gameObject, animator, "attack_spin_odachi", new TrailEvent(0.31f, 1.2f,3)); skillAttack.SetAnimFramekEvent(0.6f, AttackMode.Circular, 150); skillAttack.SetAnimFramekEvent(1.0f, AttackMode.Circular, 150); skill_2Tree.AddChild(skillAttack); } evaluatorSkill_2.child = skill_2Tree; root.AddChild(evaluatorSkill_2); //idle分支 BTActionPlayAnimation palyIdle = new BTActionAnimTransition(animator, "idle", GlobalConfig.AC_STATE_Idle,-1); root.AddChild(palyIdle); return root; }
public override BTNode Init() { _useAnimEvent = true; base.Init(); animator = GetComponent <Animator>(); characterController = GetComponent <CharacterController>(); BTSelector root = new BTSelector(); //键盘控制的分支 BTConditionEvaluator evaluatorKey = new BTConditionEvaluator(BTLogic.And, true, BT.BTConditionEvaluator.ClearChildOpt.OnNotRunning); evaluatorKey.AddConditional(new BTCheckKeyOrTouch(BTCheckKeyOrTouch.ActionExecution.None)); BTSimpleParallel translation = new BTSimpleParallel(); { translation.SetPrimaryChild(new BTActionTranslate(_database.transform, speed, BTDataReadOpt.ReadEveryTick)); //translation.AddChild(new BTActionPlayAnimation(animator, "run")); translation.AddChild(new BTActionAnimTransition(animator, "run", GlobalConfig.AC_STATE_Run, -1)); } evaluatorKey.child = translation; root.AddChild(evaluatorKey); //easyJoystick控制的分支 BTConditionEvaluator evaluatorJoystick = new BTConditionEvaluator(BTLogic.And, true, BT.BTConditionEvaluator.ClearChildOpt.OnNotRunning); evaluatorJoystick.AddConditional(new BTCheckEasyJoystick()); evaluatorJoystick.child = translation; root.AddChild(evaluatorJoystick); //easytouch控制的分支 BTConditionEvaluator evaluatorTouch = new BTConditionEvaluator(BTLogic.And, true, BT.BTConditionEvaluator.ClearChildOpt.OnNotRunning); evaluatorTouch.AddConditional(new BTCheckEasyTouch()); evaluatorTouch.AddConditional(new BTCheckWithinDistance(_database.transform, 1f, "TargetPositon", BTCheckWithinDistance.DataOpt.TouchPosition), true); BTSimpleParallel pathFind = new BTSimpleParallel(); { pathFind.SetPrimaryChild(new BTActionPathFind()); pathFind.AddChild(new BTActionAnimTransition(animator, "run", GlobalConfig.AC_STATE_Run, -1)); } evaluatorTouch.child = pathFind; root.AddChild(evaluatorTouch); //普通攻击的分支 BTConditionEvaluator evaluatorAttack = new BTConditionEvaluator(BTLogic.And, true, BT.BTConditionEvaluator.ClearChildOpt.OnNotRunning); evaluatorAttack.AddConditional(new BTCheckAttack(BTCheckAttackOpt.Common)); BTSimpleParallel catchSubtree = new BTSimpleParallel(); { catchSubtree.SetPrimaryChild(new BTActionAnimTransition(animator, "attack", GlobalConfig.AC_STATE_Atk)); var actionAttack = new BTActionAttack(gameObject, animator, "attack", new TrailEvent(0.35f, 0.51f)); actionAttack.SetAnimFramekEvent(0.5f, AttackMode.Single, 100); catchSubtree.AddChild(actionAttack); } evaluatorAttack.child = catchSubtree; root.AddChild(evaluatorAttack); //技能攻击的分支 BTConditionEvaluator evaluatorSkill = new BTConditionEvaluator(BTLogic.And, true, BT.BTConditionEvaluator.ClearChildOpt.OnNotRunning); evaluatorSkill.AddConditional(new BTCheckAttack(BTCheckAttackOpt.Skill_1)); BTSimpleParallel skillSubtree = new BTSimpleParallel(); { skillSubtree.SetPrimaryChild(new BTActionAnimTransition(animator, "attack_showoff", GlobalConfig.AC_STATE_JUGG_SKILL_Showoff)); var skillAttack = new BTActionAttack(gameObject, animator, "attack_showoff", new TrailEvent(0.35f, 1.3f)); skillAttack.SetAnimFramekEvent(0.6f, AttackMode.Circular, 150); skillAttack.SetAnimFramekEvent(1.0f, AttackMode.Circular, 150); skillSubtree.AddChild(skillAttack); } evaluatorSkill.child = skillSubtree; root.AddChild(evaluatorSkill); BTConditionEvaluator evaluatorSkill_2 = new BTConditionEvaluator(BTLogic.And, true, BT.BTConditionEvaluator.ClearChildOpt.OnNotRunning); evaluatorSkill_2.AddConditional(new BTCheckAttack(BTCheckAttackOpt.Skill_2)); BTSimpleParallel skill_2Tree = new BTSimpleParallel(); { skill_2Tree.SetPrimaryChild(new BTActionAnimTransition(animator, "attack_spin_odachi", GlobalConfig.AC_STATE_JUGG_SKILL_Spin, 3)); var skillAttack = new BTActionAttack(gameObject, animator, "attack_spin_odachi", new TrailEvent(0.31f, 1.2f, 3)); skillAttack.SetAnimFramekEvent(0.6f, AttackMode.Circular, 150); skillAttack.SetAnimFramekEvent(1.0f, AttackMode.Circular, 150); skill_2Tree.AddChild(skillAttack); } evaluatorSkill_2.child = skill_2Tree; root.AddChild(evaluatorSkill_2); //idle分支 BTActionPlayAnimation palyIdle = new BTActionAnimTransition(animator, "idle", GlobalConfig.AC_STATE_Idle, -1); root.AddChild(palyIdle); return(root); }