public void Move() { if (bJumpFlag) { return; } FPVector groundNormal = FPVector.zero; RaycastHit hitInfo; if (!RayGroundInfo(out hitInfo)) { if (!bJumpFlag) { bMoveFlag = false; } return; //如果离地,直接返回 } else { groundNormal = new FPVector(hitInfo.normal.x, hitInfo.normal.y, hitInfo.normal.z); } if (!bMoveFlag) { bMoveFlag = true; } FPVector forward = _ufpTransform.forward; FPVector fpNormal = _ufpTransform.ChangeVec3ToTSVec(hitInfo.normal); RaycastHit barrierInfo; bool bExitBarrier = (RayBarrierInfo(_childObj.forward.ToVector(), out barrierInfo)); //表示前方检测到物体,暂时把检测到的物体都称之为障碍物 bool bSlope = false; //默认不是为斜坡标志 if (bExitBarrier) { hitInfo = barrierInfo; bSlope = (Vector3.Angle(Vector3.up, hitInfo.normal) > SlopeAngle) ? true : false; if (ForWardMode == E_ForWardMode.FM_ON_FORWARD) { forward = _ufpTransform.forward; } else { FP angle = 0; fpNormal = _ufpTransform.ChangeVec3ToTSVec(hitInfo.normal); if (groundNormal != FPVector.zero) { angle = FPVector.Angle(groundNormal, fpNormal); angle = -angle; } if (_childObj) { //Vector3 newCrossVec3 = Vector3.Cross(hitInfo.normal, transform.up); //forward = Quaternion.AngleAxis(angle, newCrossVec3) * (transform.forward); FPVector newCrossVec3 = FPVector.Cross(fpNormal, _ufpTransform.up); forward = FPQuaternion.AngleAxis(angle, newCrossVec3) * _ufpTransform.forward; } } } else { bSlope = ((FPVector.Angle(FPVector.up, fpNormal)) > SlopeAngle) ? true : false; } if (SurfaceMode == E_SurfaceMode.SM_ON_GROUND) //非跨面模式:供人型和乌贼模式下使用 { if (bExitBarrier && bSlope) { return; } } else if (SurfaceMode == E_SurfaceMode.SM_ON_SURFACE) //跨面模式:供乌贼下潜模式下使用 { if (bSlope) { MotionMode = E_MotionMode.MM_ON_LINE; bool flag = CanMoveByInk(ref hitInfo); //上墙后到边角的处理 ==>TODO flag = true; if (!flag) { FPVector position = _ufpTransform.ChangeVec3ToTSVec(hitInfo.point) + (_childObj.forward * MoveSpeed * 0.1f); FPVector currentPosition = _ufpTransform.position; //_ufpTransform.position = position; //transform.position = position.ToVector(); UpdatePosition(_ufpTransform.position); RayGroundInfo(out barrierInfo); flag = CanMoveByInk(ref barrierInfo); // transform.position = currentPosition.ToVector(); UpdatePosition(_ufpTransform.position); if (bExitBarrier || !flag) { return; } } } } if (hitInfo.transform != null && ForWardMode == E_ForWardMode.FM_ON_NORMAL) { FitSurfaceParent(forward, _ufpTransform.ChangeVec3ToTSVec(hitInfo.point), fpNormal); //调整贴面 } else if (hitInfo.transform != null && ForWardMode == E_ForWardMode.FM_ON_FORWARD) { if (transform.up != Vector3.up) { FP quaternionSpeed = 0.09f; FPQuaternion data = new FPQuaternion(0, _ufpTransform.rotation.y, 0, _ufpTransform.rotation.w); _ufpTransform.SetRotation(FPQuaternion.Slerp(_ufpTransform.rotation, data, quaternionSpeed)); } } if (MotionMode == E_MotionMode.MM_ON_ROUND) //画圆模式:按照圆的弧度来行走 { _destRoundData = RotationSpeed * MoveSpeed * FrameSyncManager.DeltaTime; _ufpTransform.RotateAround(_center, _ufpTransform.up, _destRoundData); //_destUfpTransform.position = _ufpTransform.position; //_destUfpTransform.rotation = _ufpTransform.rotation; //_destUfpTransform.RotateAround(_center, _ufpTransform.up, _destRoundData); Debug.Log("----------------->_characterMotion:::" + _destRoundData + ",_destRoundData::" + _destRoundData.AsFloat() + ",childObj.forward::" + _childObj.forward + ",childObj.forward.toVector3::" + _childObj.forward.ToVector()); } else if (MotionMode == E_MotionMode.MM_ON_LINE)//直走模式:按照其forward的方向行走 { _destVector = _childObj.forward * MoveSpeed * FrameSyncManager.DeltaTime; _ufpTransform.Translate(_destVector, Space.World); //_destUfpTransform.position = _ufpTransform.position; //_destUfpTransform.rotation = _ufpTransform.rotation; //_destUfpTransform.Translate(_destVector, Space.World); } // if (Physics.Raycast(RayPointObj.position + (_destUfpTransform.position - _ufpTransform.position).ToVector(), -transform.up, GroundRayLength)) if (Physics.Raycast(RayPointObj.position + (_ufpTransform.position.ToVector() - transform.position), -transform.up, GroundRayLength)) { _bHasSpeed = false; } else { _bHasSpeed = true; RenderEndUpdatePosition(); } _verCurSpeed = MoveSpeed / 2; }
public void Move() { if (!bOnGround) { bMoveFlag = false; return; //如果离地,直接返回 } if (!bMoveFlag) { bMoveFlag = true; } Vector3 forward = transform.forward; RaycastHit hitInfo; bool bExitBarrier = (RayBarrierInfo(transform.forward, out hitInfo)); //表示前方检测到物体,暂时把检测到的物体都称之为障碍物 bool bSlope = false; //默认不是为斜坡标志 if (bExitBarrier) { bSlope = (Vector3.Angle(Vector3.up, hitInfo.normal) > SlopeAngle) ? true : false; if (ForWardMode == E_ForWardMode.FM_ON_FORWARD) { forward = transform.forward; } else { // //Vector3 dd = forward; // // float angle = 90 - Vector3.Angle(transform.up, hitInfo.normal); // // angle *= Vector3.Cross(transform.forward, hitInfo.normal).y < 0 ? -1 : 1; // //forward = Quaternion.AngleAxis(angle, transform.right) * transform.up; // //Debug.Log("transform.forward::"+transform.forward); // Vector3 beforeForward = forward; // float angle = 90 - Vector3.Angle(Vector3.up, hitInfo.normal); // Vector3 CrossData = Vector3.Cross(Vector3.up, hitInfo.normal); // Vector3 WallNormal = Quaternion.AngleAxis(Mathf.Abs(angle), CrossData) * hitInfo.normal; // // Debug.Log("Angle:::" + angle+ ",WallNornal::"+ WallNormal+ ",transform.forward::" + transform.forward); // // forward = Quaternion.AngleAxis(angle, normal) * transform.up; //// Debug.Log("WallNormal:::"+ WallNormal); ///* float*/ angle = 180 - Vector3.Angle(transform.forward, WallNormal); // Vector3 normal = Vector3.Cross(transform.forward, WallNormal).y < 0 ? -WallNormal : WallNormal; // forward = Quaternion.AngleAxis(angle, normal) * transform.up; // angle = 90 - Vector3.Angle(transform.up, hitInfo.normal); // angle *= Vector3.Cross(transform.forward, hitInfo.normal).y < 0 ? -1 : 1; // forward = Quaternion.AngleAxis(angle, transform.right) * forward; // Debug.DrawRay(transform.position, forward * 3f, Color.yellow); // Debug.Log("forward::"+ forward + ",before::"+ beforeForward); // // angle *= Vector3.Cross(transform.forward, hitInfo.normal).y < 0 ? -1 : 1; // // forward = Quaternion.AngleAxis(angle, transform.right) * forward; // // Debug.Log("forward:::"+ forward +":angle::"+ angle + "Vector3.Cross(transform.forward, WallNormal)::"+ Vector3.Cross(transform.forward, WallNormal)); float angle = 90 - Vector3.Angle(Vector3.up, hitInfo.normal); Vector3 CrossData = Vector3.Cross(Vector3.up, hitInfo.normal); forward = Quaternion.AngleAxis(angle, transform.right) * transform.up; Vector3 WallNormal = Quaternion.AngleAxis(Mathf.Abs(angle), CrossData) * hitInfo.normal; // Debug.Log("Angle:::" + angle+ ",WallNornal::"+ WallNormal+ ",transform.forward::" + transform.forward); // forward = Quaternion.AngleAxis(angle, normal) * transform.up; // Debug.Log("WallNormal:::"+ WallNormal); angle = 180 - Vector3.Angle(transform.forward, WallNormal); Vector3 normal = Vector3.Cross(transform.forward, WallNormal).y < 0 ? -WallNormal : WallNormal; forward = Quaternion.AngleAxis(angle, normal) * forward; Debug.Log("dddddddddddddddddddddddddddddddd::" + angle); //Vector3 climbForward = Vector3.zero; //float tempAngle = Vector3.Angle(Vector3.up, hitInfo.normal); //float angle = 180 - Vector3.Angle(transform.forward, hitInfo.normal) - tempAngle; //Vector3 normal = Vector3.Cross(transform.forward, hitInfo.normal).y < 0 ? -hitInfo.normal : hitInfo.normal; //forward = Quaternion.AngleAxis(angle, normal) * transform.up; //Debug.Log("tempAngle::"+ tempAngle + ",angle::"+ angle + ",Vector3.Angle(transform.forward, hitInfo.normal)::"+ Vector3.Angle(transform.forward, hitInfo.normal)); } } else { RayGroundInfo(out hitInfo); bSlope = (Vector3.Angle(Vector3.up, hitInfo.normal) > SlopeAngle) ? true : false; } if (SurfaceMode == E_SurfaceMode.SM_ON_GROUND) //非跨面模式:供人型和乌贼模式下使用 { if (bExitBarrier && bSlope) { return; } } else if (SurfaceMode == E_SurfaceMode.SM_ON_SURFACE) //跨面模式:供乌贼下潜模式下使用 { if (bSlope) { MotionMode = E_MotionMode.MM_ON_LINE; } } if (hitInfo.transform != null && ForWardMode != E_ForWardMode.FM_ON_FORWARD) { FitSurface(forward, hitInfo.point, hitInfo.normal); //调整贴面 } else { // Debug.Log("hitInfo.transform is null"); } if (MotionMode == E_MotionMode.MM_ON_ROUND) //画圆模式:按照圆的弧度来行走 { transform.RotateAround(_center, transform.up, RotationSpeed * MoveSpeed * Time.deltaTime); } else if (MotionMode == E_MotionMode.MM_ON_LINE)//直走模式:按照其forward的方向行走 { transform.Translate(transform.forward * MoveSpeed * Time.deltaTime, Space.World); } _verCurSpeed = MoveSpeed; }
public void Move() { if (transform.up != new Vector3(0, 1, 0)) { Debug.Log("111111111111111111111"); } if (!bOnGround) { bMoveFlag = false; return; //如果离地,直接返回 } if (!bMoveFlag) { bMoveFlag = true; } Vector3 forward = transform.parent.forward; RaycastHit hitInfo; bool bExitBarrier = (RayBarrierInfo(transform.forward, out hitInfo)); //表示前方检测到物体,暂时把检测到的物体都称之为障碍物 bool bSlope = false; //默认不是为斜坡标志 if (bExitBarrier) { bSlope = (Vector3.Angle(Vector3.up, hitInfo.normal) > SlopeAngle) ? true : false; if (ForWardMode == E_ForWardMode.FM_ON_FORWARD) { forward = transform.parent.forward; } else { float angle = (90 - Vector3.Angle(Vector3.up, hitInfo.normal)) - Vector3.Angle(Vector3.up, transform.up); //if (Vector3.Angle(Vector3.up, hitInfo.normal) > 90) //{ // angle = Vector3.Angle(Vector3.up, hitInfo.normal) - Vector3.Angle(Vector3.up, transform.up); // Debug.Log("Vector3.Angle(Vector3.up, hitInfo.normal)::" + Vector3.Angle(Vector3.up, hitInfo.normal)); //} if (gameObject.transform.parent) { int signed = (Vector3.Angle(transform.forward, transform.parent.forward) > 90) ? -1 : 1; forward = Quaternion.AngleAxis(angle * signed, transform.parent.right) * (transform.parent.up * signed); } } } else { RayGroundInfo(out hitInfo); bSlope = (Vector3.Angle(Vector3.up, hitInfo.normal) > SlopeAngle) ? true : false; } if (SurfaceMode == E_SurfaceMode.SM_ON_GROUND) //非跨面模式:供人型和乌贼模式下使用 { if (bExitBarrier && bSlope) { return; } } else if (SurfaceMode == E_SurfaceMode.SM_ON_SURFACE) //跨面模式:供乌贼下潜模式下使用 { if (bSlope) { MotionMode = E_MotionMode.MM_ON_LINE; } } if (hitInfo.transform != null && ForWardMode != E_ForWardMode.FM_ON_FORWARD) { FitSurfaceParent(forward, hitInfo.point, hitInfo.normal); //调整贴面 } else if (hitInfo.transform != null && ForWardMode == E_ForWardMode.FM_ON_FORWARD) { Vector3 num0000 = transform.up; Debug.Log("==============00000000000000000000===》transform.up:::" + transform.up); if (num0000 != new Vector3(0, 1, 0)) { Debug.Log("sssssssssssssssssssssssssssssssssssssss"); } FitSurfaceParent(forward, hitInfo.point, hitInfo.normal); //调整贴面 // Debug.Log("hitInfo.transform is null"); } if (MotionMode == E_MotionMode.MM_ON_ROUND) //画圆模式:按照圆的弧度来行走 { Vector3 num111 = transform.up; Debug.Log("==============1111111===》transform.up:::" + transform.up); if (num111 != new Vector3(0, 1, 0)) { Debug.Log("sssssssssssssssssssssssssssssssssssssss"); } transform.parent.RotateAround(_center, transform.parent.up, RotationSpeed * MoveSpeed * Time.deltaTime); if (num111 == new Vector3(0, 1, 0) && transform.up != new Vector3(0, 1, 0)) { Debug.Log("dddddddddddddddddddddddddddddddddddddddddddddddddddddddd"); } Debug.Log("================1111111=ffddddd》transform.up:::" + transform.up + ",parent::" + transform.parent.up); } else if (MotionMode == E_MotionMode.MM_ON_LINE)//直走模式:按照其forward的方向行走 { Vector3 num2222 = transform.up; Debug.Log("================222222=》transform.up:::" + transform.up); if (num2222 != new Vector3(0, 1, 0)) { Debug.Log("sssssssssssssssssssssssssssssssssssssss"); } transform.parent.Translate(transform.forward * MoveSpeed * Time.deltaTime, Space.World); // transform.parent.position = transform.position; Debug.Log("================222222=ffddddd》transform.up:::" + transform.up + ",parent::" + transform.parent.up); } _verCurSpeed = MoveSpeed; }