예제 #1
0
    override public void OnEnter(AIState lastState)
    {
        arriveFirstTarget = false;
        if (makePolicyImmediately)
        {
            arriveFirstTarget     = true;
            makePolicyImmediately = false;
        }

        bool inTakeOver = false;

        if (m_player.m_inputDispatcher != null)
        {
            inTakeOver = m_player.m_inputDispatcher.inTakeOver;
        }
        bool isDefended = m_player.IsDefended(m_system.AI.devAngleAttacker, m_system.AI.devDistAOD);

        if ((m_match.mCurScene.mGround.GetArea(m_player) == Area.eNear || !isDefended) &&
            AIUtils.InAttackableDistance(m_match, m_player) && !inTakeOver && m_player.m_bWithBall)
        {
            m_moveTarget      = m_player.position;
            arriveFirstTarget = true;
        }
        else
        {
            if ((inTakeOver || stillTime > MAX_STILL_TIME) && isDefended && m_player.m_bWithBall)
            {
                m_moveTarget = GetPositionWithBall(true);
            }
            else if (positionForPR && m_ball.m_owner != null)
            {
                m_moveTarget = GetPositionForPickAndRoll();
            }
            else if (unreasonable)
            {
                IM.Vector3 target = m_match.mCurScene.mBasket.m_vShootTarget;
                target.y     = IM.Number.zero;
                m_moveTarget = target;
            }
            else
            {
                if (m_player.m_bWithBall)
                {
                    m_moveTarget = GetPositionWithBall();
                }
                else
                {
                    m_moveTarget = GetPositionWithOutBall();
                }
            }
        }

        lastPosition  = IM.Vector3.zero;
        stillTime     = IM.Number.zero;
        unreasonable  = false;
        positionForPR = false;
    }
예제 #2
0
    void _Attack()
    {
        if (!AIUtils.InAttackableDistance(m_match, m_player))
        {
            return;
        }

        IM.Number attackWeight = m_player.IsDefended(m_system.AI.devAngleAttacker, m_system.AI.devDistAOD) ? new IM.Number(15) : new IM.Number(100);
        AIUtils.AttackByPosition(m_player, attackWeight);
    }
예제 #3
0
    void Offense()
    {
        if (unreasonable)
        {
            if (m_player.CanLayup())
            {
                m_system.SetTransaction(AIState.Type.eLayup);
                Debug.LogError("Unreasonable layup.");
                return;
            }
        }

        if (!arriveFirstTarget)
        {
            return;
        }

        bool inTakeOver = false;

        if (m_player.m_inputDispatcher != null)
        {
            inTakeOver = m_player.m_inputDispatcher.inTakeOver;
        }

        bool isPvp = m_system.IsPvp;

        if (!inTakeOver)
        {
            if (!isPvp)
            {
                //进攻时间快结束了,投球
                if (m_match.IsFinalTime(new IM.Number(3) - m_system.AI.devTime))
                {
                    AIUtils.AttackByPosition(m_player, new IM.Number(100));
                    return;
                }
                //玩家要球,传给他
                Player mainRole = m_match.GetMainRole(m_player.m_roleInfo.acc_id);
                if (mainRole != null && mainRole.m_team == m_player.m_team && mainRole != m_player &&
                    mainRole.m_StateMachine.m_curState.m_eState == PlayerState.State.eRequireBall)
                {
                    AI_Pass pass = m_system.GetState(Type.ePass) as AI_Pass;
                    pass.m_toPass = mainRole;
                    m_system.SetTransaction(pass, new IM.Number(100));
                    return;
                }

                //进攻篮筐
                _Attack();
            }

            //传球
            Pass();

            if (!isPvp)
            {
                Area area = m_match.mCurScene.mGround.GetArea(m_player);
                if (area != Area.eNear) //非篮下区
                {
                    if (!inTakeOver)
                    {
                        //突破
                        CrossOver();
                        if (!AIUtils.InAttackableDistance(m_match, m_player))
                        {
                            m_system.SetTransaction(Type.ePositioning, new IM.Number(50), true);
                        }
                    }
                }
            }
        }
        else
        {
            m_system.SetTransaction(Type.ePositioning, new IM.Number(100), true);
        }
    }