using Rokid.UXR.Utility; using UnityEngine; namespace Rokid.UXR.Interaction { /// /// 射线投射器 Only Use Station Pro /// public class ThreeDofRayCaster : BaseRayCaster { [SerializeField] public float maxDragDistance = 10; [SerializeField] public float minDragDistance = 0.5f; private bool dragLock; private float curHitPointDis; private Vector3 curHitPoint; private Vector3 targetHitPoint; private Vector3 oriRayPos; protected override void Init() { base.Init(); if (inputOverride == null) { inputOverride = GetComponent(); if (inputOverride == null) { inputOverride = gameObject.AddComponent(); } } } protected override bool ProcessDrag(Ray ray) { // 计算拖拽点的目标位置 CalDeltaZ(); targetHitPoint = rayOrigin.position + ray.direction * curHitPointDis; var delta = (targetHitPoint - oriHitPoint); m_SelectedObj.SendMessageUpwards(drag, delta, SendMessageOptions.DontRequireReceiver); curHitPoint = oriHitPoint = targetHitPoint; return true; } protected override bool CanDrag(Vector3 delta) { bool canDrag = !dragLock && !dragging && (m_SelectedObj.GetComponent() != null || m_SelectedObj.GetComponentInParent() != null); dragLock = true; return canDrag; } protected override bool DragRelease() { bool release = dragging && input.GetMouseButtonDown(0); return release; } private void LateUpdate() { if (!dragging && input.GetMouseButtonUp(0)) { dragLock = false; } } protected override void OnFirstSelect() { oriHitPoint = result.worldPosition; oriRayPos = ray.origin; } private void CalDeltaZ() { if (Utils.IsAndroidPlatfrom()) { var forward = Input.GetKey(KeyCode.UpArrow) ? 1 : (Input.GetKey(KeyCode.DownArrow) ? -1 : 0); Vector3 deltaZ = ray.direction * forward * 0.05f; Vector3 deltaRayPos = ray.origin - oriRayPos; oriRayPos = ray.origin; curHitPoint = oriHitPoint + deltaRayPos; curHitPointDis = Mathf.Clamp(Vector3.Distance(curHitPoint + deltaZ, ray.origin), minDragDistance, maxDragDistance); } else { Vector3 deltaZ = ray.direction * Input.mouseScrollDelta.y * 0.5f; Vector3 deltaRayPos = ray.origin - oriRayPos; oriRayPos = ray.origin; curHitPoint = oriHitPoint + deltaRayPos; curHitPointDis = Mathf.Clamp(Vector3.Distance(curHitPoint + deltaZ, ray.origin), minDragDistance, maxDragDistance); } } } }