override public void OnEnter(PlayerState lastState) { base.OnEnter(lastState); IM.Vector3 dirPasserToCatcher = GameUtils.HorizonalNormalized(m_catcher.position, m_passer.position); if (m_bSendMsg) { m_player.forward = -dirPasserToCatcher; } m_player.m_enablePickupDetector = false; m_player.animMgr.GetRootMotion(m_curAction).Reset(); m_player.m_enableMovement = false; m_player.m_enableAction = false; PlayerAnimAttribute.AnimAttr animAttr = m_player.m_animAttributes.GetAnimAttrById(Command.Interception, m_curAction); if (animAttr == null) { Debug.LogError("Can not find animAttr: " + m_curAction); } PlayerAnimAttribute.KeyFrame keyFrame = animAttr.GetKeyFrame("OnBlock"); IM.Number frameRate = m_player.animMgr.GetFrameRate(m_curAction); m_fEventTime = keyFrame.frame / frameRate; IM.Vector3 ballPosWhenBlocked; if (!m_player.GetNodePosition(SampleNode.Ball, m_curAction, m_fEventTime, out ballPosWhenBlocked)) { Debug.LogError("Can not get bone position"); } Debugger.Instance.DrawSphere("block", (Vector3)ballPosWhenBlocked, Color.yellow); m_fActDistance = m_passer.m_speedPassBall * m_fEventTime; m_bOnEvent = false; m_bActing = false; m_cachedAction = m_curAction; m_curAction = ""; Debug.Log("animType: " + m_animType); ++m_player.mStatistics.data.interception; }
public bool CanIntercept(SkillInstance intercept, Player passer, Player catcher, out IM.Vector3 ballPosWhenIntercepted) { ballPosWhenIntercepted = IM.Vector3.zero; PlayerState.State curState = m_player.m_StateMachine.m_curState.m_eState; if (curState != State.eRun && curState != State.eStand && curState != State.eDefense && curState != State.eRush) { return(false); } IM.Vector3 dirPasserToCatcher = GameUtils.HorizonalNormalized(catcher.position, passer.position); IM.Vector3 dirOriginFace = m_player.forward; m_player.forward = -dirPasserToCatcher; string action = _ParseAction(intercept.curAction.action_id, intercept.matchedKeyIdx); PlayerAnimAttribute.AnimAttr animAttr = m_player.m_animAttributes.GetAnimAttrById(Command.Interception, action); if (animAttr == null) { Debug.LogError("Can not find animAttr: " + m_curAction); } PlayerAnimAttribute.KeyFrame keyFrame = animAttr.GetKeyFrame("OnBlock"); IM.Number frameRate = m_player.animMgr.GetFrameRate(action); IM.Number fEventTime = keyFrame.frame / frameRate; IM.Number fBallFlyDistance = passer.m_speedPassBall * fEventTime; IM.Number fDistPlayer2Passer = GameUtils.HorizonalDistance(passer.position, m_player.position); if (fDistPlayer2Passer < fBallFlyDistance) { m_player.forward = dirOriginFace; return(false); } if (!m_player.GetNodePosition(SampleNode.Ball, action, fEventTime, out ballPosWhenIntercepted)) { m_player.forward = dirOriginFace; return(false); } m_player.forward = dirOriginFace; return(true); }
public static IM.Number GetEventTime(Player player, string action) { string originAction = player.animMgr.GetOriginName(action); Dictionary <string, PlayerAnimAttribute.AnimAttr> rebounds = player.m_animAttributes.m_rebound; PlayerAnimAttribute.AnimAttr attr = null; if (!rebounds.TryGetValue(originAction, out attr)) { Debug.LogError("Can not find AnimAttr in clip: " + originAction); return(IM.Number.zero); } PlayerAnimAttribute.KeyFrame reboundFrame = attr.GetKeyFrame("OnRebound"); if (reboundFrame == null) { Debug.LogError("Can not find OnRebound key in clip: " + originAction); return(IM.Number.zero); } int reboundKey = reboundFrame.frame; return(reboundKey / player.animMgr.GetFrameRate(action)); }
void ReadAnimAttribute(XmlNode node) { Dictionary <string, PlayerAnimAttribute.AnimAttr> attrs = new Dictionary <string, PlayerAnimAttribute.AnimAttr>(); foreach (XmlNode animItem in node.ChildNodes) { PlayerAnimAttribute.AnimAttr animAttr = new PlayerAnimAttribute.AnimAttr(); XmlElement animItemElem = animItem as XmlElement; animAttr.strAnim = animItemElem.GetAttribute("name"); XmlNodeList lstNodes = animItemElem.SelectNodes("./KeyEvent"); animAttr.keyFrame = new List <PlayerAnimAttribute.KeyFrame>(); PlayerAnimAttribute.KeyFrame kf = new PlayerAnimAttribute.KeyFrame("null", 0); foreach (XmlNode keyEvent in lstNodes) { XmlElement keyEventElem = keyEvent as XmlElement; string id = keyEventElem.GetAttribute("id"); int frame = int.Parse(keyEventElem.GetAttribute("x")); if (id == "MoveToStartPos") { IM.Vector3 param = IM.Vector3.zero; XmlElement elem = keyEventElem.SelectSingleNode("./Param") as XmlElement; if (elem != null) { param = XmlUtils.XmlGetAttr_Vec3(elem); } kf = new PlayerAnimAttribute.KeyFrame_MoveToStartPos(id, frame, param); } else if (id == "OnLayupShot") { IM.Vector3 param = IM.Vector3.zero; XmlElement elem = keyEventElem.SelectSingleNode("./Param") as XmlElement; if (elem != null) { param = XmlUtils.XmlGetAttr_Vec3(elem); } kf = new PlayerAnimAttribute.KeyFrame_LayupShootPos(id, frame, param); } else if (id == "blockable") { int blockframe = 0; XmlElement elem = keyEventElem.SelectSingleNode("./Param") as XmlElement; if (elem != null) { blockframe = XmlUtils.XmlGetAttr_Int(elem, "x"); } kf = new PlayerAnimAttribute.KeyFrame_Blockable(id, frame, blockframe); } else if (id == "DefenderSpasticity") { int length = 0; XmlElement elem = keyEventElem.SelectSingleNode("./Param") as XmlElement; if (elem != null) { length = XmlUtils.XmlGetAttr_Int(elem, "x"); } kf = new PlayerAnimAttribute.KeyFrame_DefenderSpasticity(id, frame, length); } else if (id == "RotateToBasketAngle") { IM.Number angle = IM.Number.zero; XmlElement elem = keyEventElem.SelectSingleNode("./Param") as XmlElement; if (elem != null) { angle = XmlUtils.XmlGetAttr_Number(elem, "x"); } kf = new PlayerAnimAttribute.KeyFrame_RotateToBasketAngle(id, frame, angle); } else { kf = new PlayerAnimAttribute.KeyFrame(id, frame); } animAttr.keyFrame.Add(kf); } if (attrs.ContainsKey(animAttr.strAnim)) { Debug.LogError("AnimInfo same key: " + animAttr.strAnim); } attrs.Add(animAttr.strAnim, animAttr); } playerAttributes.animItemAttrs.Add(node.Name, attrs); }
override public void OnEnter(PlayerState lastState) { base.OnEnter(lastState); bool bFromPrepareShoot = lastState.m_eState == State.ePrepareToShoot; m_skillArea = m_match.mCurScene.mGround.GetArea(m_player); if (!bFromPrepareShoot) { if (lastState.m_eState == State.eRun || lastState.m_eState == State.eRush) { PlaySoundManager.Instance.PlaySound(MatchSoundEvent.RunToShoot); } IM.RootMotion rootMotion = m_player.animMgr.GetRootMotion(m_curAction); rootMotion.Reset(); IM.Vector3 dirPlayerToBasket = GameUtils.HorizonalNormalized(m_basket.m_vShootTarget, m_player.position); rootMotion.dirMove = dirPlayerToBasket; } if (m_curAction.Length == 0) { Debug.Log("no shoot animation."); } else { m_player.animMgr.Play(m_curAction, true); } m_ball.m_shootArea = (Area)m_curExecSkill.skill.area[0]; m_ball.m_ballState = BallState.eUseBall_Shoot; m_player.mStatistics.ReadyToCountShoot(); PlayerAnimAttribute.AnimAttr shootAttr = m_player.m_animAttributes.GetAnimAttrById(Command.Shoot, m_curAction); int iPrepareFrame = 0; PlayerAnimAttribute.KeyFrame prepareFrame = shootAttr.GetKeyFrame("OnPrepareToShoot"); if (prepareFrame != null) { iPrepareFrame = prepareFrame.frame; } IM.Number frameRate = m_player.animMgr.GetFrameRate(m_curAction); m_player.m_blockable.Init(shootAttr, frameRate, iPrepareFrame); if (m_skillArea == Area.eFar) { ++m_player.mStatistics.data.far_shoot; } else if (m_skillArea == Area.eNear) { ++m_player.mStatistics.data.near_shoot; } else if (m_skillArea == Area.eMiddle) { ++m_player.mStatistics.data.mid_shoot; } }
override public void OnEnter(PlayerState lastState) { base.OnEnter(lastState); m_skillArea = m_match.mCurScene.mGround.GetArea(m_player); m_bLeaveGround = false; m_movingTime = IM.Number.zero; m_bMoving = false; m_fFlyTimeOnAir = IM.Number.zero; PlayerAnimAttribute.AnimAttr dunkAttr = m_player.m_animAttributes.GetAnimAttrById(Command.Dunk, m_curAction); if (dunkAttr == null) { Debug.LogError("Current action: " + m_curAction + " in dunk id: " + m_curExecSkill.skill.id); } IM.Number frameRate = m_player.animMgr.GetFrameRate(m_curAction); m_player.m_blockable.Init(dunkAttr, frameRate); IM.RootMotion rootMotion = m_player.animMgr.GetRootMotion(m_curAction); rootMotion.Reset(); IM.Vector3 vPlayer2Basket = m_basket.m_vShootTarget - m_player.position; vPlayer2Basket.y = IM.Number.zero; IM.Vector3 dirPlayerToBasket = vPlayer2Basket.normalized; rootMotion.dirMove = dirPlayerToBasket; PlayerAnimAttribute.KeyFrame rotKeyFrame = dunkAttr.GetKeyFrame("RotateToBasket"); if (rotKeyFrame != null) { IM.Number fTimeFromRotateToBasket = rotKeyFrame.frame / frameRate; IM.Number fAngle = IM.Vector3.Angle(m_player.forward, dirPlayerToBasket); m_turningSpeed = IM.Math.Deg2Rad(fAngle) / fTimeFromRotateToBasket; m_rotateTo = RotateTo.eBasket; m_rotateType = RotateType.eSmooth; m_bMoveForward = false; } PlayerAnimAttribute.KeyFrame_MoveToStartPos kf_mts = dunkAttr.GetKeyFrame("MoveToStartPos") as PlayerAnimAttribute.KeyFrame_MoveToStartPos; IM.Vector3 vToBasketOffset = kf_mts.toBasketOffset; IM.Vector3 vRimHPos = m_basket.m_vShootTarget; vRimHPos.y = IM.Number.zero; m_movingTimeThreshold = kf_mts.frame / frameRate; m_vMovePos = -dirPlayerToBasket * vToBasketOffset.x + vRimHPos; IM.Vector3 vMovePos2Bakset = m_vMovePos - m_player.position; IM.Number fSameDir = IM.Vector3.Dot(vMovePos2Bakset, vPlayer2Basket); bool bRush = false; if (vPlayer2Basket.magnitude < vMovePos2Bakset.magnitude || fSameDir < IM.Number.zero || kf_mts.frame == 0) { m_speed = IM.Vector3.zero; bRush = false; } else { m_speed = (m_vMovePos - m_player.position) / (kf_mts.frame / frameRate); bRush = true; } ///// PlayerAnimAttribute.KeyFrame kf_dunk = dunkAttr.GetKeyFrame("OnDunk"); PlayerAnimAttribute.KeyFrame kf_leaveGround = dunkAttr.GetKeyFrame("OnLeaveGround"); IM.Vector3 vPosDunk, vPosLeaveGround; m_player.GetNodePosition(SampleNode.Root, m_curAction, kf_dunk.frame / frameRate, out vPosDunk); m_leaveGroundTime = kf_leaveGround.frame / frameRate; m_fFlyTimeOnAir = AnimationSampleManager.Instance.GetAnimData(m_curAction).duration - m_leaveGroundTime; m_player.GetNodePosition(SampleNode.Root, m_curAction, m_leaveGroundTime, out vPosLeaveGround); vPosLeaveGround = m_player.position + IM.Vector3.Dot(vPosLeaveGround, dirPlayerToBasket) * dirPlayerToBasket; vPosDunk = m_player.position + IM.Vector3.Dot(vPosDunk, dirPlayerToBasket) * dirPlayerToBasket; IM.Vector3 deltaDistance = vPosDunk - vPosLeaveGround; IM.Number fOrigDunkOffset = vToBasketOffset.x - deltaDistance.magnitude; IM.Number fPlayer2Basket = vPlayer2Basket.magnitude; IM.Number fDunkDist = fPlayer2Basket - fOrigDunkOffset; if (bRush) { rootMotion.scale = IM.Number.one; } else { if (fDunkDist > IM.Number.zero) { rootMotion.scale = IM.Math.Max(fDunkDist / deltaDistance.magnitude, new IM.Number(0, 200)); } else { rootMotion.scale = fPlayer2Basket / vToBasketOffset.x; } Debug.Log("scale: " + rootMotion.scale); } m_bRateFixed = false; _CalcDunkRate(); m_ball.OnBeginDunk(m_player); m_stateMachine.m_listeners.ForEach((PlayerStateMachine.Listener lsn) => { lsn.OnBeginDunk(m_player, kf_dunk.frame / frameRate); }); m_player.mStatistics.ReadyToCountShoot(); if (m_speed != IM.Vector3.zero) { m_bMoving = true; } GameSystem.Instance.mClient.mPlayerManager.IsolateCollision(m_player, true); m_player.animMgr.Play(m_curAction, !m_bMoving); bool defended = m_player.IsDefended(); if (m_skillArea == Area.eNear) { ++m_player.mStatistics.data.dunk_near_shoot; if (defended) { ++m_player.mStatistics.data.dunk_near_open_shoot; } } else if (m_skillArea == Area.eMiddle) { ++m_player.mStatistics.data.dunk_mid_shoot; if (defended) { ++m_player.mStatistics.data.dunk_mid_open_shoot; } } }
override public void OnEnter(PlayerState lastState) { base.OnEnter(lastState); m_skillArea = m_match.mCurScene.mGround.GetArea(m_player); m_movingTime = IM.Number.zero; m_bMoving = false; m_player.mStatistics.ReadyToCountShoot(); IM.RootMotion rootMotion = m_player.animMgr.Play(m_curAction, !m_bMoving).rootMotion; rootMotion.Reset(); PlayerAnimAttribute.AnimAttr layupAttr = m_player.m_animAttributes.GetAnimAttrById(Command.Layup, m_curAction); if (layupAttr == null) { Debug.LogError("Current action: " + m_curAction + " in layup, skill id: " + m_curExecSkill.skill.id); } IM.Number frameRate = m_player.animMgr.GetFrameRate(m_curAction); m_player.m_blockable.Init(layupAttr, frameRate); IM.Number fTimeFromRotateToBasket = new IM.Number(layupAttr.GetKeyFrame("RotateToBasket").frame) / frameRate; IM.Vector3 vPlayer2Basket = m_basket.m_vShootTarget - m_player.position; vPlayer2Basket.y = IM.Number.zero; IM.Vector3 dirPlayerToBasket = vPlayer2Basket.normalized; rootMotion.dirMove = dirPlayerToBasket; IM.Number fAngle = IM.Vector3.Angle(m_player.forward, dirPlayerToBasket); m_turningSpeed = IM.Math.Deg2Rad(fAngle) / fTimeFromRotateToBasket; m_rotateTo = RotateTo.eBasket; m_rotateType = RotateType.eSmooth; m_bMoveForward = false; PlayerAnimAttribute.KeyFrame_MoveToStartPos kf_mts = layupAttr.GetKeyFrame("MoveToStartPos") as PlayerAnimAttribute.KeyFrame_MoveToStartPos; IM.Vector3 vToBasketOffset = kf_mts.toBasketOffset; IM.Vector3 vRimHPos = m_basket.m_vShootTarget; vRimHPos.y = IM.Number.zero; m_vMovePos = -dirPlayerToBasket * vToBasketOffset.x + vRimHPos; //Debugger.Instance.DrawSphere("layup", m_vMovePos, 0.1f); m_movingTimeThreshold = kf_mts.frame / frameRate; IM.Vector3 vMovePos2Bakset = m_vMovePos - m_player.position; IM.Number fSameDir = IM.Vector3.Dot(vMovePos2Bakset, vPlayer2Basket); bool bRush = false; if (vPlayer2Basket.magnitude < vMovePos2Bakset.magnitude || fSameDir < 0 || kf_mts.frame == 0) { m_speed = IM.Vector3.zero; } else { m_speed = (m_vMovePos - m_player.position) / (kf_mts.frame / frameRate); bRush = true; } PlayerAnimAttribute.KeyFrame_LayupShootPos kf_layup = layupAttr.GetKeyFrame("OnLayupShot") as PlayerAnimAttribute.KeyFrame_LayupShootPos; PlayerAnimAttribute.KeyFrame kf_leaveGround = layupAttr.GetKeyFrame("OnLeaveGround") as PlayerAnimAttribute.KeyFrame; IM.Vector3 vPosLayup, vPosLeaveGround; m_player.GetNodePosition(SampleNode.Root, m_curAction, kf_layup.frame / frameRate, out vPosLayup); m_player.GetNodePosition(SampleNode.Root, m_curAction, kf_leaveGround.frame / frameRate, out vPosLeaveGround); if (vPosLayup == vPosLeaveGround) { Debug.LogError("PlayerState_Layup, vPosLayup equals vPosLeaveGround"); } //TODO 这段代码不知道什么意思,待探讨 //IM.Vector3 posLeaveGround = m_player.position + IM.Vector3.DotForNumber(vPosLeaveGround, dirPlayerToBasket) * dirPlayerToBasket; //IM.Vector3 posLayup = m_player.position + IM.Vector3.DotForNumber(vPosLayup, dirPlayerToBasket) * dirPlayerToBasket; IM.Number deltaDistance = (vPosLayup - vPosLeaveGround).magnitude; if (deltaDistance == IM.Number.zero) { Debug.LogError("PlayerState_Layup, DeltaDistance is 0."); } IM.Number fOrigLayupOffset = vToBasketOffset.x - deltaDistance; IM.Number fPlayer2Basket = vPlayer2Basket.magnitude; IM.Number fLayupDist = fPlayer2Basket - fOrigLayupOffset; if (bRush) { rootMotion.scale = IM.Number.one; } else { rootMotion.scale = IM.Math.Max(fLayupDist / deltaDistance, IM.Number.zero); } m_bRateFixed = false; _CalcLayupRate(); if (m_speed != IM.Vector3.zero) { m_bMoving = true; m_player.animMgr.GetPlayInfo(m_curAction).enableRootMotion = false; } GameSystem.Instance.mClient.mPlayerManager.IsolateCollision(m_player, true); if (m_skillArea == Area.eNear) { ++m_player.mStatistics.data.layup_near_shoot; } else if (m_skillArea == Area.eMiddle) { ++m_player.mStatistics.data.layup_mid_shoot; } }