59 lines
2.2 KiB
C#
59 lines
2.2 KiB
C#
using UnityEngine;
|
|
|
|
public class VRInputPoseDetector : MonoBehaviour
|
|
{
|
|
[SerializeField] private Transform headTransform;
|
|
[SerializeField] private Transform rightHandTransform;
|
|
[SerializeField] private Transform leftHandTransform;
|
|
[SerializeField] private float minForwardDistance = 0.15f;
|
|
[SerializeField] private float maxForwardDistance = 0.5f;
|
|
[SerializeField] private float minHeightOffset = -0.35f;
|
|
[SerializeField] private float maxHeightOffset = -0.1f;
|
|
[SerializeField] private float requiredPoseTime = -0.3f;
|
|
private float poseTimer = 0f;
|
|
private bool isPoseMainTained = false;
|
|
public bool IsPosing => isPoseMainTained;
|
|
|
|
void Update()
|
|
{
|
|
if(headTransform == null || rightHandTransform == null || leftHandTransform == null) return;
|
|
|
|
//両手の世界座標を頭を中心としたローカル座標に変換
|
|
Vector3 localRightHand = headTransform.InverseTransformPoint(rightHandTransform.position);
|
|
Vector3 localLeftHand = headTransform.InverseTransformPoint(leftHandTransform.position);
|
|
|
|
//両手が構え範囲に入っているかチェック
|
|
bool isRightHandGuarding = CheckHandPosition(localRightHand);
|
|
bool isLeftHandGuarding = CheckHandPosition(localLeftHand);
|
|
|
|
//両手が構え範囲にある場合のタイマー処理
|
|
if(isRightHandGuarding && isLeftHandGuarding)
|
|
{
|
|
poseTimer += Time.deltaTime;
|
|
if(poseTimer >= requiredPoseTime && !isPoseMainTained)
|
|
{
|
|
isPoseMainTained = true;
|
|
Debug.Log("kamaeseikou");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
poseTimer = 0f;
|
|
if(isPoseMainTained)
|
|
{
|
|
isPoseMainTained = false;
|
|
Debug.Log("kamaesippai");
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
private bool CheckHandPosition(Vector3 localHandPos)
|
|
{
|
|
bool inForwardRange = localHandPos.z >= minForwardDistance && localHandPos.z <= maxForwardDistance; //Z軸:頭より前に手があるか
|
|
bool inHeightRange = localHandPos.y >= minHeightOffset && localHandPos.y <= maxHeightOffset; //Y軸:手の高さが適切か
|
|
|
|
return inForwardRange && inHeightRange;
|
|
}
|
|
}
|