251 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			251 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections;
 | |
| using UnityEngine;
 | |
| 
 | |
| public class OLD_PlayerMotion : MonoBehaviour
 | |
| {
 | |
|     [SerializeField] private GameObject OVRPlayerControllerGameObject = null;
 | |
|     [SerializeField] private Transform LeftHandAnchorTransform = null;
 | |
|     [SerializeField] private Transform RightHandAnchorTransform = null;
 | |
|     private OVRPlayerController OVRPlayerControllerComponent;
 | |
| 
 | |
|     // identical to fields of OVRPlayerController class
 | |
|     private CharacterController Controller;
 | |
|     private Vector3 MoveThrottle = Vector3.zero;
 | |
|     private float MoveScale = 1.0f;
 | |
|     private float MoveScaleMultiplier = 1.0f;
 | |
|     private float SimulationRate = 60f;
 | |
|     private float FallSpeed = 0.0f;
 | |
|     private float Acceleration;
 | |
|     private float Damping;
 | |
|     private float GravityModifier;
 | |
|     private float JumpForce;
 | |
| 
 | |
|     // original fields for this script
 | |
|     private Vector3 touchVelocityL;
 | |
|     private Vector3 touchVelocityR;
 | |
|     private Vector3 touchAccelerationL;
 | |
|     private Vector3 touchAccelerationR;
 | |
|     private bool motionInertia = false;
 | |
|     private float motionInertiaDuration = 1.0f;
 | |
| 
 | |
|     const float WALK_THRESHOLD = 0.8f;
 | |
|     const float RUN_THRESHOLD = 1.3f;
 | |
|     const float JUMP_THRESHOLD = 1.5f;
 | |
| 
 | |
| 
 | |
|     private void Awake()
 | |
|     {
 | |
|         Controller
 | |
|             = OVRPlayerControllerGameObject.GetComponent<CharacterController>();
 | |
|         OVRPlayerControllerComponent
 | |
|             = Controller.GetComponent<OVRPlayerController>();
 | |
|     }
 | |
| 
 | |
| 
 | |
|     private void Start()
 | |
|     {
 | |
|         // store public fields of OVRPlayerController-class to local private fileds
 | |
|         Acceleration = OVRPlayerControllerComponent.Acceleration;
 | |
|         Damping = OVRPlayerControllerComponent.Damping;
 | |
|         GravityModifier = OVRPlayerControllerComponent.GravityModifier;
 | |
|         JumpForce = OVRPlayerControllerComponent.JumpForce;
 | |
| 
 | |
|         // pre-setting for overriding character-control
 | |
|         OVRPlayerControllerComponent.PreCharacterMove
 | |
|             += () => CharacterMoveByHandShake();
 | |
|         OVRPlayerControllerComponent.EnableLinearMovement = false;
 | |
| 
 | |
|         // necessary for initial grounded-evaluation
 | |
|         Controller.Move(Vector3.zero * Time.deltaTime);
 | |
|     }
 | |
| 
 | |
| 
 | |
|     private void Update()
 | |
|     {
 | |
|         //Debug.Log("L-touch velocity: " + touchVelocityL);
 | |
|         //Debug.Log("R-touch velocity: " + touchVelocityR);
 | |
|     }
 | |
| 
 | |
| 
 | |
|     private void CharacterMoveByHandShake()
 | |
|     {
 | |
|         HandShakeControler();
 | |
|         UpdateController();
 | |
| 
 | |
|         // display for development purpose
 | |
|         //Debug.Log("L-touch velocity: " + touchVelocityL);
 | |
|         //Debug.Log("R-touch velocity: " + touchVelocityR);
 | |
|     }
 | |
| 
 | |
| 
 | |
|     private void HandShakeControler()
 | |
|     {
 | |
|         touchVelocityL
 | |
|             = OVRInput.GetLocalControllerVelocity(OVRInput.Controller.LTouch);
 | |
|         touchVelocityR
 | |
|             = OVRInput.GetLocalControllerVelocity(OVRInput.Controller.RTouch);
 | |
|         touchAccelerationL
 | |
|             = OVRInput.GetLocalControllerAcceleration(OVRInput.Controller.LTouch);
 | |
|         touchAccelerationR
 | |
|             = OVRInput.GetLocalControllerAcceleration(OVRInput.Controller.RTouch);
 | |
| 
 | |
|         if (!IsGrounded()) MoveScale = 0.0f;
 | |
|         else MoveScale = 1.0f;
 | |
| 
 | |
|         MoveScale *= SimulationRate * Time.deltaTime;
 | |
| 
 | |
|         float moveInfluence
 | |
|             = Acceleration * 0.1f * MoveScale * MoveScaleMultiplier;
 | |
| 
 | |
|         Transform activeHand;
 | |
|         Vector3 handShakeVel;
 | |
|         Vector3 handShakeAcc;
 | |
| 
 | |
|         if (Math.Abs(touchVelocityL.y) > Math.Abs(touchVelocityR.y))
 | |
|         {
 | |
|             activeHand = LeftHandAnchorTransform;
 | |
|             handShakeVel = touchVelocityL;
 | |
|             handShakeAcc = touchAccelerationL;
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             activeHand = RightHandAnchorTransform;
 | |
|             handShakeVel = touchVelocityR;
 | |
|             handShakeAcc = touchAccelerationR;
 | |
|         }
 | |
| 
 | |
|         Quaternion ort = activeHand.rotation;
 | |
|         Vector3 ortEuler = ort.eulerAngles;
 | |
|         ortEuler.z = ortEuler.x = 0f;
 | |
|         ort = Quaternion.Euler(ortEuler);
 | |
| 
 | |
|         MoveThrottle += CalculateMoveEffect(moveInfluence, ort, handShakeVel, handShakeAcc);
 | |
|     }
 | |
| 
 | |
| 
 | |
|     private Vector3 CalculateMoveEffect(float moveInfluence,
 | |
|         Quaternion ort, Vector3 handShakeVel, Vector3 handShakeAcc)
 | |
|     {
 | |
|         Vector3 tmpMoveThrottle = Vector3.zero;
 | |
| 
 | |
|         bool isWalk = DetectHandShakeWalk(Math.Abs(handShakeVel.y)) || motionInertia;
 | |
|         if (isWalk)
 | |
|         {
 | |
|             if (!motionInertia)
 | |
|                 SetMotionInertia();
 | |
|             tmpMoveThrottle += ort
 | |
|                 * (OVRPlayerControllerGameObject.transform.lossyScale.z
 | |
|                 * moveInfluence * Vector3.forward) * 0.2f;
 | |
| 
 | |
|             bool isRun = DetectHandShakeRun(Math.Abs(handShakeVel.y));
 | |
|             if (isRun)
 | |
|                 tmpMoveThrottle *= 2.0f;
 | |
|         }
 | |
| 
 | |
|         bool isJump = DetectHandShakeJump();
 | |
|         if (isJump)
 | |
|             tmpMoveThrottle += new Vector3(0.0f, JumpForce, 0.0f);
 | |
| 
 | |
|         return tmpMoveThrottle;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     IEnumerator SetMotionInertia()
 | |
|     {
 | |
|         motionInertia = true;
 | |
|         yield return new WaitForSecondsRealtime(motionInertiaDuration);
 | |
|         motionInertia = false;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     private bool DetectHandShakeWalk(float speed)
 | |
|     {
 | |
|         if (!IsGrounded()) return false;
 | |
|         if (speed > WALK_THRESHOLD) return true;
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     private bool DetectHandShakeRun(float speed)
 | |
|     {
 | |
|         if (!IsGrounded()) return false;
 | |
|         if (speed > RUN_THRESHOLD) return true;
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     private bool DetectHandShakeJump()
 | |
|     {
 | |
|         if (!IsGrounded())
 | |
|             return false;
 | |
|         if (touchVelocityL.y > JUMP_THRESHOLD && touchVelocityR.y > JUMP_THRESHOLD)
 | |
|             return true;
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     private bool IsGrounded()
 | |
|     {
 | |
|         if (Controller.isGrounded) return true;
 | |
| 
 | |
|         var pos = OVRPlayerControllerGameObject.transform.position;
 | |
|         var ray = new Ray(pos + Vector3.up * 0.1f, Vector3.down);
 | |
|         var tolerance = 0.3f;
 | |
|         return Physics.Raycast(ray, tolerance);
 | |
|     }
 | |
| 
 | |
| 
 | |
|     private void UpdateController()
 | |
|     {
 | |
|         Vector3 moveDirection = Vector3.zero;
 | |
| 
 | |
|         float motorDamp = 1.0f + (Damping * SimulationRate * Time.deltaTime);
 | |
| 
 | |
|         MoveThrottle.x /= motorDamp;
 | |
|         MoveThrottle.y = (MoveThrottle.y > 0.0f) ?
 | |
|             (MoveThrottle.y / motorDamp) : MoveThrottle.y;
 | |
|         MoveThrottle.z /= motorDamp;
 | |
| 
 | |
|         moveDirection += MoveThrottle * SimulationRate * Time.deltaTime;
 | |
| 
 | |
|         // calculate gravity influence
 | |
|         if (Controller.isGrounded && FallSpeed <= 0)
 | |
|             FallSpeed = Physics.gravity.y * (GravityModifier * 0.002f);
 | |
|         else
 | |
|             FallSpeed += Physics.gravity.y
 | |
|                 * (GravityModifier * 0.002f) * SimulationRate * Time.deltaTime;
 | |
| 
 | |
|         moveDirection.y += FallSpeed * SimulationRate * Time.deltaTime;
 | |
| 
 | |
|         if (Controller.isGrounded && MoveThrottle.y
 | |
|             <= OVRPlayerControllerGameObject.transform.lossyScale.y * 0.001f)
 | |
|         {
 | |
|             // offset correction for uneven ground
 | |
|             float bumpUpOffset
 | |
|                 = Mathf.Max(
 | |
|                     Controller.stepOffset,
 | |
|                     new Vector3(moveDirection.x, 0, moveDirection.z).magnitude);
 | |
|             moveDirection -= bumpUpOffset * Vector3.up;
 | |
|         }
 | |
| 
 | |
|         Vector3 predictedXZ
 | |
|             = Vector3.Scale(
 | |
|                 Controller.transform.localPosition + moveDirection,
 | |
|                 new Vector3(1, 0, 1));
 | |
| 
 | |
|         // update character position
 | |
|         Controller.Move(moveDirection);
 | |
| 
 | |
|         Vector3 actualXZ
 | |
|             = Vector3.Scale(
 | |
|                 Controller.transform.localPosition,
 | |
|                 new Vector3(1, 0, 1));
 | |
| 
 | |
|         if (predictedXZ != actualXZ)
 | |
|             MoveThrottle += (actualXZ - predictedXZ)
 | |
|                 / (SimulationRate * Time.deltaTime);
 | |
|     }
 | |
| 
 | |
| 
 | |
| } |