diff --git a/Assets/Input/New Actions.inputactions b/Assets/Input/New Actions.inputactions index 367cfce..3ea6ebd 100644 --- a/Assets/Input/New Actions.inputactions +++ b/Assets/Input/New Actions.inputactions @@ -89,6 +89,34 @@ "isPartOfComposite": false } ] + }, + { + "name": "Attack", + "id": "9c7758c2-de3d-43c3-9aaf-5a655fdcf2f1", + "actions": [ + { + "name": "Punch", + "type": "Value", + "id": "28908fd8-60ae-4ed6-87a5-c2c0567b368d", + "expectedControlType": "Vector3", + "processors": "", + "interactions": "", + "initialStateCheck": true + } + ], + "bindings": [ + { + "name": "", + "id": "9edba46f-5922-4818-a74c-1ba095f91287", + "path": "{RightHand}/{DeviceVelocity}", + "interactions": "", + "processors": "", + "groups": "", + "action": "Punch", + "isComposite": false, + "isPartOfComposite": false + } + ] } ], "controlSchemes": [] diff --git a/Assets/Scenes/GameScene.unity b/Assets/Scenes/GameScene.unity index e931e13..b0a8f94 100644 --- a/Assets/Scenes/GameScene.unity +++ b/Assets/Scenes/GameScene.unity @@ -14233,6 +14233,163 @@ Transform: m_CorrespondingSourceObject: {fileID: 1030978471, guid: abc00000000014616523831818405251, type: 3} m_PrefabInstance: {fileID: 656451309} m_PrefabAsset: {fileID: 0} +--- !u!1 &657866383 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 657866387} + - component: {fileID: 657866386} + - component: {fileID: 657866385} + - component: {fileID: 657866384} + - component: {fileID: 657866388} + - component: {fileID: 657866389} + m_Layer: 0 + m_Name: Capsule + m_TagString: Enemy + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!136 &657866384 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 657866383} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &657866385 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 657866383} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &657866386 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 657866383} + m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &657866387 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 657866383} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -14.499, y: 27.104, z: -3.996} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &657866388 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 657866383} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4b4f072c824585843b120965516325b6, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::EnemyHealth + maxHealth: 100 + knockbackForce: 5 +--- !u!54 &657866389 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 657866383} + serializedVersion: 5 + m_Mass: 1 + m_LinearDamping: 0 + m_AngularDamping: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 --- !u!1 &666223039 GameObject: m_ObjectHideFlags: 0 @@ -15198,7 +15355,16 @@ PrefabInstance: m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 7917674758240283208, guid: 77e7c27b2c5525e4aa8cc9f99d654486, type: 3} + insertIndex: -1 + addedObject: {fileID: 938850979} + - targetCorrespondingSourceObject: {fileID: 7917674758240283208, guid: 77e7c27b2c5525e4aa8cc9f99d654486, type: 3} + insertIndex: -1 + addedObject: {fileID: 938850978} + - targetCorrespondingSourceObject: {fileID: 7917674758240283208, guid: 77e7c27b2c5525e4aa8cc9f99d654486, type: 3} + insertIndex: -1 + addedObject: {fileID: 938850981} m_SourcePrefab: {fileID: 100100000, guid: 77e7c27b2c5525e4aa8cc9f99d654486, type: 3} --- !u!1001 &773127687 PrefabInstance: @@ -17089,6 +17255,88 @@ MonoBehaviour: m_ShadowLayerMask: 1 m_RenderingLayers: 1 m_ShadowRenderingLayers: 1 +--- !u!1 &938850972 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 7917674758240283208, guid: 77e7c27b2c5525e4aa8cc9f99d654486, type: 3} + m_PrefabInstance: {fileID: 755171638} + m_PrefabAsset: {fileID: 0} +--- !u!114 &938850978 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 938850972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 432d44ce69f716a499b8e70a63583b9e, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::VRPunchAttack + velocityAction: + m_UseReference: 1 + m_Action: + m_Name: Velocity + m_Type: 0 + m_ExpectedControlType: + m_Id: eeca53a5-3f81-4162-b22b-067eef3f1060 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_Reference: {fileID: 1927926602} + controllerNode: 5 + minPunchSpeed: 0.1 + damageMultiplier: 10 + hapticAmplitude: 0.5 + hapticDuration: 0.1 +--- !u!65 &938850979 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 938850972} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 0.09, y: 0.05, z: 0.15} + m_Center: {x: 0, y: -0.01, z: 0} +--- !u!54 &938850981 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 938850972} + serializedVersion: 5 + m_Mass: 1 + m_LinearDamping: 0 + m_AngularDamping: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 --- !u!1 &943548852 GameObject: m_ObjectHideFlags: 0 @@ -646985,6 +647233,20 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1927926602 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fc1515ab76e54f068e2f2207940fab32, type: 3} + m_Name: Attack/Punch + m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.InputActionReference + m_Asset: {fileID: -944628639613478452, guid: 5bbfa95a7ff8c42848c1cb2a29323d66, type: 3} + m_ActionId: 28908fd8-60ae-4ed6-87a5-c2c0567b368d --- !u!1001 &1931983518 PrefabInstance: m_ObjectHideFlags: 0 @@ -649434,3 +649696,4 @@ SceneRoots: - {fileID: 404289285} - {fileID: 755171638} - {fileID: 1784089338} + - {fileID: 657866387} diff --git a/Assets/Scripts/EnemyHealth.cs b/Assets/Scripts/EnemyHealth.cs new file mode 100644 index 0000000..c89cead --- /dev/null +++ b/Assets/Scripts/EnemyHealth.cs @@ -0,0 +1,44 @@ +using System; +using UnityEngine; + +public class EnemyHealth : MonoBehaviour, IDamageble +{ + [SerializeField] private float maxHealth = 100f; + private float currentHealth; + + [SerializeField] private float knockbackForce = 5f; + private Rigidbody rb; + + void Start() + { + currentHealth = maxHealth; //HPを代入 + rb = GetComponent(); + } + + public void TakeDamage(DamageInfo damageInfo) + { + if(currentHealth <= 0) return; + + currentHealth -= damageInfo.amount; //ダメージ計算 + + if(damageInfo.isPoseBonus) + { + Debug.Log("構えボーナス"); + } + + if(rb != null) //ノックバック + { + rb.AddForce(damageInfo.punchDirection * knockbackForce, ForceMode.Impulse); //パンチが飛んできた方向に力を加える + } + + if(currentHealth <= 0) + { + Die(); + } + } + + private void Die() + { + Destroy(gameObject, 0.5f); + } +} diff --git a/Assets/Scripts/EnemyHealth.cs.meta b/Assets/Scripts/EnemyHealth.cs.meta new file mode 100644 index 0000000..05ce886 --- /dev/null +++ b/Assets/Scripts/EnemyHealth.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4b4f072c824585843b120965516325b6 \ No newline at end of file diff --git a/Assets/Scripts/IDamageble.cs b/Assets/Scripts/IDamageble.cs new file mode 100644 index 0000000..afd5423 --- /dev/null +++ b/Assets/Scripts/IDamageble.cs @@ -0,0 +1,13 @@ +using UnityEngine; + +public struct DamageInfo +{ + public float amount; //ダメージ量 + public Vector3 hitPosition; //殴られた位置 + public Vector3 punchDirection; //パンチが飛んできた方向(ノックバック用) + public bool isPoseBonus; //構えから攻撃かどうか +} +public interface IDamageble +{ + void TakeDamage(DamageInfo damageInfo); +} \ No newline at end of file diff --git a/Assets/Scripts/IDamageble.cs.meta b/Assets/Scripts/IDamageble.cs.meta new file mode 100644 index 0000000..370c765 --- /dev/null +++ b/Assets/Scripts/IDamageble.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 42a222f4862dd2c46846a6be4dfe956a \ No newline at end of file diff --git a/Assets/Scripts/VRPunchAttack.cs b/Assets/Scripts/VRPunchAttack.cs new file mode 100644 index 0000000..d4d82b4 --- /dev/null +++ b/Assets/Scripts/VRPunchAttack.cs @@ -0,0 +1,84 @@ +using UnityEngine; +using UnityEngine.InputSystem; // Input Systemを使うために必要 +using UnityEngine.XR; // 振動機能のために必要 + +[RequireComponent(typeof(Collider))] +[RequireComponent(typeof(Rigidbody))] +public class VRInputPunch : MonoBehaviour +{ + [SerializeField] private InputActionProperty velocityAction; + + [SerializeField] private XRNode controllerNode = XRNode.RightHand; + + [SerializeField] private float minPunchSpeed = 2.0f; //パンチとして判定する最低速度 (m/s) + + [SerializeField] private float damageMultiplier = 10.0f; //ダメージ倍率 + + [SerializeField] private float hapticAmplitude = 0.5f; //振動の強さ + [SerializeField] private float hapticDuration = 0.1f; //振動の長さ + + private void OnEnable() + { + if (velocityAction.action != null) + { + velocityAction.action.Enable(); + } + } + + private void OnDisable() + { + if (velocityAction.action != null) + { + velocityAction.action.Disable(); + } + } + + void Start() + { + Rigidbody rb = GetComponent(); + rb.isKinematic = true; + rb.useGravity = false; + GetComponent().isTrigger = true; + } + + private void OnTriggerEnter(Collider other) + { + Vector3 velocity = velocityAction.action.ReadValue(); + + float speed = velocity.magnitude; + + Debug.Log($"[InputSystem接触] {other.name} に触れました。センサー速度: {speed:F2} m/s"); + + if (speed >= minPunchSpeed) + { + IDamageble damageble = other.GetComponentInParent(); + + if (damageble != null) + { + DamageInfo info = new DamageInfo(); + info.amount = speed * damageMultiplier; + info.hitPosition = other.transform.position; + info.punchDirection = velocity.normalized; //パンチの進む向き + info.isPoseBonus = false; + damageble.TakeDamage(info); + Debug.Log("パンチ成功 ダメージ: {damage:F1}"); + + TriggerHaptics(); + } + else + { + Debug.Log("スピードが足りません。必要: {minPunchSpeed} / 現在: {speed:F2}"); + } + } + } + + // コントローラーを振動させる処理 + private void TriggerHaptics() + { + UnityEngine.XR.InputDevice device = InputDevices.GetDeviceAtXRNode(controllerNode); + if (device.isValid) + { + device.SendHapticImpulse(0, hapticAmplitude, hapticDuration); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/VRPunchAttack.cs.meta b/Assets/Scripts/VRPunchAttack.cs.meta new file mode 100644 index 0000000..a9a5d7c --- /dev/null +++ b/Assets/Scripts/VRPunchAttack.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 432d44ce69f716a499b8e70a63583b9e \ No newline at end of file diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset index 3e9e3a1..daec776 100644 --- a/ProjectSettings/TagManager.asset +++ b/ProjectSettings/TagManager.asset @@ -5,6 +5,7 @@ TagManager: serializedVersion: 3 tags: - Anchor + - Enemy layers: - Default - TransparentFX