public override bool IsTrue(TBTWorkingData wData = null) { // 判断物体是否在视野范围内 BattleBehaviorWorkingData data = wData as BattleBehaviorWorkingData; AutoCastAbilityRequest request = data.request as AutoCastAbilityRequest; BattleUnit owner = data.owner; Unit target = request.target; // 目标是自己 if (target == owner) { return(true); } Ability ability = request.ability; float abilityRange = ability.GetCastRange(); // 全屏技能 if (abilityRange == -1) { return(true); } Vector2 ownerPos = owner.Get2DPosition(); Vector2 targetPos = target.Get2DPosition(); float distance = (targetPos - ownerPos).magnitude; //BattleLog.Log(string.Format("【CON_IsInAbilityRange】距离:{0},技能范围:{1}", distance, abilityRange)); return(distance <= abilityRange); }
public override bool IsTrue(TBTWorkingData wData) { BattleBehaviorWorkingData behaviorData = wData as BattleBehaviorWorkingData; BattleUnit source = behaviorData.owner; AutoCastAbilityRequest request = behaviorData.request as AutoCastAbilityRequest; Unit target = request.target; Ability ability = request.ability; //目标是自己,不用转身 if (target == source) { return(false); } AbilityBehavior abilityBehavior = ability.GetAbilityBehavior(); //无目标技能类型 if ((abilityBehavior & AbilityBehavior.ABILITY_BEHAVIOR_NO_TARGET) != 0) { //如果是线性或者扇形,虽然是无目标类型,也需要转向目标 if ((abilityBehavior & AbilityBehavior.ABILITY_BEHAVIOR_DIRECTIONAL) != 0 || (abilityBehavior & AbilityBehavior.ABILITY_BEHAVIOR_SECTOR_AOE) != 0) { return(true); } return(false); } return(true); }
protected override void onEnter(TBTWorkingData wData) { //BattleLog.Log("【NOD_MoveTo】onEnter"); BattleBehaviorWorkingData behaviorData = wData as BattleBehaviorWorkingData; BattleUnit source = behaviorData.owner; source.SetState(HeroState.MOVE); }
public override bool IsTrue(TBTWorkingData wData) { BattleBehaviorWorkingData behaviorData = wData as BattleBehaviorWorkingData; AutoCastAbilityRequest request = behaviorData.request as AutoCastAbilityRequest; //BattleLog.Log("【CON_CanCastAbility】能否施法:{0}", request.ability.IsCastable().ToString()); return(request.ability.IsCastable()); }
protected override void onEnter(TBTWorkingData wData) { //BattleLog.Log("【NOD_TurnTo】onEnter"); BattleBehaviorWorkingData behaviorData = wData as BattleBehaviorWorkingData; BattleUnit owner = behaviorData.owner; owner.SetState(HeroState.TURN); }
public override bool IsTrue(TBTWorkingData wData) { BattleBehaviorWorkingData data = wData as BattleBehaviorWorkingData; if (data.request != null && data.request.RequestType == RequestType.AutoCastAbility) { return(true); } return(false); }
protected override void onEnter(TBTWorkingData wData) { BattleLog.Log("【NOD_SetUnitIdle】onEnter"); BattleBehaviorWorkingData behaviorData = wData as BattleBehaviorWorkingData; BattleUnit source = behaviorData.owner; var request = behaviorData.request; source.SetState(HeroState.IDLE); request.isRequestCompleted = true; }
protected override void onEnter(TBTWorkingData wData) { BattleBehaviorWorkingData behaviorData = wData as BattleBehaviorWorkingData; BattleUnit source = behaviorData.owner; Ability ability = source.SelectCastableAbility(); BattleLog.Log("【NOD_CastAbility】onEnter {0}", ability.GetConfigName()); source.CastAbility(ability); }
public override bool IsTrue(TBTWorkingData wData) { BattleBehaviorWorkingData data = wData as BattleBehaviorWorkingData; //BattleLog.Log("【CON_IsChaseRequest】data:{0}", data.ToString()); if (data.request != null && data.request.RequestType == RequestType.Chase) { return(true); } return(false); }
protected override int onExecute(TBTWorkingData wData) { BattleBehaviorWorkingData behaviorData = wData as BattleBehaviorWorkingData; BattleUnit source = behaviorData.owner; Ability ability = source.SelectCastableAbility(); //BattleLog.Log("【NOD_CastAbility】castTime:{0},duringTime:{1}", ability.castTime, ability.GetCastleDuring()); if (ability.castTime >= ability.GetCastleDuring()) { return(TBTRunningStatus.FINISHED); } return(TBTRunningStatus.EXECUTING); }
public override bool IsTrue(TBTWorkingData wData = null) { // 判断物体是否在视野范围内 BattleBehaviorWorkingData data = wData as BattleBehaviorWorkingData; AIBehaviorRequest request = data.request; BattleUnit owner = data.owner; float viewRange = owner.GetViewRange(); Vector2 targetPos = request.target.Get2DPosition(); Vector2 ownerPos = owner.Get2DPosition(); float distanceSquare = (targetPos - ownerPos).magnitude; BattleLog.Log(string.Format("【CON_IsInRange】距离:{0},可见范围:{1}", distanceSquare, viewRange * viewRange)); return(distanceSquare <= viewRange * viewRange); }
protected override int onExecute(TBTWorkingData wData) { BattleBehaviorWorkingData behaviorData = wData as BattleBehaviorWorkingData; float deltaTime = behaviorData.deltaTime; BattleUnit source = behaviorData.owner; AIBehaviorRequest request = behaviorData.request; Unit target = request.target; Vector2 sourcePos = source.Get2DPosition(); Vector2 targetPos = target.Get2DPosition(); Vector2 sourceForward = source.Get2DForward(); Vector2 targetForward = (targetPos - sourcePos).normalized; float turnSpeed = source.GetTurnSpeed(); float angle = Vector2.Angle(targetForward, sourceForward); float radianToTurn = turnSpeed * deltaTime; //BattleLog.Log("【NOD_TurnTo】angle:{0},{1}", angle, radianToTurn * Mathf.Rad2Deg); if (angle < radianToTurn * Mathf.Rad2Deg) { source.Set2DForward(targetForward); GameMsg.instance.SendMessage(GameMsgDef.Hero_TurnTo2D, new HeorTurnEventArgs() { id = source.id, forward = targetForward, }); return(TBTRunningStatus.FINISHED); } // 叉积算出方向 unity是左手坐标系,所以反过来了 Vector3 cross = Vector3.Cross(targetForward, sourceForward); if (cross.z > 0) { radianToTurn = -radianToTurn; } Vector2 newForward = BattleMath.Vector2RotateFromRadian(sourceForward.x, sourceForward.y, radianToTurn); //BattleLog.Log("【NOD_TurnTo】自己朝向:{0} 目标朝向:{1} 相隔角度:{2} 旋转弧度:{3} 叉乘:{4} 新的朝向:{5}", sourceForward.ToString(),targetForward.ToString(), angle.ToString(),(radianToTurn * Mathf.Rad2Deg).ToString(), cross.ToString(), newForward.ToString()); source.Set2DForward(newForward); GameMsg.instance.SendMessage(GameMsgDef.Hero_TurnTo2D, new HeorTurnEventArgs() { id = source.id, forward = newForward, }); return(TBTRunningStatus.EXECUTING); }
public BattleUnit(int id, BattleCamp battleCamp, BattleProperty property) : base(id) { property.id = id; camp = battleCamp; m_Property = property; abilities = new List <Ability>(); m_abilityMap = new Dictionary <AbilityCastType, Ability>(4); m_HeroState = HeroState.IDLE; m_BehaviorTree = GetBehaviorTree(); m_DecisionTree = GetDecisionTree(); m_DecisionWorkData = new BattleDecisionWorkingData(this); m_BehaviorWorkData = new BattleBehaviorWorkingData(this); InitAbilities(); }
public override bool IsTrue(TBTWorkingData wData) { BattleBehaviorWorkingData behaviorData = wData as BattleBehaviorWorkingData; BattleUnit owner = behaviorData.owner; AIBehaviorRequest request = behaviorData.request; Unit target = request.target; Vector2 ownerPos = owner.Get2DPosition(); Vector2 targetPos = target.Get2DPosition(); Vector2 toForward = targetPos - ownerPos; Vector2 ownerForward = owner.Get2DForward(); float angle = Vector2.Angle(toForward, ownerForward); //BattleLog.Log("【CON_IsAngleNeedTurnTo】angle:{0}", angle); return(angle > 0.1f); }
protected override int onExecute(TBTWorkingData wData) { BattleBehaviorWorkingData behaviorData = wData as BattleBehaviorWorkingData; float deltaTime = behaviorData.deltaTime; BattleUnit source = behaviorData.owner; AIBehaviorRequest request = behaviorData.request; Unit target = request.target; Vector2 ownerPos = source.Get2DPosition(); Vector2 targetPos = target.Get2DPosition(); float attackRange = source.GetAttackRange(); float distance = (targetPos - ownerPos).magnitude; if (distance <= attackRange) { return(TBTRunningStatus.FINISHED); } float moveSpeed = source.GetMoveSpeed(); float detalTime = behaviorData.deltaTime; float toForwardX = (targetPos.x - ownerPos.x) / distance; float toForwardZ = (targetPos.y - ownerPos.y) / distance; float newPosX = ownerPos.x + detalTime * moveSpeed * toForwardX; float newPosZ = ownerPos.y + detalTime * moveSpeed * toForwardZ; source.Set2DPosition(newPosX, newPosZ); //BattleLog.Log("【NOD_MoveTo】移动速度:{0} 当前位置:{1},{2} 目标位置:{3},{4} newPosX:{5} newPosZ:{6}}", // moveSpeed.ToString(), ownerPos.x.ToString(),ownerPos.y.ToString(), targetPos.x.ToString(),targetPos.y.ToString() // ,newPosX.ToString(),newPosZ.ToString()); GameMsg.instance.SendMessage(GameMsgDef.Hero_MoveTo, new HeorMoveEventArgs() { id = source.id, targetPos = new Vector3(newPosX, 0, newPosZ), forward = new Vector3(toForwardX, 0, toForwardZ) }); return(TBTRunningStatus.EXECUTING); }