//开始进行轻功移动 private void StartLightSkillMove(int nAnimID, Vector3 vecTargetPos) { IsLightState = true; m_fTotalLightHightRefix = 0.0f; //首先屏蔽掉NavMesh和胶囊碰撞 if (null != NavAgent && NavAgent.enabled) { NavAgent.enabled = false; } //面向目标点 FaceTo(vecTargetPos); //皆为直线运动,所以直接底层MoveTo即可 MoveTo(vecTargetPos, null, 0.0f); if (null != AnimLogic) { AnimLogic.Stop(); AnimLogic.Play(nAnimID); } if (null != ObjEffectController) { ObjEffectController.PlayEffect(GlobeVar.LIGHT_SKILL_EFFECT); } m_LightSkillTargetPos = vecTargetPos; //开启拖尾特效 //ShowLightShadowEffect(true); //主角的话播放音效 if (ObjType == Games.GlobeDefine.GameDefine_Globe.OBJ_TYPE.OBJ_MAIN_PLAYER) { if (null != GameManager.gameManager.SoundManager) { GameManager.gameManager.SoundManager.PlaySoundEffect(149); } //打开拖尾特效 if (null != ObjEffectController) { ObjEffectController.PlayEffect(GlobeVar.LIGHT_SKILL_TAIL); } } }
protected void UpdateLightSkill() { if (false == m_bIsLightState || m_LightSkillTargetPos == Vector3.zero) { return; } if (ObjTransform == null) { return; // 判空 } m_fMoveSpeed = BaseAttr.MoveSpeed; //如果在轻功过程中产生强制移动行为,则进行强制移动的Update,忽略轻功本身的路径 if (m_bTeleMoveInLight) { if (Vector3.Distance(m_vecLightTelePos, ObjTransform.position) <= 1.0f) { EndLightSkillMove(); m_bTeleMoveInLight = false; // 被击退情况结束了,置回来 } return; } //轻功结束 //if (Vector3.Distance(m_LightSkillTargetPos, ObjTransform.position) <= 2.0f) if (Vector2.Distance( new Vector2(m_LightSkillTargetPos.x, m_LightSkillTargetPos.z), new Vector2(ObjTransform.position.x, ObjTransform.position.z) ) <= 0.5f) { EndLightSkillMove(); } //进行高度修正,目前的轨迹是一条正弦曲线 if (m_fLightLastTime > 0.0f) { float timeElps = Time.time - m_fLightStartTime; if (timeElps <= m_fLightLastTime) { //float fAngle = (timeElps / m_fLightLastTime) * 3.1415f; //float fHeightRefix = Mathf.Cos(fAngle) * 0.1f; ////由于现在地表高度为精确高度,所以发现到达地面的时候则停止轻功 //if (fHeightRefix < 0.0f && ObjTransform.position.y < ActiveScene.GetTerrainPosition(ObjTransform.position).y) //{ // EndLightSkillMove(); //} ////if (ObjTransform.position.y + fHeightRefix < 8.0f) ////限制高度 //if (m_fTotalLightHightRefix >=3.0f && fHeightRefix>0) //{ // fHeightRefix = 0.0f; //} //else if (m_fTotalLightHightRefix < 1.0f && fHeightRefix < 0) //{ // fHeightRefix = 0.0f; //} //m_fTotalLightHightRefix += fHeightRefix; //ObjTransform.position = new Vector3(ObjTransform.position.x, ObjTransform.position.y + fHeightRefix, ObjTransform.position.z); if (m_fLightLastTime == 0) { m_fLightLastTime = 0.1f; // 判除零 } float fAngle = (timeElps / m_fLightLastTime) * 3.1415f; float fHeightRefix = Mathf.Sin(fAngle) * m_fLightWantHight; // 最高距离是3米 float old_offsety = m_fTotalLightHightRefix; m_fTotalLightHightRefix = fHeightRefix; float new_y = ObjTransform.position.y - old_offsety + m_fTotalLightHightRefix; // 当前位置,减去上次位置,加上这次位置 if (new_y < ActiveScene.GetTerrainPosition(ObjTransform.position).y) { // 如果算出来的位置小于地形高度,则是地形高度 new_y = ActiveScene.GetTerrainPosition(ObjTransform.position).y; } ObjTransform.position = new Vector3( ObjTransform.position.x, new_y, ObjTransform.position.z); } else { EndLightSkillMove(); } float fBeforeTime = 0.35f; if (ObjType == Games.GlobeDefine.GameDefine_Globe.OBJ_TYPE.OBJ_MAIN_PLAYER || ObjType == Games.GlobeDefine.GameDefine_Globe.OBJ_TYPE.OBJ_OTHER_PLAYER) { Obj_OtherPlayer _Player = this as Obj_OtherPlayer; if (_Player) { switch (_Player.Profession) { case (int)CharacterDefine.PROFESSION.SHAOLIN: fBeforeTime = 0.35f; break; case (int)CharacterDefine.PROFESSION.TIANSHAN: fBeforeTime = 0.35f; break; case (int)CharacterDefine.PROFESSION.XIAOYAO: fBeforeTime = 0.35f; break; case (int)CharacterDefine.PROFESSION.DALI: fBeforeTime = 0.35f; break; } } } if (AnimLogic != null && AnimLogic.CurAnimData != null) { // 判空 if (AnimLogic.CurAnimData.AnimID != (int)CharacterDefine.CharacterAnimId.LIGHTSKILLEND) { if (m_fLightLastTime - timeElps <= fBeforeTime || Vector3.Distance(m_LightSkillTargetPos, ObjTransform.position) <= 1.75f) { AnimLogic.Stop(); AnimLogic.Play((int)CharacterDefine.CharacterAnimId.LIGHTSKILLEND); } } } } //暂时屏蔽二段跳 //如果在轻功状态并且二段跳还未被激活,则判断是否可以进行二段跳跃 //if (!m_bIsLightSecondStepState && !m_bIsLightSecondStepActived) //{ // //激活二段跳(只能激活一次) // if (Vector3.Distance(m_LightSkillTargetPos, ObjTransform.position) <= 5.0f) // { // m_bIsLightSecondStepState = true; // m_bIsLightSecondStepActived = false; // } //} }
public void EndLightSkillMove() { if (false == m_bIsLightState || m_LightSkillTargetPos == Vector3.zero) { return; // 不能重复进入停止轻功 } //一旦进入End,则没有机会触发二段跳,重置所有标记位 m_bIsLightState = false; m_fMoveSpeed = 5.0f; //m_bIsLightSecondStepState = false; //m_bIsLightSecondStepActived = false; StopMove(); if (AnimLogic != null && AnimLogic.CurAnimData != null && AnimLogic.CurAnimData.AnimID != (int)CharacterDefine.CharacterAnimId.LIGHTSKILLEND) // TT 10240,修复落地动画播放不完全bug [12/16/2014 yuxiaoxi] { AnimLogic.Stop(); } //有可能在空中,所以要恢复一下 if (ObjTransform != null) { if (Mathf.Abs(ObjTransform.position.y - ActiveScene.GetTerrainPosition(ObjTransform.position).y) > 1.0f) { Vector3 pos = new Vector3(ObjTransform.position.x, ActiveScene.GetTerrainPosition(ObjTransform.position).y, ObjTransform.position.z); ObjTransform.position = pos; } try { // 尝试找一下跟目标点是否有路径,如果异常,就是发生了人在非行走区域,这时候,我要把人强制拽到目标点 NavMeshHit hit; bool bhit = NavMesh.SamplePosition(ObjTransform.position, out hit, 1f, 1); if (bhit == false) { // 经检查,玩家落点不在navmesh上,则射线发射出去到目标点找一个点,如果能找到,则使用找到的点,如果找不到,则直接目标点 bhit = NavMesh.SamplePosition(ObjTransform.position, out hit, 5f, 1); if (bhit == false) { // 5m检测没有找到,直接放到最终点,虽然可能闪,但是没问题 ObjTransform.position = new Vector3( m_LightSkillTargetPos.x, ActiveScene.GetTerrainPosition(m_LightSkillTargetPos).y, m_LightSkillTargetPos.z ); } else { // 找到了 ObjTransform.position = hit.position; } } } catch (System.Exception ex) { LogModule.ErrorLog("EndLightSkillMove System.Exception ex " + ex.ToString()); } finally { LogModule.ErrorLog("!!!!!!!EndLightSkillMove finally!!!!!!!!"); } } // begin 注意:m_LightSkillTargetPos是目标点,但是不是轻功的最终结束点,因为如果中途被减速,这个店并没有修正,所以下面一段代码不能执行 [12/27/2014 yuxiaoxi] //if (Vector3.Distance(ObjTransform.position, m_LightSkillTargetPos) >= 3.0f && // m_LightSkillTargetPos != Vector3.zero) //{ // 如果结束后的玩家坐标点和目标点差距太大,则直接拽到目标点 // ObjTransform.position = new Vector3( // m_LightSkillTargetPos.x, // ActiveScene.GetTerrainPosition(m_LightSkillTargetPos).y, // m_LightSkillTargetPos.z // ); // 既然结束了,强制设到目标点会有什么问题? //} // end [12/27/2014 yuxiaoxi] //恢复寻路和胶囊碰撞 if (NavAgent) { NavAgent.enabled = true; } m_LightSkillTargetPos = Vector3.zero; //开启拖尾特效 //ShowLightShadowEffect(false); //主角的话停止播放音效 if (ObjType == Games.GlobeDefine.GameDefine_Globe.OBJ_TYPE.OBJ_MAIN_PLAYER) { if (null != GameManager.gameManager.SoundManager) { GameManager.gameManager.SoundManager.StopSoundEffect(149); } //关闭拖尾特效 if (null != ObjEffectController) { ObjEffectController.StopEffect(GlobeVar.LIGHT_SKILL_TAIL); } } if (null != ObjEffectController) { ObjEffectController.StopEffect(GlobeVar.LIGHT_SKILL_EFFECT); } }