using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using VRTK; //右手柄车辆控制器 用于选取车辆、控制车辆移动 public class CarVRInputCtrl : MonoBehaviour,IVRInput { //当前选中的车辆 CarCtrl currentCar; //当前射线指向的物体 Transform CurrentPointerTarget; //左手控制器 public VRTK_ControllerEvents leftControllerEvents; bool interactable=false;//是否启用 float hor; float ver; float breakValue = 0; // Start is called before the first frame update void Start() { } /// /// 开启或关闭VR车辆控制输入 /// /// public void SetInteractable(bool interactable) { if (interactable == this.interactable) return;//未改变启用状态 不做处理 this.interactable = interactable; if (interactable)//开启注册监听事件 { RegisterHandleEvent(); } else //注销事件 清空车辆和射线检测物体 恢复车辆选中状态 { CancleHandleEvent(); if (currentCar) { currentCar.IsSelect = false; currentCar.StopVRCtrl(); currentCar = null; CurrentPointerTarget = null; } } } //注册手柄监听事件 void RegisterHandleEvent() { GetComponent().TouchpadAxisChanged += new ControllerInteractionEventHandler(DoTouchpadPressed); GetComponent().TouchpadTouchEnd += new ControllerInteractionEventHandler(DoTouchpadReleased); GetComponent().TriggerClicked += TriggerClicked; //GetComponent().DestinationMarkerHover += DestinationMarkerHover; GetComponent().PointerStateInvalid += PointerInValid; GetComponent().PointerStateValid += PointerValid; //GetComponent().ButtonTwoPressed += OpenCar;//右手上部按钮会触发系统鼠标点击事件 与触控盘太近 易误触发 leftControllerEvents.TriggerClicked += OpenCar;//改为由左手Trigger点击实现 } //注销手柄监听事件 void CancleHandleEvent() { GetComponent().TouchpadAxisChanged -= new ControllerInteractionEventHandler(DoTouchpadPressed); GetComponent().TouchpadTouchEnd -= new ControllerInteractionEventHandler(DoTouchpadReleased); GetComponent().TriggerClicked -= TriggerClicked; //GetComponent().DestinationMarkerHover -= DestinationMarkerHover; GetComponent().PointerStateInvalid -= PointerInValid; GetComponent().PointerStateValid -= PointerValid; GetComponent().ButtonTwoPressed -= OpenCar; } // 改变当前选中车辆展开状态 private void OpenCar(object sender, ControllerInteractionEventArgs e) { if (currentCar) currentCar.ChangeOpening(true); } //按下扳机 private void TriggerClicked(object sender, ControllerInteractionEventArgs e) { if (!GetComponent().IsPointerActive())//扣下扳机时 无射线射线物体信息 { CurrentPointerTarget = null;//清空射线消失前选中的物体 } if (currentCar)//存在当前选中车辆 { if (currentCar.transform == CurrentPointerTarget)//再次选择已经选中的车不做任何处理 { return; } else//选中了其他物体 或未选中任何物体 { CancelCurrentCarSelelct();//取消当前车辆选中状态 } } if (CurrentPointerTarget)//射线碰到了 一个物体 { currentCar= CurrentPointerTarget.GetComponentInParent(); if (currentCar)//选中了一辆车 { currentCar.IsSelect = true; currentCar.StartVRCtrl(); } } } //取消车辆选中状态 private void CancelCurrentCarSelelct() { currentCar.IsSelect = false; currentCar.StopVRCtrl(); currentCar = null; } //射线碰到物体 变红色 private void PointerInValid(object sender, DestinationMarkerEventArgs e) { CurrentPointerTarget = null; } //射线碰撞到物体 变绿色 private void PointerValid(object sender, DestinationMarkerEventArgs e) { CurrentPointerTarget = e.target; } //touch结束触碰 private void DoTouchpadReleased(object sender, ControllerInteractionEventArgs e) { hor = 0; ver = 0; breakValue = 1; //if (currentCar != null) // currentCar.CarMove(0, 0, 1);//停车 } //touch触碰 private void DoTouchpadPressed(object sender, ControllerInteractionEventArgs e) { hor = e.touchpadAxis.x; ver = e.touchpadAxis.y; breakValue = 0; //if (currentCar != null) // currentCar.CarMove(e.touchpadAxis.x, e.touchpadAxis.y, 0);//移动 } //private void OnEnable() //{ // EventCenter.Instance.EventTrigger("AddVRInput", this); //} //private void OnDisable() //{ // EventCenter.Instance.EventTrigger("RemoveVRInput", this); //} void FixedUpdate() { if (currentCar) { currentCar.CarMove(hor, ver, breakValue); } } private void OnDestroy() { CancleHandleEvent(); } }