VRTK的交互的一个最重要的脚本是VRTK_ControllerEvents,可以在点击打开链接查看到官方文档
在VRTK的Example_15中有个典型的例子,用Controller来控制小车的移动,来实现自定义的交互功能。
Show you the codes:
首先是Controller上脚本RC_Car_Controller,当然Controller上还会挂着VRTK_ControllerEvents.
代码不长,只要用对函数,还是不难的,
namespace VRTK.Examples
{using UnityEngine;public class RC_Car_Controller : MonoBehaviour{public GameObject rcCar; //小车private RC_Car rcCarScript; //小车身上的控制脚本private void Start(){rcCarScript = rcCar.GetComponent<RC_Car>();GetComponent<VRTK_ControllerEvents>().TriggerAxisChanged += new ControllerInteractionEventHandler(DoTriggerAxisChanged);GetComponent<VRTK_ControllerEvents>().TouchpadAxisChanged += new ControllerInteractionEventHandler(DoTouchpadAxisChanged);GetComponent<VRTK_ControllerEvents>().TriggerReleased += new ControllerInteractionEventHandler(DoTriggerReleased);GetComponent<VRTK_ControllerEvents>().TouchpadTouchEnd += new ControllerInteractionEventHandler(DoTouchpadTouchEnd);GetComponent<VRTK_ControllerEvents>().ButtonTwoPressed += new ControllerInteractionEventHandler(DoCarReset);}private void DoTouchpadAxisChanged(object sender, ControllerInteractionEventArgs e){rcCarScript.SetTouchAxis(e.touchpadAxis);}private void DoTriggerAxisChanged(object sender, ControllerInteractionEventArgs e){rcCarScript.SetTriggerAxis(e.buttonPressure);}private void DoTouchpadTouchEnd(object sender, ControllerInteractionEventArgs e){rcCarScript.SetTouchAxis(Vector2.zero);}private void DoTriggerReleased(object sender, ControllerInteractionEventArgs e){rcCarScript.SetTriggerAxis(0f);}private void DoCarReset(object sender, ControllerInteractionEventArgs e){rcCarScript.ResetCar();}}
}
小车身上的脚本用以实现交互和控制,
namespace VRTK.Examples
{using UnityEngine;public class RC_Car : MonoBehaviour{public float maxAcceleration = 3f;public float jumpPower = 10f;private float acceleration = 0.05f;private float movementSpeed = 0f;private float rotationSpeed = 180f;private bool isJumping = false;private Vector2 touchAxis;private float triggerAxis;private Rigidbody rb;private Vector3 defaultPosition;private Quaternion defaultRotation;public void SetTouchAxis(Vector2 data){touchAxis = data;}public void SetTriggerAxis(float data){triggerAxis = data;}public void ResetCar(){transform.position = defaultPosition;transform.rotation = defaultRotation;}private void Awake(){rb = GetComponent<Rigidbody>();defaultPosition = transform.position;defaultRotation = transform.rotation;}private void FixedUpdate(){if (isJumping){touchAxis.x = 0f;}CalculateSpeed();Move();Turn();Jump();}private void CalculateSpeed(){if (touchAxis.y != 0f){movementSpeed += (acceleration * touchAxis.y);movementSpeed = Mathf.Clamp(movementSpeed, -maxAcceleration, maxAcceleration);}else{Decelerate();}}private void Decelerate(){if (movementSpeed > 0){movementSpeed -= Mathf.Lerp(acceleration, maxAcceleration, 0f);}else if (movementSpeed < 0){movementSpeed += Mathf.Lerp(acceleration, -maxAcceleration, 0f);}else{movementSpeed = 0;}}private void Move(){Vector3 movement = transform.forward * movementSpeed * Time.deltaTime;rb.MovePosition(rb.position + movement);}private void Turn(){float turn = touchAxis.x * rotationSpeed * Time.deltaTime;Quaternion turnRotation = Quaternion.Euler(0f, turn, 0f);rb.MoveRotation(rb.rotation * turnRotation);}private void Jump(){if (!isJumping && triggerAxis > 0){float jumpHeight = (triggerAxis * jumpPower);rb.AddRelativeForce(Vector3.up * jumpHeight);triggerAxis = 0f;}}private void OnTriggerStay(Collider collider){isJumping = false;}private void OnTriggerExit(Collider collider){isJumping = true;}}
}之后如果有其他典型的交互我再更新