From 1a78937c4bb76e5980135383f5d880463e042b98 Mon Sep 17 00:00:00 2001 From: KawakamiKento Date: Tue, 26 May 2026 13:45:53 +0900 Subject: [PATCH] =?UTF-8?q?=E6=A7=8B=E3=81=88=E3=81=AE=E5=87=A6=E7=90=86?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Scenes/GameScene.unity | 44 ++++++++++++++++ Assets/Scripts/VRInputPoseDetector.cs | 58 ++++++++++++++++++++++ Assets/Scripts/VRInputPoseDetector.cs.meta | 2 + Assets/Scripts/VRPunchAttack.cs | 14 +++++- 4 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 Assets/Scripts/VRInputPoseDetector.cs create mode 100644 Assets/Scripts/VRInputPoseDetector.cs.meta diff --git a/Assets/Scenes/GameScene.unity b/Assets/Scenes/GameScene.unity index b0a8f94..1f657f2 100644 --- a/Assets/Scenes/GameScene.unity +++ b/Assets/Scenes/GameScene.unity @@ -3507,6 +3507,11 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 +--- !u!4 &434230315 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7917674758919744168, guid: 77e7c27b2c5525e4aa8cc9f99d654486, type: 3} + m_PrefabInstance: {fileID: 755171638} + m_PrefabAsset: {fileID: 0} --- !u!1001 &435560708 PrefabInstance: m_ObjectHideFlags: 0 @@ -14720,6 +14725,11 @@ Transform: m_Children: [] m_Father: {fileID: 1872167819} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &698882382 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7917674758326848202, guid: 77e7c27b2c5525e4aa8cc9f99d654486, type: 3} + m_PrefabInstance: {fileID: 755171638} + m_PrefabAsset: {fileID: 0} --- !u!1001 &699861773 PrefabInstance: m_ObjectHideFlags: 0 @@ -15356,6 +15366,9 @@ PrefabInstance: m_RemovedGameObjects: [] m_AddedGameObjects: [] m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 8806329115733545877, guid: 77e7c27b2c5525e4aa8cc9f99d654486, type: 3} + insertIndex: -1 + addedObject: {fileID: 1417949159} - targetCorrespondingSourceObject: {fileID: 7917674758240283208, guid: 77e7c27b2c5525e4aa8cc9f99d654486, type: 3} insertIndex: -1 addedObject: {fileID: 938850979} @@ -17285,6 +17298,7 @@ MonoBehaviour: m_Flags: 0 m_Reference: {fileID: 1927926602} controllerNode: 5 + poseDetector: {fileID: 1417949159} minPunchSpeed: 0.1 damageMultiplier: 10 hapticAmplitude: 0.5 @@ -17337,6 +17351,11 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 0 m_CollisionDetection: 0 +--- !u!4 &938850986 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7917674758240283209, guid: 77e7c27b2c5525e4aa8cc9f99d654486, type: 3} + m_PrefabInstance: {fileID: 755171638} + m_PrefabAsset: {fileID: 0} --- !u!1 &943548852 GameObject: m_ObjectHideFlags: 0 @@ -640342,6 +640361,31 @@ MonoBehaviour: m_ShadowLayerMask: 1 m_RenderingLayers: 1 m_ShadowRenderingLayers: 1 +--- !u!1 &1417949158 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8806329115733545877, guid: 77e7c27b2c5525e4aa8cc9f99d654486, type: 3} + m_PrefabInstance: {fileID: 755171638} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1417949159 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1417949158} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ba5d2c8447b183c40ad8183575ee0b8e, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::VRInputPoseDetector + headTransform: {fileID: 698882382} + rightHandTransform: {fileID: 938850986} + leftHandTransform: {fileID: 434230315} + minForwardDistance: 0.15 + maxForwardDistance: 0.5 + minHeightOffset: -0.35 + maxHeightOffset: -0.1 + requiredPoseTime: -0.3 --- !u!1001 &1426484610 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/VRInputPoseDetector.cs b/Assets/Scripts/VRInputPoseDetector.cs new file mode 100644 index 0000000..2be0c08 --- /dev/null +++ b/Assets/Scripts/VRInputPoseDetector.cs @@ -0,0 +1,58 @@ +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; + } +} diff --git a/Assets/Scripts/VRInputPoseDetector.cs.meta b/Assets/Scripts/VRInputPoseDetector.cs.meta new file mode 100644 index 0000000..e9f169d --- /dev/null +++ b/Assets/Scripts/VRInputPoseDetector.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ba5d2c8447b183c40ad8183575ee0b8e \ No newline at end of file diff --git a/Assets/Scripts/VRPunchAttack.cs b/Assets/Scripts/VRPunchAttack.cs index d4d82b4..5cb8367 100644 --- a/Assets/Scripts/VRPunchAttack.cs +++ b/Assets/Scripts/VRPunchAttack.cs @@ -10,6 +10,8 @@ public class VRInputPunch : MonoBehaviour [SerializeField] private XRNode controllerNode = XRNode.RightHand; + [SerializeField] private VRInputPoseDetector poseDetector; + [SerializeField] private float minPunchSpeed = 2.0f; //パンチとして判定する最低速度 (m/s) [SerializeField] private float damageMultiplier = 10.0f; //ダメージ倍率 @@ -56,10 +58,18 @@ public class VRInputPunch : MonoBehaviour if (damageble != null) { DamageInfo info = new DamageInfo(); - info.amount = speed * damageMultiplier; + if(poseDetector.IsPosing) + { + info.amount = (speed * damageMultiplier) * 2f; + info.isPoseBonus = true; + } + else + { + info.amount = speed * damageMultiplier; + info.isPoseBonus = false; + } info.hitPosition = other.transform.position; info.punchDirection = velocity.normalized; //パンチの進む向き - info.isPoseBonus = false; damageble.TakeDamage(info); Debug.Log("パンチ成功 ダメージ: {damage:F1}");