progress
This commit is contained in:
@@ -1,20 +1,89 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.XR;
|
||||
|
||||
public class PhoneInteraction : MonoBehaviour
|
||||
{
|
||||
public GameObject Controller;
|
||||
public GameObject Plane;
|
||||
|
||||
[Header("Input")]
|
||||
[Tooltip("The XR input device to read trigger from. Leave at None for automatic detection.")]
|
||||
public XRNode inputDevice = XRNode.RightHand;
|
||||
|
||||
[Tooltip("Trigger threshold to register as pressed")]
|
||||
[Range(0.1f, 0.9f)]
|
||||
public float triggerThreshold = 0.5f;
|
||||
|
||||
private bool wasTouching = false;
|
||||
private bool wasTriggerPressed = false;
|
||||
private Vector2 lastNormalized;
|
||||
|
||||
void Update()
|
||||
{
|
||||
var t = Controller.GetComponent<Transform>();
|
||||
if (Physics.Raycast(t.position, t.forward, out RaycastHit hit) && hit.collider == Plane.GetComponent<Collider>())
|
||||
|
||||
// Check if ray hits the phone plane
|
||||
bool isTouching = Physics.Raycast(t.position, t.forward, out RaycastHit hit) &&
|
||||
hit.collider == Plane.GetComponent<Collider>();
|
||||
|
||||
if (isTouching)
|
||||
{
|
||||
// Calculate normalized UV coordinates
|
||||
var local = Plane.transform.InverseTransformPoint(hit.point);
|
||||
var normalized = new Vector2((local.x + 5) / 10, (local.z + 5) / 10);
|
||||
KotlinBridge.SendTouchMove(normalized.x, 1 - normalized.y);
|
||||
//Debug.Log("MOVE " + normalized);
|
||||
//Debug.DrawLine(t.position, hit.point, Color.green);
|
||||
lastNormalized = new Vector2(normalized.x, 1 - normalized.y);
|
||||
|
||||
// Check trigger input
|
||||
bool triggerPressed = IsTriggerPressed();
|
||||
|
||||
if (triggerPressed)
|
||||
{
|
||||
if (!wasTriggerPressed)
|
||||
{
|
||||
// Trigger just pressed - send touch down
|
||||
KotlinBridge.SendTouchDown(lastNormalized.x, lastNormalized.y);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Trigger held - send touch move
|
||||
KotlinBridge.SendTouchMove(lastNormalized.x, lastNormalized.y);
|
||||
}
|
||||
}
|
||||
else if (wasTriggerPressed)
|
||||
{
|
||||
// Trigger just released - send touch up
|
||||
KotlinBridge.SendTouchUp(lastNormalized.x, lastNormalized.y);
|
||||
}
|
||||
|
||||
wasTriggerPressed = triggerPressed;
|
||||
}
|
||||
else if (wasTriggerPressed)
|
||||
{
|
||||
// Lost contact while touching - send touch up at last position
|
||||
KotlinBridge.SendTouchUp(lastNormalized.x, lastNormalized.y);
|
||||
wasTriggerPressed = false;
|
||||
}
|
||||
|
||||
wasTouching = isTouching;
|
||||
}
|
||||
|
||||
private bool IsTriggerPressed()
|
||||
{
|
||||
// Try to get trigger value from XR input
|
||||
InputDevice device = InputDevices.GetDeviceAtXRNode(inputDevice);
|
||||
if (device.isValid)
|
||||
{
|
||||
if (device.TryGetFeatureValue(CommonUsages.trigger, out float triggerValue))
|
||||
{
|
||||
return triggerValue > triggerThreshold;
|
||||
}
|
||||
if (device.TryGetFeatureValue(CommonUsages.triggerButton, out bool triggerButton))
|
||||
{
|
||||
return triggerButton;
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback to Unity's legacy input (for testing in editor)
|
||||
return Input.GetMouseButton(0);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user