Exemple #1
0
    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);
    }
Exemple #2
0
    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);
    }
Exemple #3
0
        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());
    }
Exemple #5
0
    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;
    }
Exemple #8
0
    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);
    }
Exemple #9
0
    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);
    }
Exemple #10
0
    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);
    }
Exemple #11
0
    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);
    }
Exemple #12
0
    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);
    }
Exemple #15
0
        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);
        }