// 进入状态 public bool OnEnter(IntPtr lParam) { m_lastSyncTick = 0; tr = m_pFSM.transform; cmd_Entity_Change_State_WallWalking param = IntPtrHelper.toData <cmd_Entity_Change_State_WallWalking>(lParam); m_pFSM.enableCollider(false); m_pFSM.transform.eulerAngles = new Vector3(m_pFSM.transform.eulerAngles.x, param.faceDirection_y, m_pFSM.transform.eulerAngles.z); Vector3 faceDir = m_pFSM.transform.forward; faceDir.Normalize(); float posY = m_pFSM.transform.position.y; Vector3 wallCornerAPos = new Vector3(param.wallCornerAPos_x, posY, param.wallCornerAPos_z); Vector3 wallCornerBPos = new Vector3(param.wallCornerBPos_x, posY, param.wallCornerBPos_z); Vector3 wallCornerCPos = new Vector3(param.wallCornerCPos_x, posY, param.wallCornerCPos_z); Vector3 wallCornerDPos = new Vector3(param.wallCornerDPos_x, posY, param.wallCornerDPos_z); //Debug.Log("wall pos=" + wallCornerAPos.ToString() + wallCornerBPos.ToString() + wallCornerCPos.ToString() + wallCornerDPos.ToString()); //区域点输出规则: //飞檐走壁为一个cube,所以区域点为4个顶点的矩形 //取最短的边开始,顺时针或逆时针方向输出 //因此,AB CD为短边,BC为长边 Vector3 wallStartPos = (wallCornerAPos + wallCornerBPos) / 2.0f; Vector3 wallEndPos = (wallCornerCPos + wallCornerDPos) / 2.0f; float wallWidth = (wallCornerBPos - wallCornerAPos).magnitude; float wallLength = (wallCornerCPos - wallCornerBPos).magnitude; return(startWalkPos(wallStartPos, wallEndPos, wallWidth, wallLength, param.walkHeight, faceDir)); }
private bool m_bIgnoreSoliderController = false; //true是表示是被动的强制位移,无视SoliderController的StopMove之类的定身 public void ForceMove(cmd_force_move param) { Vector3 targetPos = new Vector3(param.fPosition_x, param.fPosition_y, param.fPosition_z); int moveTick = (int)param.fTime; //(int)(param.fTime * 1000); float fHeight = param.fHeight; m_tForceMoveTarget = null; m_bForceLockTarget = (param.nLockTarget == 1); m_fForceEndDistance = Mathf.Abs(param.fLocationDistance); if (param.uidTarget > 0) { U3D_Render.EntityView evDst = EntityFactory.getEntityViewByID(Convert.ToInt32(param.uidTarget)); if (evDst != null && evDst.gameObject) { m_tForceMoveTarget = evDst.gameObject.transform; } } if (m_pFSM.bNotMove || moveTick <= 0) { return; } m_bIgnoreSoliderController = (param.nPassive != 0); // 被动位移标识(0主动位移,不为0被动位移) if (m_pFSM.showLog) { Trace.Log(GameLogicAPI.getTickCount() + m_pFSM.gameObject.name + m_pFSM.transform.position + "ForceMove To" + targetPos.ToString() + "Tick=" + moveTick.ToString() + " Height=" + fHeight.ToString()); } bForceMoving = true; if (param.nMoveType == MOVE_TYPE.MOVE_CHARGE && param.fHeight > 1.0f) { param.fHeight = 0.0f; fHeight = 0.0f; if (!m_bDisableController) { m_bDisableController = true; Debug.Log("m_bDisableController = true;"); if (m_pFSM.getEntityState() != EntityState.Dead) { m_pFSM.enableCollider(false); } } } else { m_bDisableController = false; } m_nForceMoveStartTick = GameLogicAPI.getTickCount(); m_fForceStartPos = m_pFSM.transform.position; if (param.nLockTarget == 1 && m_tForceMoveTarget) { targetPos = m_tForceMoveTarget.position; } if (param.nLockTarget == 1 && m_tForceMoveTarget) { m_ForceMovePos = m_tForceMoveTarget.position; Vector3 moveDis = m_ForceMovePos - m_pFSM.transform.position; m_fForceMoveSpeed = moveDis.normalized * param.fSpeed; m_nForceMoveEndTick = m_nForceMoveStartTick + (uint)param.nLockTime; } else { m_ForceMovePos = targetPos; Vector3 moveDis = m_ForceMovePos - m_pFSM.transform.position; m_fForceMoveSpeed = moveDis / ((float)moveTick / 1000.0f); if (moveTick > param.fMaxTime) //(moveTick > param.fMaxTime*1000.0f) { moveTick = (int)param.fMaxTime; //(int)(param.fMaxTime * 1000.0f); } m_nForceMoveEndTick = m_nForceMoveStartTick + (uint)moveTick; } //Debug.Log(transform.name+"force targetid=" + param.uidTarget + "target=" + m_tForceMoveTarget + "nLockTarget=" + m_bForceLockTarget + "speed=" + param.fSpeed); //Debug.Log("m_ForceMovePos=" + m_ForceMovePos + "m_fForceMvoeSpeed=" + m_fForceMoveSpeed + "lockTime=" + param.nLockTime); if (fHeight > 0.01f && moveTick > 0) { //moveDis.y = 0; float flyTime = moveTick / 1000.0f / 2.0f; float g = 2.0f * fHeight / (flyTime * flyTime); m_fFlightV0 = Mathf.Sqrt(2.0f * fHeight * g); upAcc = g - m_pFSM.currentGravity; downAcc = g - m_pFSM.currentGravity; m_fFlightVel = m_fFlightV0; m_uResidenceStopTick = 0; m_uResidenceTick = 0; m_fFlightHeight = fHeight; m_flightStartPosition = m_pFSM.transform.position; if (bForceFlighting == false) { m_flightEndPosition = m_pFSM.transform.position; } //if (showLog) //{ // Debug.Log(transform.name + " Force Move m_flightEndPosition " + m_flightEndPosition); //} m_fFlightTime = 0.0f; bForceFlighting = true; //冲锋完成后向逻辑层回报一次同步,请根据需求取舍 //syncVelocity = Vector3.zero; //syncDetalTime = 0; //syncPosition = new Vector3((m_fForceStartPos.x + m_ForceMovePos.x) / 2.0f, m_fForceStartPos.y + fHeight, (m_fForceStartPos.z + m_ForceMovePos.z) / 2.0f); //m_CurStateHandler.Send_Sync_Position(); } else { m_fFlightHeight = 0.0f; } }