|
|
using DG.Tweening; |
|
|
using System; |
|
|
using System.Collections.Generic; |
|
|
using UnityEngine; |
|
|
|
|
|
namespace UDE_HAND_INTERACTION |
|
|
{ |
|
|
public class VRControllerSample : MonoBehaviour |
|
|
{ |
|
|
public BleManager bleManager; |
|
|
|
|
|
private string LeftHand; |
|
|
private string RightHand; |
|
|
|
|
|
private Transform RealCamera; |
|
|
public GameObject TeleportTarget; |
|
|
private GameObject TempTarget = null; |
|
|
private List<Vector3> Line = new(); |
|
|
private LineRenderer TeleportRender; |
|
|
public Material[] TeleportMats; |
|
|
private float vertexDelta = 0.08f; |
|
|
private Vector3 velocity; |
|
|
private Vector3 PreviousPosition = Vector3.zero; |
|
|
|
|
|
private bool TeleportPermisssion = false; |
|
|
private float rateY; |
|
|
private float rateX; |
|
|
[HideInInspector] |
|
|
public float[] Move = new float[2]; |
|
|
|
|
|
private float ForwardMove; |
|
|
private float SideMove; |
|
|
public Vector3 MotionDir; |
|
|
|
|
|
private float InteractInterval = 0f; |
|
|
|
|
|
public GameObject ExtraSettingPanel; |
|
|
public FingerPressController ExitBtn; |
|
|
|
|
|
private void Start() |
|
|
{ |
|
|
RealCamera = transform.GetChild(0).GetChild(0); |
|
|
PreviousPosition = transform.localPosition; |
|
|
TeleportRender = GetComponentsInChildren<LineRenderer>()[0]; |
|
|
ExitBtn.OnSelect.AddListener(() => { Application.Quit(); }); |
|
|
} |
|
|
|
|
|
void Update() |
|
|
{ |
|
|
Vector3 _Forward = transform.GetChild(0).GetChild(0).forward; |
|
|
Vector3 Forward = new(_Forward.x, 0, _Forward.z); |
|
|
Vector3 _Right = transform.GetChild(0).GetChild(0).right; |
|
|
Vector3 Right = new(_Right.x, 0, _Right.z); |
|
|
|
|
|
LeftHand = bleManager.LeftDeviceName; |
|
|
RightHand = bleManager.RightDeviceName; |
|
|
|
|
|
#if UNITY_EDITOR |
|
|
ForwardMove = 0f; |
|
|
if (Input.GetKey(KeyCode.W)) |
|
|
{ |
|
|
ForwardMove = 1f; |
|
|
} |
|
|
if (Input.GetKey(KeyCode.S)) |
|
|
{ |
|
|
ForwardMove = -1f; |
|
|
} |
|
|
SideMove = 0; |
|
|
if (Input.GetKey(KeyCode.A)) |
|
|
{ |
|
|
SideMove = -1f; |
|
|
} |
|
|
if (Input.GetKey(KeyCode.D)) |
|
|
{ |
|
|
SideMove = 1f; |
|
|
} |
|
|
transform.localPosition += (ForwardMove * Forward + SideMove * Right) * 0.03f; |
|
|
MotionDir = new Vector3(SideMove, 0, ForwardMove); |
|
|
float Angle = Vector3.Angle(new Vector3(0,0,1), Forward); |
|
|
MotionDir = Quaternion.AngleAxis(Angle, transform.up) * MotionDir; |
|
|
|
|
|
if (Input.GetKeyDown(KeyCode.Q)) |
|
|
{ |
|
|
if (TempTarget == null) |
|
|
{ |
|
|
TempTarget = Instantiate(TeleportTarget, GetComponentsInChildren<MotionTracker>()[1].GetControlledHand(true)); |
|
|
InteractInterval = 1; |
|
|
} |
|
|
} |
|
|
|
|
|
if (TempTarget != null) |
|
|
{ |
|
|
RefreshTeleport(); |
|
|
} |
|
|
|
|
|
if (Input.GetKeyDown(KeyCode.E)) |
|
|
{ |
|
|
Vector3 PosOffset = new(transform.position.x - RealCamera.position.x, 0, transform.position.z - RealCamera.position.z); |
|
|
PreviousPosition = transform.position; |
|
|
transform.root.position = TempTarget.transform.position + PosOffset - new Vector3(0, 0.2f, 0); |
|
|
ResetTeleport(); |
|
|
InteractInterval = 1f; |
|
|
} |
|
|
#endif |
|
|
|
|
|
if (!bleManager.handDrivers[0].UsingAndroidService) |
|
|
{ |
|
|
if (string.IsNullOrEmpty(LeftHand) || string.IsNullOrEmpty(RightHand) || !bleManager.FinJoyCalibration) return; |
|
|
} |
|
|
|
|
|
var inputL = BleManager._SDK.UDE_GetInputDeviceData(LeftHand); |
|
|
var inputR = BleManager._SDK.UDE_GetInputDeviceData(RightHand); |
|
|
|
|
|
if (bleManager.handDrivers[0].UsingAndroidService) |
|
|
{ |
|
|
inputL = bleManager.handDrivers[0].inputData; |
|
|
inputR = bleManager.handDrivers[1].inputData; |
|
|
} |
|
|
|
|
|
float joy_x = inputL.joyX; |
|
|
float joy_x2 = inputR.joyX; |
|
|
float joy_y = inputL.joyY; |
|
|
float joy_y2 = inputR.joyY; |
|
|
|
|
|
rateX += 0.04f * (float)Math.Round(joy_x2, 2); |
|
|
rateY += 0.04f * (float)Math.Round(joy_y2, 2); |
|
|
Move[0] = 0.02f * (float)Math.Round(joy_x, 2); |
|
|
Move[1] = 0.02f * (float)Math.Round(joy_y, 2); |
|
|
|
|
|
if (rateX < -1) rateX = -1; else if (rateX > 1) rateX = 1; |
|
|
if (rateY < 0) rateY = 0; else if (rateY > 2) rateY = 2; |
|
|
|
|
|
if (InteractInterval <= 0) //<EFBFBD>ƶ<EFBFBD> |
|
|
{ |
|
|
transform.localPosition += Right * Move[0] + Forward * Move[1]; |
|
|
} |
|
|
|
|
|
if (inputR.aButton && InteractInterval <= 0) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ |
|
|
{ |
|
|
transform.localPosition = PreviousPosition; |
|
|
InteractInterval = 0.5f; |
|
|
} |
|
|
|
|
|
if (inputR.joyButton && InteractInterval <= 0) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> |
|
|
{ |
|
|
TeleportPermisssion = !TeleportPermisssion; |
|
|
InteractInterval = 0.5f; |
|
|
} |
|
|
|
|
|
if ((joy_y2 > 0.3f) && TeleportPermisssion && InteractInterval <= 0) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> |
|
|
{ |
|
|
if (TempTarget == null) |
|
|
{ |
|
|
TempTarget = Instantiate(TeleportTarget, GetComponentsInChildren<MotionTracker>()[1].GetControlledHand(true)); |
|
|
InteractInterval = 1; |
|
|
} |
|
|
} |
|
|
if (TempTarget != null) |
|
|
{ |
|
|
RefreshTeleport(); |
|
|
} |
|
|
if (joy_y2 == 0 && TempTarget != null && InteractInterval <= 0) |
|
|
{ |
|
|
Vector3 PosOffset = new(transform.position.x - RealCamera.position.x, 0, transform.position.z - RealCamera.position.z); |
|
|
PreviousPosition = transform.position; |
|
|
transform.root.position = TempTarget.transform.position + PosOffset - new Vector3(0, 0.2f, 0); |
|
|
ResetTeleport(); |
|
|
InteractInterval = 1f; |
|
|
} |
|
|
|
|
|
if (inputL.bButton && InteractInterval <= 0) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> |
|
|
{ |
|
|
if (ExtraSettingPanel.transform.localScale.x == 1) |
|
|
{ |
|
|
ExtraSettingPanel.transform.DOScale(Vector3.zero, 0.3f).OnComplete(ActiveExtraSetting); |
|
|
} |
|
|
else |
|
|
{ |
|
|
ExtraSettingPanel.SetActive(true); |
|
|
ExtraSettingPanel.transform.DOScale(Vector3.one, 0.3f); |
|
|
} |
|
|
InteractInterval = 0.5f; |
|
|
} |
|
|
|
|
|
if (InteractInterval > 0) InteractInterval -= Time.deltaTime; |
|
|
} |
|
|
|
|
|
void RefreshTeleport() |
|
|
{ |
|
|
Line.Clear(); |
|
|
TeleportRender.enabled = true; |
|
|
var RealRightHandTrack = TempTarget.transform.parent; |
|
|
velocity = RealRightHandTrack.forward * 2f; |
|
|
Vector3 pos = RealRightHandTrack.position; |
|
|
for (int i = 0; i < 100; ++i) |
|
|
{ |
|
|
Vector3 newPos = pos + velocity * vertexDelta + 0.5f * Physics.gravity * vertexDelta * vertexDelta; |
|
|
velocity += Physics.gravity * vertexDelta * vertexDelta; |
|
|
Line.Add(newPos); |
|
|
pos = newPos; |
|
|
|
|
|
if (velocity.y < 0 && pos.y <= 0.2f) |
|
|
{ |
|
|
break; |
|
|
} |
|
|
} |
|
|
TeleportRender.positionCount = Line.Count; |
|
|
TeleportRender.SetPositions(Line.ToArray()); |
|
|
Quaternion Rot = Quaternion.Euler(0, RealCamera.eulerAngles.y, 0); |
|
|
TempTarget.transform.SetPositionAndRotation(Line[^1], Rot); |
|
|
} |
|
|
|
|
|
void ResetTeleport() |
|
|
{ |
|
|
DestroyImmediate(TempTarget); |
|
|
TeleportRender.enabled = false; |
|
|
} |
|
|
|
|
|
private void ActiveExtraSetting() |
|
|
{ |
|
|
ExtraSettingPanel.SetActive(false); |
|
|
} |
|
|
} |
|
|
}
|
|
|
|