void UpdateAbilityMove() { if (waitForActMoveAbilityList.Count > 0) { if (curAbilityMoveData == null) { curAbilityMoveData = waitForActMoveAbilityList[0]; if (!curAbilityMoveData.isForce && lockMoving) { return; } destPos = curAbilityMoveData.AbilityDestPos; Vector3 rotation = curAbilityMoveData.faceToPos - this.transform.position; FaceToNoLerp(new Vector3(rotation.x, 0, rotation.z)); } if (!curAbilityMoveData.isForce && lockMoving || !curAbilityMoveData.CanStartMove) { return; } curAbilityMoveData.InitBeforeUse(); float curRushTime = Time.time - curAbilityMoveData.abilityStartTime; //Debug.LogWarning("当前帧技能移动开始: 移动前坐标 = " + transform.position + " , 目标点: = " + curAbilityMoveData.AbilityDestPos); if (curAbilityMoveData != null && (transform.position - curAbilityMoveData.AbilityDestPos).sqrMagnitude > 0.01f * 0.01f)//一定要以距离判断是否到位,而不能以时间判断。否则在帧率低的机器上极容易出现坐标错位导致很多bug by吴江 { if (curRushTime >= 0) { float rate = 1.0f; if (curAbilityMoveData.rushHoldTime > 0) { rate = Mathf.Min(1.0f, curRushTime / curAbilityMoveData.rushHoldTime); } transform.position = LineCast(Vector3.Lerp(curAbilityMoveData.startPos, curAbilityMoveData.AbilityDestPos, rate), IsDummy); Vector3 rotation = curAbilityMoveData.faceToPos - this.transform.position; FaceTo(new Vector3(rotation.x, 0, rotation.z)); positionDirty = true; } } else if (curRushTime >= curAbilityMoveData.rushHoldTime) { if (OnAbilityMoveEnd != null) { OnAbilityMoveEnd(curAbilityMoveData); } waitForActMoveAbilityList.RemoveAt(0); curAbilityMoveData = null; } } if (waitForActMoveAbilityList.Count <= 0) { StopMovingTo(); stateMachine.Send((int)EventType.PATHMOVE); } //Debug.LogWarning("当前帧技能移动结束: 移动后坐标 = " + transform.position); }
///// <summary> ///// 服务端通知被技能影响 by吴江 ///// </summary> ///// <param name="_info"></param> //public void UseAbility(AbilityResultInfo.AbilityInfluenceInfo _info) //{ // if (_info.abilityType != AbilityType.Normal) // { // StopMovingTo(); // waitForActMoveAbilityList.Add(new AbilityMoveData(_info, this.gameObject)); // stateMachine.Send((int)EventType.ABILITYMOVE); // if (_info.abilityType == AbilityType.STOP) // { // MYPOint clientCurPos = MYPOint.local2worldV3(transform.position); // float distance = Mathf.Max(Mathf.Abs(clientCurPos.x - _info.destPos.x / 1000.0f), Mathf.Abs(clientCurPos.y - _info.destPos.y / 1000.0f)); // if (distance > 1.0f) // { // transform.position = _info.destPos; // destPos = transform.position; // } // } // } //} /// <summary> /// 取消技能施放 by吴江 /// </summary> /// <param name="_needNoticeServer"></param> public void CancelAbility(bool _isPathMove = true) { waitForActMoveAbilityList.Clear(); curAbilityMoveData = null; if (_isPathMove) { stateMachine.Send((int)EventType.PATHMOVE); } else { stateMachine.Send((int)EventType.KEYBOARDMOVE); } }
public virtual void AbilityMoveEnd(AbilityMoveData _abilityMoveData) { }