This commit is contained in:
윤기주_playm 2026-02-06 14:32:48 +09:00
parent f4ce7ba206
commit b06747778c
7 changed files with 1049449 additions and 160 deletions

View File

@ -1334,8 +1334,17 @@ MonoBehaviour:
normalRange: 15 normalRange: 15
normalSpeed: 20 normalSpeed: 20
attackCooldown: 0.5 attackCooldown: 0.5
maxChargeTime: 2 maxChargeTime: 3
chargeStages: [] chargeStages:
- chargeTime: 1
damageMult: 1.5
rangeMult: 1.2
- chargeTime: 2
damageMult: 2
rangeMult: 1.5
- chargeTime: 3
damageMult: 2.5
rangeMult: 2
--- !u!114 &8160405634931995834 --- !u!114 &8160405634931995834
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

View File

@ -1,5 +1,32 @@
%YAML 1.1 %YAML 1.1
%TAG !u! tag:unity3d.com,2011: %TAG !u! tag:unity3d.com,2011:
--- !u!1102 &-6348460053703279695
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: root_Fire
m_Speed: 1
m_CycleOffset: 0
m_Transitions:
- {fileID: -755189870364517574}
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 3ce83050456edc94a879c6b7b098b0b8, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1101 &-6240735469404449033 --- !u!1101 &-6240735469404449033
AnimatorStateTransition: AnimatorStateTransition:
m_ObjectHideFlags: 1 m_ObjectHideFlags: 1
@ -64,7 +91,32 @@ BlendTree:
m_UseAutomaticThresholds: 0 m_UseAutomaticThresholds: 0
m_NormalizedBlendValues: 0 m_NormalizedBlendValues: 0
m_BlendType: 0 m_BlendType: 0
--- !u!1101 &-6062631903822798585 --- !u!1101 &-3373107724525767724
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 1
m_ConditionEvent: Throw
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 1136321875733057157}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.7815534
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1101 &-2537943261611436803
AnimatorStateTransition: AnimatorStateTransition:
m_ObjectHideFlags: 1 m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
@ -81,83 +133,9 @@ AnimatorStateTransition:
m_Mute: 0 m_Mute: 0
m_IsExit: 0 m_IsExit: 0
serializedVersion: 3 serializedVersion: 3
m_TransitionDuration: 0.1
m_TransitionOffset: 0
m_ExitTime: 0.7972973
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1102 &-5106414194645963998
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: ThrowAnime2
m_Speed: 1
m_CycleOffset: 0
m_Transitions:
- {fileID: -2340117145942438922}
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: -4469183485442372851, guid: fe0db969c25fbba449e6b9dc582f974e, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1101 &-3373107724525767724
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 1
m_ConditionEvent: Attack
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 1136321875733057157}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25 m_TransitionDuration: 0.25
m_TransitionOffset: 0 m_TransitionOffset: 0
m_ExitTime: 0.7815534 m_ExitTime: 0.8
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1101 &-2340117145942438922
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions: []
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 5832328692256868789}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.90384614
m_HasExitTime: 1 m_HasExitTime: 1
m_HasFixedDuration: 1 m_HasFixedDuration: 1
m_InterruptionSource: 0 m_InterruptionSource: 0
@ -234,6 +212,28 @@ AnimatorStateTransition:
m_InterruptionSource: 0 m_InterruptionSource: 0
m_OrderedInterruption: 1 m_OrderedInterruption: 1
m_CanTransitionToSelf: 1 m_CanTransitionToSelf: 1
--- !u!1101 &-755189870364517574
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions: []
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 5832328692256868789}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.8
m_HasExitTime: 1
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!91 &9100000 --- !u!91 &9100000
AnimatorController: AnimatorController:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -249,12 +249,6 @@ AnimatorController:
m_DefaultInt: 0 m_DefaultInt: 0
m_DefaultBool: 0 m_DefaultBool: 0
m_Controller: {fileID: 9100000} m_Controller: {fileID: 9100000}
- m_Name: Attack
m_Type: 9
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
- m_Name: Throw - m_Name: Throw
m_Type: 9 m_Type: 9
m_DefaultFloat: 0 m_DefaultFloat: 0
@ -292,31 +286,6 @@ AnimatorController:
m_IKPass: 0 m_IKPass: 0
m_SyncedLayerAffectsTiming: 0 m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000} m_Controller: {fileID: 9100000}
--- !u!1101 &732024821610739442
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 1
m_ConditionEvent: Throw
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -5106414194645963998}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.7972973
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1102 &1136321875733057157 --- !u!1102 &1136321875733057157
AnimatorState: AnimatorState:
serializedVersion: 6 serializedVersion: 6
@ -362,15 +331,15 @@ AnimatorStateMachine:
- serializedVersion: 1 - serializedVersion: 1
m_State: {fileID: -2088444459569361171} m_State: {fileID: -2088444459569361171}
m_Position: {x: 340, y: -140, z: 0} m_Position: {x: 340, y: -140, z: 0}
- serializedVersion: 1
m_State: {fileID: 1284588245125541513}
m_Position: {x: 120, y: 60, z: 0}
- serializedVersion: 1
m_State: {fileID: -5106414194645963998}
m_Position: {x: -230, y: -70, z: 0}
- serializedVersion: 1 - serializedVersion: 1
m_State: {fileID: 1136321875733057157} m_State: {fileID: 1136321875733057157}
m_Position: {x: 410, y: 240, z: 0} m_Position: {x: 410, y: 240, z: 0}
- serializedVersion: 1
m_State: {fileID: 5685718804930466242}
m_Position: {x: 373.32153, y: 331.04327, z: 0}
- serializedVersion: 1
m_State: {fileID: -6348460053703279695}
m_Position: {x: 380, y: 410, z: 0}
m_ChildStateMachines: [] m_ChildStateMachines: []
m_AnyStateTransitions: m_AnyStateTransitions:
- {fileID: 4333065019228860351} - {fileID: 4333065019228860351}
@ -383,34 +352,31 @@ AnimatorStateMachine:
m_ExitPosition: {x: 800, y: 120, z: 0} m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 5832328692256868789} m_DefaultState: {fileID: 5832328692256868789}
--- !u!1102 &1284588245125541513 --- !u!1101 &1249653965778530027
AnimatorState: AnimatorStateTransition:
serializedVersion: 6
m_ObjectHideFlags: 1 m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_Name: Throw_Ready m_Name:
m_Speed: 1 m_Conditions:
m_CycleOffset: 0 - m_ConditionMode: 1
m_Transitions: m_ConditionEvent: Throw
- {fileID: 732024821610739442} m_EventTreshold: 0
- {fileID: -6062631903822798585} m_DstStateMachine: {fileID: 0}
m_StateMachineBehaviours: [] m_DstState: {fileID: -6348460053703279695}
m_Position: {x: 50, y: 50, z: 0} m_Solo: 0
m_IKOnFeet: 0 m_Mute: 0
m_WriteDefaultValues: 1 m_IsExit: 0
m_Mirror: 0 serializedVersion: 3
m_SpeedParameterActive: 0 m_TransitionDuration: 0.100000024
m_MirrorParameterActive: 0 m_TransitionOffset: 0
m_CycleOffsetParameterActive: 0 m_ExitTime: 0.7727272
m_TimeParameterActive: 0 m_HasExitTime: 0
m_Motion: {fileID: -203655887218126122, guid: fe0db969c25fbba449e6b9dc582f974e, type: 3} m_HasFixedDuration: 1
m_Tag: m_InterruptionSource: 0
m_SpeedParameter: m_OrderedInterruption: 1
m_MirrorParameter: m_CanTransitionToSelf: 1
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!206 &2519930613719260005 --- !u!206 &2519930613719260005
BlendTree: BlendTree:
m_ObjectHideFlags: 1 m_ObjectHideFlags: 1
@ -434,7 +400,7 @@ BlendTree:
m_UseAutomaticThresholds: 1 m_UseAutomaticThresholds: 1
m_NormalizedBlendValues: 0 m_NormalizedBlendValues: 0
m_BlendType: 0 m_BlendType: 0
--- !u!1101 &2866321221530538164 --- !u!1101 &3453174925999685758
AnimatorStateTransition: AnimatorStateTransition:
m_ObjectHideFlags: 1 m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
@ -446,14 +412,14 @@ AnimatorStateTransition:
m_ConditionEvent: isCharging m_ConditionEvent: isCharging
m_EventTreshold: 0 m_EventTreshold: 0
m_DstStateMachine: {fileID: 0} m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 1284588245125541513} m_DstState: {fileID: 5685718804930466242}
m_Solo: 0 m_Solo: 0
m_Mute: 0 m_Mute: 0
m_IsExit: 0 m_IsExit: 0
serializedVersion: 3 serializedVersion: 3
m_TransitionDuration: 0.25000006 m_TransitionDuration: 0.25
m_TransitionOffset: 0 m_TransitionOffset: 0
m_ExitTime: 0.5543414 m_ExitTime: 0.7815534
m_HasExitTime: 0 m_HasExitTime: 0
m_HasFixedDuration: 1 m_HasFixedDuration: 1
m_InterruptionSource: 0 m_InterruptionSource: 0
@ -484,6 +450,34 @@ AnimatorStateTransition:
m_InterruptionSource: 0 m_InterruptionSource: 0
m_OrderedInterruption: 1 m_OrderedInterruption: 1
m_CanTransitionToSelf: 1 m_CanTransitionToSelf: 1
--- !u!1102 &5685718804930466242
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Aiming
m_Speed: 1
m_CycleOffset: 0
m_Transitions:
- {fileID: 1249653965778530027}
- {fileID: -2537943261611436803}
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: ed3776af6fb028c4c897ad83453f61c7, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &5832328692256868789 --- !u!1102 &5832328692256868789
AnimatorState: AnimatorState:
serializedVersion: 6 serializedVersion: 6
@ -495,8 +489,8 @@ AnimatorState:
m_Speed: 1 m_Speed: 1
m_CycleOffset: 0 m_CycleOffset: 0
m_Transitions: m_Transitions:
- {fileID: 2866321221530538164}
- {fileID: -3373107724525767724} - {fileID: -3373107724525767724}
- {fileID: 3453174925999685758}
m_StateMachineBehaviours: [] m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0} m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0 m_IKOnFeet: 0

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ed3776af6fb028c4c897ad83453f61c7
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 3ce83050456edc94a879c6b7b098b0b8
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -5,9 +5,9 @@ using System.Collections.Generic;
public class PlayerAttack : MonoBehaviour public class PlayerAttack : MonoBehaviour
{ {
[Header("--- 활 설정 ---")] [Header("--- 활 설정 ---")]
[SerializeField] private GameObject arrowPrefab; // 화살 프리팹 [SerializeField] private GameObject arrowPrefab;
[SerializeField] private Transform firePoint; // 발사 위치 [SerializeField] private Transform firePoint;
[SerializeField] private PlayerAnimator pAnim; // 애니메이션 제어 [SerializeField] private PlayerAnimator pAnim;
[Header("--- 일반 공격 (좌클릭) ---")] [Header("--- 일반 공격 (좌클릭) ---")]
[SerializeField] private float normalDamage = 10f; [SerializeField] private float normalDamage = 10f;
@ -33,7 +33,9 @@ public class PlayerAttack : MonoBehaviour
private bool _isCharging = false; private bool _isCharging = false;
private bool _isAttacking = false; private bool _isAttacking = false;
// 🔥 추가: 애니메이션 이벤트 발생 시점에 사용할 데이터 저장용 변수 // 재장전 잠금 장치 (한 발 쏘면 우클릭 뗄 때까지 발사 불가)
private bool _waitForRelease = false;
private float _pendingDamage; private float _pendingDamage;
private float _pendingSpeed; private float _pendingSpeed;
private float _pendingRange; private float _pendingRange;
@ -67,27 +69,29 @@ public class PlayerAttack : MonoBehaviour
} }
} }
// 1. 좌클릭: 일반 공격 시도 (데이터만 저장하고 애니메이션 재생) // --- [1] 일반 공격 ---
public void PerformNormalAttack() public void PerformNormalAttack()
{ {
if (Time.time < _lastAttackTime + attackCooldown) return; if (Time.time < _lastAttackTime + attackCooldown) return;
if (_isAttacking) return; if (_isAttacking) return;
// ✅ 여기서 바로 발사하지 않고 정보만 저장합니다.
_pendingDamage = normalDamage; _pendingDamage = normalDamage;
_pendingSpeed = normalSpeed; _pendingSpeed = normalSpeed;
_pendingRange = normalRange; _pendingRange = normalRange;
_lastAttackTime = Time.time; _lastAttackTime = Time.time;
// 애니메이션 트리거 실행
if (pAnim != null) pAnim.TriggerThrow(); if (pAnim != null) pAnim.TriggerThrow();
StartCoroutine(AttackRoutine()); StartCoroutine(AttackRoutine());
} }
// --- [2] 차징 시작 ---
public void StartCharging() public void StartCharging()
{ {
// 🔒 잠금 상태(방금 쏨)라면 차징 시작 안 함 (손 떼야 풀림)
if (_waitForRelease) return;
_isCharging = true; _isCharging = true;
_chargeTimer = 0f; _chargeTimer = 0f;
@ -95,7 +99,8 @@ public class PlayerAttack : MonoBehaviour
if (CinemachineShake.Instance != null) CinemachineShake.Instance.SetZoom(true); if (CinemachineShake.Instance != null) CinemachineShake.Instance.SetZoom(true);
} }
public void CancelCharging() // 내부용: 효과 끄기
private void ResetChargingEffects()
{ {
_isCharging = false; _isCharging = false;
_chargeTimer = 0f; _chargeTimer = 0f;
@ -104,7 +109,14 @@ public class PlayerAttack : MonoBehaviour
if (CinemachineShake.Instance != null) CinemachineShake.Instance.SetZoom(false); if (CinemachineShake.Instance != null) CinemachineShake.Instance.SetZoom(false);
} }
// 2. 우클릭 중 좌클릭: 차징 발사 시도 (수치 계산 후 애니메이션 재생) // 외부 호출: 우클릭 뗐을 때 (여기서 잠금을 풉니다)
public void CancelCharging()
{
ResetChargingEffects();
_waitForRelease = false; // ✅ 잠금 해제! 다시 쏠 수 있음
}
// --- [3] 차징 발사 ---
public void ReleaseAttack() public void ReleaseAttack()
{ {
if (!_isCharging) return; if (!_isCharging) return;
@ -115,20 +127,20 @@ public class PlayerAttack : MonoBehaviour
if (_chargeTimer >= stage.chargeTime) currentStage = stage; if (_chargeTimer >= stage.chargeTime) currentStage = stage;
} }
// ✅ 계산된 결과값을 저장해둡니다.
_pendingDamage = normalDamage * currentStage.damageMult; _pendingDamage = normalDamage * currentStage.damageMult;
_pendingSpeed = normalSpeed * currentStage.rangeMult; _pendingSpeed = normalSpeed * currentStage.rangeMult;
_pendingRange = normalRange * currentStage.rangeMult; _pendingRange = normalRange * currentStage.rangeMult;
// 애니메이션 트리거 실행
if (pAnim != null) pAnim.TriggerThrow(); if (pAnim != null) pAnim.TriggerThrow();
CancelCharging(); // 🔒 발사했으므로 잠금! (우클릭 뗄 때까지 차징 불가)
_waitForRelease = true;
_lastAttackTime = Time.time; _lastAttackTime = Time.time;
StartCoroutine(AttackRoutine()); StartCoroutine(AttackRoutine());
} }
// 3. 🎯 핵심: 애니메이션의 'OnShootArrow' 이벤트 타이밍에 맞춰 실제 화살 생성 // --- [4] 이벤트: 화살 생성 ---
public void OnShootArrow() public void OnShootArrow()
{ {
if (arrowPrefab == null || firePoint == null) return; if (arrowPrefab == null || firePoint == null) return;
@ -138,16 +150,31 @@ public class PlayerAttack : MonoBehaviour
if (arrowScript != null) if (arrowScript != null)
{ {
// 미리 저장해둔(_pending...) 수치를 사용해 화살 초기화
arrowScript.Initialize(_pendingDamage, _pendingSpeed, _pendingRange); arrowScript.Initialize(_pendingDamage, _pendingSpeed, _pendingRange);
} }
} }
// --- [5] 이벤트: 공격 끝 (정상적인 경우) ---
public void OnAttackEnd()
{
_isAttacking = false;
ResetChargingEffects();
}
// --- [6] 안전장치 코루틴 ---
private IEnumerator AttackRoutine() private IEnumerator AttackRoutine()
{ {
_isAttacking = true; _isAttacking = true;
yield return new WaitForSeconds(0.2f);
_isAttacking = false; // 🚨 안전장치: 0.6초 뒤에는 무조건 공격 상태를 풉니다!
// (애니메이션 이벤트 OnAttackEnd가 씹혀도 멈추지 않게 함)
yield return new WaitForSeconds(0.6f);
if (_isAttacking)
{
_isAttacking = false;
ResetChargingEffects();
}
} }
public void StartWeaponCollision() { } public void StartWeaponCollision() { }