111 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Collections;
 | |
| using System.Collections.Generic;
 | |
| using FishNet.Object;
 | |
| using UnityEngine;
 | |
| using UnityEngine.XR;
 | |
| 
 | |
| public class XRPlayerMirror : NetworkBehaviour
 | |
| {
 | |
|     public GameObject head;
 | |
|     public GameObject leftHand;
 | |
|     public GameObject rightHand;
 | |
|     public bool useVR;
 | |
| 
 | |
|     public Transform headTransform;
 | |
|     public Transform leftHandTransform;
 | |
|     public Transform rightHandTransform;
 | |
|     public Transform kbmPlayerTransform;
 | |
|     
 | |
|     public Vector3 leftHandPositionOffset;
 | |
|     public Vector3 rightHandPositionOffset;
 | |
|     
 | |
|     public Vector3 leftHandRotationOffset;
 | |
|     public Vector3 rightHandRotationOffset;
 | |
|     
 | |
|     private Animator _leftHandAnimator;
 | |
|     private Animator _rightHandAnimator;
 | |
| 
 | |
|     private static readonly int Trigger = Animator.StringToHash("Trigger");
 | |
|     private static readonly int Grip = Animator.StringToHash("Grip");
 | |
| 
 | |
|     public override void OnStartClient()
 | |
|     {
 | |
|         base.OnStartClient();
 | |
|         if (!IsOwner) return;
 | |
|         // Disable head and hand meshrenderers
 | |
|         useVR = PlayerPrefs.GetInt("UseVR", 0) == 1;
 | |
|             
 | |
|         var meshRenderers = GetComponentsInChildren<MeshRenderer>();
 | |
|         foreach (var mRenderer in meshRenderers)
 | |
|         {
 | |
|             mRenderer.enabled = false;
 | |
|         }
 | |
|             
 | |
|         var skinnedMeshRenderers = GetComponentsInChildren<SkinnedMeshRenderer>();
 | |
|         foreach (var mRenderer in skinnedMeshRenderers)
 | |
|         {
 | |
|             mRenderer.enabled = false;
 | |
|         }
 | |
|             
 | |
|         _leftHandAnimator = leftHand.GetComponent<Animator>();
 | |
|         _rightHandAnimator = rightHand.GetComponent<Animator>();
 | |
|     }
 | |
| 
 | |
|     // Update is called once per frame
 | |
|     void Update()
 | |
|     {
 | |
|         if (!IsOwner) return;
 | |
|         
 | |
|         if (useVR)
 | |
|         {
 | |
|             UpdateXR();
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             head.transform.position = kbmPlayerTransform.position;
 | |
|             head.transform.rotation = kbmPlayerTransform.rotation;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private void UpdateXR()
 | |
|     {
 | |
|         if (headTransform != null)
 | |
|         {
 | |
|             head.transform.position = headTransform.position;
 | |
|             head.transform.rotation = headTransform.rotation;
 | |
|         }
 | |
| 
 | |
|         if (leftHandTransform != null)
 | |
|         {
 | |
|             leftHand.transform.position = leftHandTransform.position + leftHandPositionOffset;
 | |
|             leftHand.transform.rotation = leftHandTransform.rotation * Quaternion.Euler(leftHandRotationOffset) ;
 | |
|         }
 | |
| 
 | |
|         if (rightHandTransform != null)
 | |
|         {
 | |
|             rightHand.transform.position = rightHandTransform.position + rightHandPositionOffset;
 | |
|             rightHand.transform.rotation = rightHandTransform.rotation * Quaternion.Euler(rightHandRotationOffset);
 | |
|         }
 | |
|         
 | |
|         UpdateHandAnimation();
 | |
|     }
 | |
|     
 | |
|     private void UpdateHandAnimation()
 | |
|     {
 | |
|         InputDevice leftHandDevice = InputDevices.GetDeviceAtXRNode(XRNode.LeftHand);
 | |
|         InputDevice rightHandDevice = InputDevices.GetDeviceAtXRNode(XRNode.RightHand);
 | |
| 
 | |
|         _leftHandAnimator.SetFloat(Trigger, GetFeatureValueOrZero(CommonUsages.trigger, leftHandDevice));
 | |
|         _leftHandAnimator.SetFloat(Grip, GetFeatureValueOrZero(CommonUsages.grip, leftHandDevice));
 | |
|         
 | |
|         _rightHandAnimator.SetFloat(Trigger, GetFeatureValueOrZero(CommonUsages.trigger, rightHandDevice));
 | |
|         _rightHandAnimator.SetFloat(Grip, GetFeatureValueOrZero(CommonUsages.grip, rightHandDevice));
 | |
| 
 | |
|     }
 | |
| 
 | |
|     private float GetFeatureValueOrZero(InputFeatureUsage<float> feature, InputDevice targetDevice)
 | |
|     {
 | |
|         return targetDevice.TryGetFeatureValue(feature, out float value) ? value : 0;
 | |
|     }
 | |
| 
 | |
| } |