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