From 095c5fca4ca5b73244f73654c068bcf42ff35a51 Mon Sep 17 00:00:00 2001 From: swrring Date: Wed, 21 Oct 2026 22:43:29 +0900 Subject: [PATCH] =?UTF-8?q?WL=20#964=20PD=20=EC=A7=80=EC=8B=9C=206?= =?UTF-8?q?=EA=B1=B4=20=E2=80=94=20=E2=91=A0=20=EB=B9=84=EC=88=98=20?= =?UTF-8?q?=EC=BD=A4=EB=B3=B4=201=C2=B72=C2=B71=C2=B73=C2=B74(=EB=A7=A4?= =?UTF-8?q?=ED=95=91=20attack=5Fb=20=EC=8B=A0=EC=84=A4=20=C2=B7=202?= =?UTF-8?q?=ED=83=80=20=E2=86=920.8=E2=86=92=201=ED=83=80=20=E2=86=920.587?= =?UTF-8?q?=E2=86=92=203=ED=83=80=20=C2=B7=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20=EC=9E=AC=EA=B5=BD=EA=B8=B0=20=C2=B7=20=EB=B0=B1?= =?UTF-8?q?=EC=97=85=20=EB=B9=84=EA=B5=90=20=EB=B3=80=EA=B2=BD=201)=20?= =?UTF-8?q?=E2=91=A1=203=C2=B74=ED=83=80=20=3D=201=C2=B72=ED=83=80?= =?UTF-8?q?=EC=99=80=20=EA=B0=99=EC=9D=80=20=EB=85=B9=EC=83=89=20=EA=B2=80?= =?UTF-8?q?=EA=B8=B0(swingFx=20keepTrail=20=3D=20=ED=9A=8C=EC=A0=84=C2=B7?= =?UTF-8?q?=EC=88=9C=EA=B0=84=EC=9D=B4=EB=8F=99=C2=B7=EC=B9=B4=EB=A9=94?= =?UTF-8?q?=EB=9D=BC=20=EC=97=B0=EC=B6=9C=EB=A7=8C=20=C2=B7=20=EA=B2=80?= =?UTF-8?q?=EA=B8=B0=20=ED=98=B8=20=EC=9C=A0=EC=A7=80=20=C2=B7=203=C2=B74?= =?UTF-8?q?=ED=83=80=20=EA=B6=A4=EC=A0=81=20=EB=B3=B4=EC=A0=95=20=EC=A7=80?= =?UTF-8?q?=EA=B8=88=20=ED=81=B4=EB=A6=BD=EC=9C=BC=EB=A1=9C=20=EC=9E=AC?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=ED=81=AC=20=C2=B7=204=ED=83=80=20=3D=20?= =?UTF-8?q?=EB=82=B4=EB=A0=A4=EC=B0=8D=EA=B8=B0=20=EC=84=B8=EB=A1=9C=20?= =?UTF-8?q?=ED=98=B8=EB=9D=BC=20arcTilts=2060=C2=B0)=20=E2=91=A2=203?= =?UTF-8?q?=ED=83=80=201.3=E2=86=921.95=20=C2=B7=204=ED=83=80=201.2?= =?UTF-8?q?=E2=86=921.8=20=C2=B7=204=ED=83=80=20=ED=81=AC=EA=B8=B0=20=3D?= =?UTF-8?q?=20=ED=83=80=EB=B3=84=20=ED=98=B8=20=EB=B0=B0=EC=9C=A8=20arcSiz?= =?UTF-8?q?eMulStages[3]=201.6(=ED=8F=AD=203.06~3.61=20m=20=C2=B7=20?= =?UTF-8?q?=EC=A7=80=EA=B8=88=204.97=20m=20=C3=97=200.7=20=EB=AA=A9?= =?UTF-8?q?=ED=91=9C)=20=C2=B7=204=ED=83=80=20=ED=8C=90=EC=A0=95=20?= =?UTF-8?q?=EC=95=9E=20=EB=81=9D=201.89=E2=86=921.32=20=E2=91=A3=204?= =?UTF-8?q?=ED=83=80=20=EC=9E=94=EC=83=81=20=3D=20=EC=88=9C=EA=B0=84?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EB=92=A4=200.3=20s=20=EB=A7=A4=20?= =?UTF-8?q?=ED=94=84=EB=A0=88=EC=9E=84=20=EC=A7=80=EB=82=98=EC=98=A8=20?= =?UTF-8?q?=EA=B8=B8=200.25=20m=20=EA=B0=84=EA=B2=A9(=EB=8F=8C=EC=A7=84=20?= =?UTF-8?q?1.13=20m/0.07=20s)=20=C2=B7=20=EC=9E=94=EC=83=81=20=EB=8F=99?= =?UTF-8?q?=EC=8B=9C=20=EC=83=81=ED=95=9C=206=E2=86=9210(=EC=8B=A4?= =?UTF-8?q?=EC=B8=A1=204=ED=83=80=EB=8B=B9=206=E2=86=927=EA=B0=9C)=20?= =?UTF-8?q?=E2=91=A4=20=EC=A7=80=ED=8C=A1=EC=9D=B4=20=EB=A9=94=ED=85=8C?= =?UTF-8?q?=EC=98=A4=20=EB=B0=98=EA=B2=BD=205=E2=86=923=20m=20=C2=B7=20?= =?UTF-8?q?=EB=8C=80=EC=83=81=20=EC=97=86=EC=9C=BC=EB=A9=B4=20PC=20?= =?UTF-8?q?=EB=8C=80=EC=83=81=20=EC=A4=91=EC=8B=AC(=EC=8B=A4=EC=B8=A1=20?= =?UTF-8?q?=EC=9A=B4=EC=84=9D=E2=86=94=EA=B7=B8=EB=95=8C=20=EC=A4=91?= =?UTF-8?q?=EC=8B=AC=20=E2=89=A4=202.85=20m)=20=E2=91=A5=20=EC=B0=BD=20?= =?UTF-8?q?=EC=B0=8C=EB=A5=B4=EA=B8=B0=20=3D=20=EB=A9=94=EC=8B=9C=20?= =?UTF-8?q?=EA=B8=B4=20=EC=B6=95=20+=20=EA=B8=B0=EC=9A=B8=EA=B8=B0=20?= =?UTF-8?q?=EC=A0=95=EB=A0=AC=20=C2=B7=20=ED=94=84=EB=A6=AC=ED=8C=B9=20?= =?UTF-8?q?=EC=A4=84=EA=B8=B0=20=EA=B8=B0=EC=9A=B8=EA=B8=B0=20=EB=B3=B4?= =?UTF-8?q?=EC=A0=95=20euler=20Z=20=E2=88=9226(=EC=8B=A4=EC=B8=A1=20?= =?UTF-8?q?=EC=A4=84=EA=B8=B0=E2=86=94=EC=B0=BD=2026=C2=B0=20=E2=86=92=202?= =?UTF-8?q?.1=C2=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../Animations/pcanim_assassin.controller | 103 +++++++++++++----- Assets/WL/Combat/CombatAnimMapping.asset | 37 ++++++- .../Impact/Resources/WL/WLImpactFx.json | 12 +- Assets/WL/Combat/Impact/WLImpactFx.cs | 72 ++++++++++-- Assets/WL/Combat/SlashTrailSettings.cs | 12 ++ .../Weapon/Resources/WL/WLGhostStrike.json | 3 +- .../Weapon/Resources/WL/WLHitboxFit.json | 3 +- .../Weapon/Resources/WL/WLStaffEarth.json | 3 +- Assets/WL/Combat/Weapon/WLStaffEarth.cs | 6 + Assets/WL/Combat/WeaponTrailDriver.cs | 2 +- .../Resources/WL/SlashTrailSettings.asset | 90 ++++++++------- 11 files changed, 265 insertions(+), 78 deletions(-) diff --git a/Assets/Res_Addr/Animations/pcanim_assassin.controller b/Assets/Res_Addr/Animations/pcanim_assassin.controller index 33285cab2..1038c09d2 100644 --- a/Assets/Res_Addr/Animations/pcanim_assassin.controller +++ b/Assets/Res_Addr/Animations/pcanim_assassin.controller @@ -369,7 +369,7 @@ AnimatorState: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: DualBlades_Attack3 - m_Speed: 1.3 + m_Speed: 1.95 m_CycleOffset: 0 m_Transitions: - {fileID: 2757370606414768772} @@ -487,28 +487,6 @@ AnimatorStateTransition: m_InterruptionSource: 0 m_OrderedInterruption: 1 m_CanTransitionToSelf: 1 ---- !u!1101 &-1743382946548511829 -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: -2969973505622332435} - m_Solo: 0 - m_Mute: 0 - m_IsExit: 0 - serializedVersion: 3 - m_TransitionDuration: 0.15 - m_TransitionOffset: 0 - m_ExitTime: 0.8 - m_HasExitTime: 1 - m_HasFixedDuration: 1 - m_InterruptionSource: 0 - m_OrderedInterruption: 1 - m_CanTransitionToSelf: 1 --- !u!1102 &-1674554289115283184 AnimatorState: serializedVersion: 6 @@ -517,7 +495,7 @@ AnimatorState: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: DualBlades_DodgeAttack - m_Speed: 1.2 + m_Speed: 1.8 m_CycleOffset: 0 m_Transitions: - {fileID: -524724009125662056} @@ -570,7 +548,7 @@ AnimatorState: m_Speed: 1.65 m_CycleOffset: 0 m_Transitions: - - {fileID: -1743382946548511829} + - {fileID: -100336708565961319} m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 @@ -685,6 +663,28 @@ AnimatorStateTransition: m_InterruptionSource: 0 m_OrderedInterruption: 1 m_CanTransitionToSelf: 1 +--- !u!1101 &-100336708565961319 +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: 1928427296861903119} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.15 + m_TransitionOffset: 0 + m_ExitTime: 0.8 + m_HasExitTime: 1 + m_HasFixedDuration: 0 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!91 &9100000 AnimatorController: m_ObjectHideFlags: 0 @@ -2457,6 +2457,9 @@ AnimatorStateMachine: - serializedVersion: 1 m_State: {fileID: -1537197310772809155} m_Position: {x: -20, y: -170, z: 0} + - serializedVersion: 1 + m_State: {fileID: 1928427296861903119} + m_Position: {x: 15, y: -105, z: 0} m_ChildStateMachines: [] m_AnyStateTransitions: [] m_EntryTransitions: [] @@ -2689,6 +2692,34 @@ AnimatorStateTransition: m_InterruptionSource: 0 m_OrderedInterruption: 1 m_CanTransitionToSelf: 1 +--- !u!1102 &1928427296861903119 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: attack_b + m_Speed: 1.5 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 5614524619657691524} + 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: 1827226128182048838, guid: 8ee71ee288ca0c44b987fd13c569fd30, + type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: --- !u!1101 &2149253845896622222 AnimatorStateTransition: m_ObjectHideFlags: 1 @@ -2930,6 +2961,28 @@ AnimatorState: m_MirrorParameter: m_CycleOffsetParameter: m_TimeParameter: +--- !u!1101 &5614524619657691524 +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: -2969973505622332435} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.15 + m_TransitionOffset: 0 + m_ExitTime: 0.587 + m_HasExitTime: 1 + m_HasFixedDuration: 0 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1102 &6021966566904734691 AnimatorState: serializedVersion: 6 diff --git a/Assets/WL/Combat/CombatAnimMapping.asset b/Assets/WL/Combat/CombatAnimMapping.asset index 959015250..4442dcca8 100644 --- a/Assets/WL/Combat/CombatAnimMapping.asset +++ b/Assets/WL/Combat/CombatAnimMapping.asset @@ -569,15 +569,46 @@ MonoBehaviour: stringParameter: Projectile_{CID} intParameter: 0 floatParameter: 0 + - stateName: attack_b + sourceFbxPath: Assets/ExplosiveLLC/Ninja Warrior Mecanim Animation Pack/Animations/Ninja@Attack1_S.FBX + subClipName: Attack1_S_{CID} + sourceClipName: + incomingExitTime: 0.8 + createIfMissing: 1 + firstFrame: -1 + lastFrame: -1 + speed: 1.5 + events: + - functionName: ShowEffect + time: 0 + useNormalized: 1 + normalizedTime: 0.117000006 + stringParameter: Effect_Slash_{CID}_1 + intParameter: 1 + floatParameter: 0 + - functionName: Move + time: 0 + useNormalized: 1 + normalizedTime: 0.177 + stringParameter: + intParameter: 0 + floatParameter: 0.2 + - functionName: Projectile + time: 0 + useNormalized: 1 + normalizedTime: 0.237 + stringParameter: Projectile_{CID} + intParameter: 0 + floatParameter: 0 - stateName: DualBlades_Attack3 sourceFbxPath: Assets/Res_Addr/Animations/Animation/Paladin/skill_spinslash.FBX subClipName: Attack3_S_{CID} sourceClipName: - incomingExitTime: 0.8 + incomingExitTime: 0.587 createIfMissing: 0 firstFrame: -1 lastFrame: -1 - speed: 1.3 + speed: 1.95 events: - functionName: LookAtTarget time: 0 @@ -615,7 +646,7 @@ MonoBehaviour: createIfMissing: 0 firstFrame: -1 lastFrame: 26 - speed: 1.2 + speed: 1.8 events: - functionName: LookAtTarget time: 0 diff --git a/Assets/WL/Combat/Impact/Resources/WL/WLImpactFx.json b/Assets/WL/Combat/Impact/Resources/WL/WLImpactFx.json index 17b9b8a89..9755e75e5 100644 --- a/Assets/WL/Combat/Impact/Resources/WL/WLImpactFx.json +++ b/Assets/WL/Combat/Impact/Resources/WL/WLImpactFx.json @@ -133,6 +133,8 @@ "spinSeconds": 0.333, "spinFx": false, "spinBlendOut": 0.12, + "keepTrail": true, + "_note_964": "#964 PD 「비수 공격 3타와 4타 이펙트를 1, 2타와 같은 검기로」 — keepTrail: 회전 이펙트(WL_Impact_DaggerRound)는 안 띄우고 1·2타와 같은 검기 호(Effect_WLSwingArc · 녹색)를 그대로 · 몸 1바퀴 회전(spin)은 유지 · 3타 궤적 보정(SlashTrailSettings Effect_Slash_10202_3)은 지금 클립(팔라딘 회전)으로 다시 구움 · prefab 칸은 기록용으로 남김", "_note_961": "#961 PD 「비수 3타 회전 이펙트는 Slash Effects FREE 에셋의 한 번만 회전하는 이펙트 — 점차 줄어드는 이펙트가 아닌 회전 후 즉시 소멸하는 이펙트로 교체」(참고 = 청록 초승달 1개 + 흰 점 + 빛 번짐) — 팩 6종 입자 구조 실측(961_fxinfo.cs): 초승달 1개 + 빛 점 30 + 빛 번짐 2 = Basic Slash Blue(감속 회전 700→245°/s · 0.4 s 동안 약 190° · 투명도 1→0.53→0 서서히) → 사본 WL_Impact_DaggerRound(hitbuild936 · 녹색 색조 fxtint954 (0.25,0.95,0.7) ×1.3) 을 961_spinfx.cs 로 초승달 수명 0.333 s · 회전 1081°/s 일정(위에서 보면 반시계 = 몸 −360°/0.333 s 와 같은 방향 같은 속도 · 정확히 1바퀴) · 투명도 0.9 까지 1 → 끝 0 · 크기 변화 끔 · 빛 점·번짐 수명 ×0.83 · 편집 모드 위 카메라 실측 0.02→0.31 s 한 바퀴 · 0.35 s 완전 소멸 · life 0.34 = 풀이 그 순간 끔 · 배율 0.75(사본 고리 반지름 약 2.1 m × 0.75 × 0.55 × 몸 크기 ≈ 1.0 m = 단검 리치) · 이전 WL_Impact_DaggerWhirl(원본 Skill_SpinSlash 사본 · 1초 동안 3바퀴/초로 계속 돌고 입자가 차례로 사라짐)은 파일만 남김", "_note_958": "#958 PD 「비수 3타 플레이어 회전 속도를 더 빠르게(이펙트와 일치하게)」 — 편집 모드 실측(958_spin.cs): 이펙트 자체 회전 = 칼날 층 slash_0 −1080°/s · slash (1) −1355 · slash (2) −1150 (루트 위 축 · 음수 = 위에서 보면 반시계) · 몸은 +360°/0.9 s = 400°/s 시계 방향이라 반대 방향 · 2.7배 느렸다 → −360°/0.333 s(= −1080°/s · 같은 방향 같은 속도) · 이펙트는 이미 스스로 돌므로 몸 각도로 한 번 더 돌리지 않음(spinFx false · 켜면 2160°/s 로 보임) · Play 프레임 실측(SpinTrace): 팔라딘 Around 클립 자체가 엉덩이를 시계 방향 약 300°/0.18 s 돌려 더하기 방식이면 상쇄 → 클립 yaw 를 덮어씀(WLSwingExtras · 끝 0.12 s 동안 클립 자세로 섞음)", "_note_956": "#956 PD 「3타 때 몸을 회전하지 않는 것 같다 → 몸을 회전 1회하며 공격 · 이펙트도 회전 모션에 맞게」 — Play 실측: m_animation.transform 은 PC 루트 자체(Animator 가 루트)라 #955 2차 「모델 자식 회전」도 루트 회전이었고 원본 LookAtTarget 이 매 프레임 되돌려 Attack3 클립당 61° 만 남음 → 코드 회전을 엉덩이 뼈(Root_M)에 누적 각으로 적용(루트·판정·카메라 그대로) + PC 에 붙은 이 이펙트를 같은 각으로(spinFx)", @@ -161,6 +163,11 @@ "blinkGhosts": 4, "camHoldSeconds": 0.7, "camZoomOut": 0.6, + "keepTrail": true, + "blinkTrailSeconds": 0.3, + "blinkTrailInterval": 0.0, + "blinkTrailMinStep": 0.25, + "_note_964": "#964 PD ① 「4타 이펙트를 1, 2타와 같은 검기로」 — keepTrail: 초승달(WL_Impact_DaggerSpin)은 안 띄우고 검기 호(녹색) · 순간이동 0.5 m · 카메라 고정·줌아웃은 유지 · 4타 동작 = 머리 위 → 정면 바닥 내려찍기(칼끝 실측 f7~f12)라 호가 세로로 서서 위 카메라에서 안 보임 → SlashTrailSettings arcTilts(10202 · Effect_Slash_10202_4 · 카메라 쪽 기울기) · 크기 30 % 축소 = arcSizeMulStages[3](지금 4타 폭 4.97 m × 0.7 목표) · 범위 30 % 축소 = WLHitboxFit 4타 frontReach 1.89 → 1.32 ② 「4타 잔상이 플레이어를 따라가지 않음 → 빠르게 이동한 것처럼 따라 생성」 — 1차 Play 실측: 4타 돌진 = 공격 전진 표 Attack4_S_102(프레임 5~8 · 약 1.13 m 를 0.07 s)가 순간이동 뒤에 와서 잔상(순간이동 길 4개)이 뒤에 남음 → 순간이동 뒤 0.3 s 동안 매 프레임 지나온 길에 0.25 m 간격으로 잔상(blinkTrail · BlinkGhosts 보간)", "_note_963": "#963 PD 「비수 공격 4타의 이펙트 크기를 2배로」 — 0.7 → 1.4 · 방향 유지는 WLAttackFacing holdClips(Attack4_S_10202)", "_note_955": "#955 PD 4타 3건 — ① 이펙트가 궤적과 안 맞고 작음(원본 Effect_Slash_10202_4 가 발 위치에) → Shiny Slash 사본을 날(손잡이→날 끝) 방향·위치에 맞춰 작게(실제 0.45) ② 적을 뚫고 가도 카메라 회전 금지 · 살짝 줌아웃 뒤 복귀(camHold 0.7 s · 0.6 m sin) ③ 잔상 남기며 0.5 m 순간이동하듯 나타나 베기(blink 0.5 m · 잔상 4 = WLGhostStrike 살아 있는 자세)", "_note_954": "#954 PD 「비수 3타 이펙트가 기존과 다른 컨셉 → Slash Effects FREE 의 회전 이펙트(스크린샷)로」 — 사본 WL_Impact_DaggerSpin(= Shiny Slash · 편집 모드 대조표 954_fx_sheet: 큰 초승달 + 반짝이 · 위에서 보면 수평 고리(954_fx_orient) · 시작색 teal (0.38,0.84,0.83)) · PC 중심에 따라붙음(alignWeapon 끔 · 수평 고리라 euler 0) · 배율 0.95(실제 0.95×0.55×1.16 ≈ 0.6 · 고리 반지름 약 0.8 m 추정) · 이전 DaggerSlash3 규칙(euler Z 90 · massLocal 0.5)은 #952 기록", @@ -325,7 +332,7 @@ ], "prefab": "WL_Impact_SpearBlast", "scale": 0.4, - "euler": [ 0, -90, 0 ], + "euler": [ 0, -90, -26 ], "yOffset": 0.0, "calibrated": false, "follow": true, @@ -338,6 +345,9 @@ "alignWeapon": true, "alignFraction": 0.0, "massLocal": [ 0, 0, 0 ], + "alignAxis": true, + "alignPitch": true, + "_note_964": "#964 PD 「창 찌르기 이펙트가 여전히 창과 방향이나 각도가 맞지 않는 것 같아 → 실측해서 창 위치와 정확히 일치한 방향과 각도로」 — 이전 방향 = 소켓(손) → 무기 bounds 의 가장 먼 모서리를 수평으로 누른 것(창이 위아래로 기울면 각도가 어긋나고 모서리는 자루 중심선 밖) → alignAxis(메시 긴 축 = 자루 끝 → 창끝 중심선 · 손을 그 선에 내린 점에서 시작) + alignPitch(기울기 그대로) · 입자는 전부 로컬 좌표라 이펙트 변환을 그대로 따라간다(프리팹 실측) · 1차 Play 실측(964_probe Spear · 197 프레임): 이펙트 +X ↔ 창 축(메시 정점 주축) 0.1° 로 맞췄으나 불꽃 줄기(입자 주축)는 창보다 약 26° 위로 들림(수평 오차 1~2.5°) = 프리팹 줄기가 로컬 +X 에서 위로 기울어 있음 → euler Z −26(로컬 Z 둘레로 먼저 돌려 줄기를 +X 에 맞춘 뒤 Y −90) · 2차 Play 로 재실측", "_note_943": "#943-⑤ PD 「타격하려는 방향을 고정한 채 … 이펙트가 캐릭터 방향에 따라 마구 바뀌면 안 됨」 — alignWeapon(창 방향 추종) 끄고 fixedDir: 띄우는 순간의 표적 방향으로 이펙트 방향 고정 + 공격 상태 동안 PC 회전 잠금(lockFacing · 타격 상자 Projectile_10101 도 같은 방향) · 자리 = PC 중심 + 정면 0.6 + 오른쪽 0.3 + 위 −0.15 − R × massLocal × 배율", "fixedDir": false, "lockFacing": true, diff --git a/Assets/WL/Combat/Impact/WLImpactFx.cs b/Assets/WL/Combat/Impact/WLImpactFx.cs index 8b3c0fbf9..0b2c2a6f8 100644 --- a/Assets/WL/Combat/Impact/WLImpactFx.cs +++ b/Assets/WL/Combat/Impact/WLImpactFx.cs @@ -40,7 +40,12 @@ namespace WL.Combat.Impact // #958 회전은 클립 yaw 를 덮어쓴다(클립 자체 회전과 상쇄 방지) · spinBlendOut = 끝난 뒤 애니메이터 자세로 되돌아가는 시간(초) public float spinBlendOut = 0.12f; // #943-⑤ PD 「타격하려는 방향을 고정한 채 이펙트가 재생되는 동안 타격 판정 … 이펙트가 캐릭터 방향에 따라 마구 바뀌면 안 됨」 — fixedDir = 띄우는 순간 PC 정면(LookAtTarget 뒤 = 표적 방향)을 잡아 두고 life 동안 이펙트 방향 고정 + PC 회전도 그 방향으로 잠금(공격 상태인 동안) · 자리 = PC 중심 + 정면 alignForward + 오른쪽 alignSide + 위 yOffset − R × massLocal × 배율(PC 위치는 따라감) - public bool fixedDir; public float alignForward = 0.5f; public float alignSide; public bool lockFacing = true; } + public bool fixedDir; public float alignForward = 0.5f; public float alignSide; public bool lockFacing = true; + // #964 PD 「비수 3·4타 이펙트를 1·2타와 같은 검기로」 — keepTrail = 이 규칙은 부가 연출(몸 회전 · 순간이동 · 카메라)만 하고 검기 호·리본(WeaponTrailDriver)은 막지 않는다(이펙트 프리팹 안 띄움) + // #964 PD 「4타 잔상이 플레이어를 따라 생성되도록」 — blinkTrailSeconds 동안 blinkTrailInterval 초마다 PC 가 blinkTrailMinStep(m) 이상 움직였으면 지금 자세 잔상 1개(WLGhostStrike.LiveGhost) + public bool keepTrail; public float blinkTrailSeconds; public float blinkTrailInterval = 0.04f; public float blinkTrailMinStep = 0.08f; + // #964 PD 「창 찌르기 이펙트가 창과 방향·각도가 안 맞음 → 실측해서 정확히」 — alignAxis = 무기 메시 긴 축(자루 끝 → 창끝 중심선)을 방향으로(이전 = 소켓 → bounds 의 가장 먼 모서리) · alignPitch = 위아래 기울기도 따른다(이전 = 수평으로 누름) + public bool alignAxis; public bool alignPitch; } /// 지면 충격파. tipContact = 칼끝이 지면(contactHeight 이내)에 닿는 프레임·자리에서 재생(단계 안에서 minDrop 이상 올라갔다 내려올 때) · 못 잡으면 timeout 뒤 최저점(fallbackHeight 이내)에. /// #900 frontOnly = PC 정면 쪽 접점만 인정(해머 1타 내려치기 — 뒤로 휘두를 때 등 뒤 지면 접점을 건너뛴다 · 2026-10-17 실측 −0.8 m). public sealed class WLGroundFxRule { public int[] classIds; public int stage; public string prefab; public float scale = 1f; public float forward; public bool tipContact = true; public float contactHeight = 0.15f; public float minDrop = 0.35f; public float timeout = 1.5f; public float fallbackHeight = 0.5f; public bool frontOnly; } @@ -292,6 +297,12 @@ namespace WL.Combat.Impact { var r = s.swingFx[i]; if (r == null || !Contains(r.classIds, cls) || (r.stages != null && r.stages.Length > 0 && !Contains(r.stages, stage))) continue; + if (r.keepTrail) // #964 검기 호는 그대로 두고(false → WeaponTrailDriver) 부가 연출만 + { + if (r.blinkDistance > 0f || r.camHoldSeconds > 0f || r.spinDegrees != 0f) WLSwingExtras.Begin(pc, r, null); + KeepTrails++; LastSwing = "keepTrail stage " + stage; LastLog = LastSwing; + return false; + } var tf = pc.transform; Quaternion rot; Vector3 pos; float scale; string how; bool cal_used = false; SwingCalibration cal = null; @@ -346,7 +357,7 @@ namespace WL.Combat.Impact return false; } - public static int SwingTilted, SwingThrottled; + public static int SwingTilted, SwingThrottled, KeepTrails; static readonly Dictionary s_swingAt = new Dictionary(); // #940 (PC, 단계) → 마지막으로 띄운 시각 /// #928 PD 「대검 1타 공격이 보는 방향에 따라서 너무 얇게 보여서 … 어느 방향에서 보더라도 검기처럼 보이게」 — @@ -676,6 +687,11 @@ namespace WL.Combat.Impact int ghosts = r.blinkGhosts > 0 ? WL.Combat.Weapon.WLGhostStrike.BlinkGhosts(pc, from, to, r.blinkGhosts) : 0; try { pc.Set_Warp(to); } catch (System.Exception) { pc.transform.position = to; } Blinks++; LastLog = "blink " + Vector3.Distance(from, to).ToString("F2") + " m · 잔상 " + ghosts; + if (r.blinkTrailSeconds > 0f) // #964 순간이동 뒤에도 PC 가 움직이는 동안 지나온 자리에 잔상을 이어 남긴다 + { + ex._trailUntil = Time.time + r.blinkTrailSeconds; ex._trailInterval = Mathf.Max(0.01f, r.blinkTrailInterval); ex._trailStep = Mathf.Max(0f, r.blinkTrailMinStep); + ex._trailNext = Time.time + ex._trailInterval; ex._trailLast = to; + } } if (r.camHoldSeconds > 0f) { WLCamHold.Begin(pc, r.camHoldSeconds, r.camZoomOut); CamHolds++; } if (r.spinDegrees != 0f) @@ -708,8 +724,23 @@ namespace WL.Combat.Impact return a.sqrMagnitude > 1e-6f && f.sqrMagnitude > 1e-6f ? Vector3.SignedAngle(f, a, root.up) : 0f; } public static float LastSpinErr; // 검증용 — 마지막 프레임의 (목표 yaw − 덮은 뒤 yaw) + float _trailUntil, _trailNext, _trailInterval, _trailStep; Vector3 _trailLast; // #964 4타 따라오는 잔상 + public static int TrailGhosts; + void TickTrail() + { + if (_trailUntil <= 0f || _pc == null) return; + if (Time.time > _trailUntil) { _trailUntil = 0f; return; } + if (Time.time < _trailNext) return; + _trailNext = Time.time + _trailInterval; + Vector3 p = _pc.Get_position(); float step = Mathf.Max(0.01f, _trailStep), d = Vector3.Distance(p, _trailLast); + if (d < step) return; + // 4타 돌진(공격 전진 표 · 약 1.1 m 를 0.07 s · Play 실측)은 한 프레임 0.3 m 넘게 가므로 지나온 길에 step 간격으로 고르게(지금 자세 · 기본 잔상 색 = 순간이동 잔상과 같음) + TrailGhosts += WL.Combat.Weapon.WLGhostStrike.BlinkGhosts(_pc, _trailLast, p, Mathf.Clamp(Mathf.FloorToInt(d / step), 1, 6)); + _trailLast = p; + } void LateUpdate() { + TickTrail(); if ((!_spinning && !_blending) || _pc == null) return; if (_spinBone == null) { _spinning = _blending = false; _fx = null; return; } var root = _pc.transform; float w = 1f; @@ -754,11 +785,11 @@ namespace WL.Combat.Impact /// #941 궤적 교체 이펙트를 매 프레임 무기 소켓 방향(손잡이 → 무기 끝 · 수평)에 맞춘다 — 창 2타 기계총 가림처럼 PC 정면이 아니라 무기가 향한 쪽으로 쏘게. 자리 = 손잡이 + 방향 × 길이 × alignFraction + 위 yOffset − R × massLocal × 배율. public sealed class WLWeaponFollowFx : MonoBehaviour { - Transform _socket; Vector3 _tipLocal, _mass, _dir; Quaternion _base; float _scale, _frac, _yOff, _fwd, _side, _until; PCActor _pc; bool _armed, _fixed, _lock; + Transform _socket; Vector3 _tipLocal, _buttLocal, _mass, _dir; Quaternion _base; float _scale, _frac, _yOff, _fwd, _side, _until; PCActor _pc; bool _armed, _fixed, _lock, _axis, _pitch; public static int Frames, Locked; public static string LastLog = ""; public bool Arm(PCActor pc, WLSwingFxRule r, float scale) { - _pc = pc; _scale = scale; _frac = r.alignFraction; _yOff = r.yOffset; _fwd = r.alignForward; _side = r.alignSide; _fixed = r.fixedDir; _lock = r.lockFacing; + _pc = pc; _scale = scale; _frac = r.alignFraction; _yOff = r.yOffset; _fwd = r.alignForward; _side = r.alignSide; _fixed = r.fixedDir; _lock = r.lockFacing; _axis = r.alignAxis; _pitch = r.alignPitch; _until = Time.time + (r.life > 0f ? r.life : 1f); _base = r.euler != null && r.euler.Length >= 3 ? Quaternion.Euler(r.euler[0], r.euler[1], r.euler[2]) : Quaternion.identity; _mass = r.massLocal != null && r.massLocal.Length >= 3 ? new Vector3(r.massLocal[0], r.massLocal[1], r.massLocal[2]) : Vector3.zero; @@ -767,7 +798,7 @@ namespace WL.Combat.Impact _dir = pc.transform.forward; _dir.y = 0f; if (_dir.sqrMagnitude < 1e-4f) _dir = Vector3.forward; _dir.Normalize(); // #943-⑤ 띄우는 순간의 표적 방향으로 고정 _armed = true; ApplyFixed(); return true; } - _armed = WLImpactRunner.SocketTip(pc, out _socket, out _tipLocal); + _armed = _axis ? WLImpactRunner.SocketAxis(pc, out _socket, out _buttLocal, out _tipLocal) : WLImpactRunner.SocketTip(pc, out _socket, out _tipLocal); if (_armed) Apply(); return _armed; } @@ -790,9 +821,14 @@ namespace WL.Combat.Impact { if (_socket == null || _pc == null) { _armed = false; return; } Vector3 hilt = _socket.position, tip = _socket.TransformPoint(_tipLocal); - Vector3 d = tip - hilt; float len = d.magnitude; d.y = 0f; + if (_axis) // #964 손(소켓)을 자루 중심선에 내린 점 → 창끝 + { + Vector3 butt = _socket.TransformPoint(_buttLocal), ax = tip - butt; + if (ax.sqrMagnitude > 1e-6f) hilt = butt + Vector3.Project(hilt - butt, ax); + } + Vector3 d = tip - hilt; float len = d.magnitude; if (!_pitch) d.y = 0f; if (d.sqrMagnitude < 1e-4f) d = _pc.transform.forward; d.Normalize(); - var rot = Quaternion.LookRotation(d, Vector3.up) * _base; + var rot = Quaternion.LookRotation(d, Mathf.Abs(d.y) > 0.99f ? _pc.transform.forward : Vector3.up) * _base; Vector3 pos = hilt + d * (len * _frac) + Vector3.up * _yOff - rot * (_mass * _scale); transform.SetPositionAndRotation(pos, rot); Frames++; LastLog = "align hilt=" + hilt.ToString("F2") + " tip=" + tip.ToString("F2") + " dir=" + d.ToString("F2") + " pos=" + pos.ToString("F2"); @@ -818,6 +854,28 @@ namespace WL.Combat.Impact } return socket != null && best > 0.05f; } + /// #964 소켓 무기의 메시 긴 축(소켓 로컬) — 켜진 렌더러 중 bounds 가장 긴 변이 가장 긴 것의 그 변 양 끝 면 중심 · 끝(tip) = 소켓 원점에서 먼 쪽 · 자루 끝(butt) = 가까운 쪽(창 찌르기 이펙트 방향 = 자루 중심선). + internal static bool SocketAxis(PCActor pc, out Transform socket, out Vector3 buttLocal, out Vector3 tipLocal) + { + socket = null; buttLocal = tipLocal = Vector3.zero; float best = 0f; + var sockets = pc != null ? pc.tfs_weapon : null; if (sockets == null) return false; + for (int i = 0; i < sockets.Length; i++) + { + var s = sockets[i]; if (s == null || !s.gameObject.activeInHierarchy) continue; + foreach (var r in s.GetComponentsInChildren(false)) + { + if (r == null || !r.enabled) continue; + Bounds lb; var mf = r.GetComponent(); var smr = r as SkinnedMeshRenderer; + if (mf != null && mf.sharedMesh != null) lb = mf.sharedMesh.bounds; else if (smr != null) lb = smr.localBounds; else continue; + Vector3 e = lb.extents, ax = e.x >= e.y && e.x >= e.z ? new Vector3(e.x, 0f, 0f) : e.y >= e.z ? new Vector3(0f, e.y, 0f) : new Vector3(0f, 0f, e.z); + Vector3 a = s.InverseTransformPoint(r.transform.TransformPoint(lb.center - ax)), b = s.InverseTransformPoint(r.transform.TransformPoint(lb.center + ax)); + float len = (b - a).magnitude; if (len <= best) continue; + best = len; socket = s; + if (a.magnitude > b.magnitude) { tipLocal = a; buttLocal = b; } else { tipLocal = b; buttLocal = a; } + } + } + return socket != null && best > 0.05f; + } /// #956 소켓 하나의 무기 끝(소켓 로컬) = 켜진 렌더러 bounds 모서리 중 소켓 원점에서 가장 먼 점 · 반환 = 그 거리(0 = 무기 없음). 비수처럼 양손 소켓을 따로 쓸 때(WLShadowSlash 난사 사본). internal static float SocketTipOf(Transform s, out Vector3 tipLocal) { diff --git a/Assets/WL/Combat/SlashTrailSettings.cs b/Assets/WL/Combat/SlashTrailSettings.cs index bd121e319..8eca57474 100644 --- a/Assets/WL/Combat/SlashTrailSettings.cs +++ b/Assets/WL/Combat/SlashTrailSettings.cs @@ -437,6 +437,18 @@ namespace WL.Combat [Tooltip("#850 이 직업의 호 크기 배율(arcSizeScale 에 곱한다). 1 = 그대로")] [Range(0.2f, 2f)] public float arcSizeMul = 1f; + + [Tooltip("#964 타별 호 크기 배율(arcSizeMul 에 곱한다) — 칸 번호 = 타 − 1 · 비우거나 0 이하 = 1 (비수 4타 = PD 「4타 크기 30 % 축소」)")] + public float[] arcSizeMulStages = new float[0]; + + /// #964 이 타(ShowEffect 이름 끝 숫자 · Effect_Slash_{직업}_{타})의 호 크기 배율 — 없으면 1. + public float StageSizeMul(string effectName) + { + if (arcSizeMulStages == null || arcSizeMulStages.Length == 0 || string.IsNullOrEmpty(effectName)) return 1f; + int i = effectName.LastIndexOf('_'), st; + if (i < 0 || !int.TryParse(effectName.Substring(i + 1), out st) || st < 1 || st > arcSizeMulStages.Length) return 1f; + return arcSizeMulStages[st - 1] > 0f ? arcSizeMulStages[st - 1] : 1f; + } } /// diff --git a/Assets/WL/Combat/Weapon/Resources/WL/WLGhostStrike.json b/Assets/WL/Combat/Weapon/Resources/WL/WLGhostStrike.json index 08a887a2f..78b0df571 100644 --- a/Assets/WL/Combat/Weapon/Resources/WL/WLGhostStrike.json +++ b/Assets/WL/Combat/Weapon/Resources/WL/WLGhostStrike.json @@ -1,6 +1,7 @@ { "enabled": 1, - "maxAlive": 6, + "maxAlive": 10, + "_note_964": "#964 PD 「비수 4타 잔상이 플레이어를 따라 생성되도록」 — 동시 잔상 상한 6 → 10: 4타 순간이동 길 잔상 4개가 6칸 중 4칸을 차지해 돌진(약 1.1 m · 0.07 s) 길 잔상이 2개만 생겼다(2차 Play 실측 · 따라오는 잔상 40/20회) · 잔상 1개 수명 = hold 0.05 + fade 0.3 s", "hold": 0.05, "fade": 0.3, "color": [ diff --git a/Assets/WL/Combat/Weapon/Resources/WL/WLHitboxFit.json b/Assets/WL/Combat/Weapon/Resources/WL/WLHitboxFit.json index f745b057a..b4a4647f0 100644 --- a/Assets/WL/Combat/Weapon/Resources/WL/WLHitboxFit.json +++ b/Assets/WL/Combat/Weapon/Resources/WL/WLHitboxFit.json @@ -52,7 +52,8 @@ 10202 ], "stage": 4, - "frontReach": 1.89 + "frontReach": 1.32, + "_note_964": "#964 PD 「비수 4타는 지금보다 크기 및 범위를 30% 줄여」 — 판정 앞 끝 1.89 → 1.32 m(× 0.7)" }, { "classIds": [ diff --git a/Assets/WL/Combat/Weapon/Resources/WL/WLStaffEarth.json b/Assets/WL/Combat/Weapon/Resources/WL/WLStaffEarth.json index 17c64f5ad..94fd44690 100644 --- a/Assets/WL/Combat/Weapon/Resources/WL/WLStaffEarth.json +++ b/Assets/WL/Combat/Weapon/Resources/WL/WLStaffEarth.json @@ -140,7 +140,8 @@ "stunSeconds": 0.5, "endAfter": 0.5, "meteors": 10, - "meteorArea": 5.0, + "meteorArea": 3.0, + "_note_964": "#964 PD 「지팡이 각성 스킬이 플레이어 주위가 아니라 타겟 된 적 중심으로 3m 범위 내 랜덤으로」 — meteorArea 5 → 3 m · 투사체 대상이 비면 PC 가 겨눈 대상(Get_Target)을 중심으로(WLStaffEarth.cs · 이전 = 시전자 앞 3 m) · 실측 = 964 검증 Play", "meteorInterval": 0.12, "meteorImpact": 0.67, "meteorYaw": 30, diff --git a/Assets/WL/Combat/Weapon/WLStaffEarth.cs b/Assets/WL/Combat/Weapon/WLStaffEarth.cs index ece5e6376..60a645dfb 100644 --- a/Assets/WL/Combat/Weapon/WLStaffEarth.cs +++ b/Assets/WL/Combat/Weapon/WLStaffEarth.cs @@ -90,6 +90,7 @@ namespace WL.Combat.Weapon { public const string ResourcesPath = "WL/WLStaffEarth"; public static int Casts, TakeOvers, Hits, Launches, Marked, Popups, Errors, Circles, Meteors; + public static string MeteorSrc = ""; public static Vector3 MeteorCenter; public static readonly List MeteorPts = new List(), MeteorCenters = new List(); // #964 검증용(메테오 중심 출처 · 낙하 자리) public static string LastLog = ""; static WLStaffEarthJson s_cfg; @@ -310,6 +311,10 @@ namespace WL.Combat.Weapon var shooter = pd.shooter; var target = pd.target; if (r.meteors > 0) // #963 메테오 — 운석마다 무작위 자리 · 땅에 닿는 시각에 그 자리 판정 + 기절 { + // #964 PD 「지팡이 각성 스킬이 플레이어 주위가 아니라 타겟 된 적 중심으로 3 m 범위 내 랜덤」 — 투사체 대상이 비거나 죽었으면 PC 가 겨눈 대상(Get_Target)으로 · 그것도 없으면 이전처럼 시전자 앞 3 m + WLStaffEarth.MeteorSrc = !DSUtil.CheckNull(target) && !target.IsDead() ? "투사체 대상" : "투사체 대상 없음"; + if ((DSUtil.CheckNull(target) || target.IsDead()) && shooter != null) { var t2 = shooter.Get_Target(); if (!DSUtil.CheckNull(t2) && !t2.IsDead()) { target = t2; WLStaffEarth.MeteorSrc += " → PC 대상"; } else WLStaffEarth.MeteorSrc += " → 시전자 앞"; } + WLStaffEarth.MeteorPts.Clear(); WLStaffEarth.MeteorCenters.Clear(); Vector3 last = DSUtil.CheckNull(target) ? shooter.Get_position() + shooter.transform.forward * 3f : target.Get_position(); var cam = Camera.main; Vector3 cf = cam != null ? cam.transform.forward : shooter.transform.forward; cf.y = 0f; if (cf.sqrMagnitude < 1e-4f) cf = Vector3.forward; Vector3 from = Quaternion.Euler(0f, r.meteorYaw, 0f) * cf.normalized; @@ -319,6 +324,7 @@ namespace WL.Combat.Weapon Vector3 c0 = r.center == "caster" ? shooter.Get_position() : last; Vector2 d = Random.insideUnitCircle * Mathf.Max(0f, r.meteorArea); Vector3 pt = new Vector3(c0.x + d.x, c0.y, c0.z + d.y); + WLStaffEarth.MeteorPts.Add(pt); WLStaffEarth.MeteorCenters.Add(c0); WLStaffEarth.MeteorCenter = c0; // #964 검증용(낙하 자리 · 그때 중심) WLStaffEarth.SpawnAt(r.fx, shooter, pt, from, 0f); WLStaffEarth.Meteors++; StartCoroutine(MeteorHit(pb, shooter, pt, r)); if (r.meteorInterval > 0f && i < r.meteors - 1) yield return new WaitForSeconds(r.meteorInterval); diff --git a/Assets/WL/Combat/WeaponTrailDriver.cs b/Assets/WL/Combat/WeaponTrailDriver.cs index 7dbf48346..f53d3ff3a 100644 --- a/Assets/WL/Combat/WeaponTrailDriver.cs +++ b/Assets/WL/Combat/WeaponTrailDriver.cs @@ -1643,7 +1643,7 @@ namespace WL.Combat if (reach > 0.01f && mf.radiusOuter > 1e-4f) s = reach * Mathf.Max(settings.arcRangeScale, 0.01f) / mf.radiusOuter; - s *= Mathf.Max(settings.arcSizeScale, 0.01f) * (cov != null ? Mathf.Max(cov.arcSizeMul, 0.01f) : 1f); + s *= Mathf.Max(settings.arcSizeScale, 0.01f) * (cov != null ? Mathf.Max(cov.arcSizeMul, 0.01f) * cov.StageSizeMul(cal != null && !string.IsNullOrEmpty(cal.clipName) ? cal.clipName : _burstPrefab) : 1f); // #964 타별 배율(비수 4타) // ── 회전 · 위치 ──────────────────────────────────────────────── Quaternion target = Quaternion.LookRotation(nW, bW); diff --git a/Assets/WL/Settings/Resources/WL/SlashTrailSettings.asset b/Assets/WL/Settings/Resources/WL/SlashTrailSettings.asset index 542754782..db4728f38 100644 --- a/Assets/WL/Settings/Resources/WL/SlashTrailSettings.asset +++ b/Assets/WL/Settings/Resources/WL/SlashTrailSettings.asset @@ -119,6 +119,7 @@ MonoBehaviour: weaponSlotIndices: arcFitBlade: 0 arcSizeMul: 0.924 + arcSizeMulStages: [] - classId: 10102 mode: 0 overrideLook: 0 @@ -129,6 +130,7 @@ MonoBehaviour: weaponSlotIndices: arcFitBlade: 0 arcSizeMul: 0.924 + arcSizeMulStages: [] - classId: 10201 mode: 0 overrideLook: 0 @@ -139,6 +141,7 @@ MonoBehaviour: weaponSlotIndices: arcFitBlade: 0 arcSizeMul: 1 + arcSizeMulStages: [] - classId: 10202 mode: 0 overrideLook: 1 @@ -149,6 +152,11 @@ MonoBehaviour: weaponSlotIndices: arcFitBlade: 0 arcSizeMul: 0.65 + arcSizeMulStages: + - 1 + - 1 + - 1 + - 1.6 - classId: 10501 mode: 0 overrideLook: 0 @@ -159,6 +167,7 @@ MonoBehaviour: weaponSlotIndices: 01000000 arcFitBlade: 0 arcSizeMul: 1 + arcSizeMulStages: [] - classId: 10502 mode: 0 overrideLook: 0 @@ -169,6 +178,7 @@ MonoBehaviour: weaponSlotIndices: 01000000 arcFitBlade: 0 arcSizeMul: 1 + arcSizeMulStages: [] - classId: 10701 mode: 0 overrideLook: 0 @@ -179,6 +189,7 @@ MonoBehaviour: weaponSlotIndices: arcFitBlade: 1 arcSizeMul: 1 + arcSizeMulStages: [] useTableWeaponIndices: 1 burstMode: 0 burstTiming: 1 @@ -597,44 +608,6 @@ MonoBehaviour: straight=0.49 sweep=124.0\xB0 pivot=\uC190\uC7A1\uC774\uC911\uC2EC tipR=0.211 hiltR=0.122 dev=0.033 fitQ=0.68 kind=Swing (\uB7F0\uD0C0\uC784 \uB85C\uCEEC=\uD68C\uC804\uB9CC \xB7 \uCEE8\uD2B8\uB864\uB7EC \uD074\uB9BD)" - - classId: 10202 - clipName: Effect_Slash_10202_3 - kind: 1 - planeNormal: {x: -0.082317114, y: -0.9563773, z: 0.28029686} - pivot: {x: -0.018818194, y: 0.34345716, z: 0.022582091} - bisector: {x: 0.9597754, y: -0.0003213581, z: 0.28076878} - startDir: {x: 0.20088509, y: -0.2914013, z: -0.9352702} - tipRadius: 0.39940676 - hiltRadius: 0.26400948 - sweepDeg: 187.99312 - stabAxis: {x: -0.0013499224, y: 0.47777095, z: 0.8784834} - stabStart: {x: 0.02574967, y: 0.18643004, z: -0.193755} - stabLength: 0.6883642 - quality: 50 - source: "wl828m1 2026-10-11 16:33 Attack3_S_10202 f14~f39/90@60Hz n=26(\uD2B8\uB9BC - 26\u219226) PC=LH_M05 rootScale=1.0527 weaponK=1.0000 path=2.14 bladeAng=346\xB0 - straight=0.35 sweep=188.0\xB0 pivot=\uCE7C\uB05D\uC6D0 tipR=0.399 hiltR=0.264 - dev=0.052 fitQ=0.74 kind=Swing (\uB7F0\uD0C0\uC784 \uB85C\uCEEC=\uD68C\uC804\uB9CC - \xB7 \uCEE8\uD2B8\uB864\uB7EC \uD074\uB9BD)" - - classId: 10202 - clipName: Effect_Slash_10202_4 - kind: 1 - planeNormal: {x: -0.3724884, y: 0.8765667, z: 0.3047675} - pivot: {x: 0.24783906, y: 0.2827277, z: 0.930264} - bisector: {x: -0.4942591, y: -0.46532953, z: 0.73428637} - startDir: {x: -0.90279526, y: -0.26618892, z: -0.3377933} - tipRadius: 0.47799104 - hiltRadius: 0.28055897 - sweepDeg: 142.42691 - stabAxis: {x: 0.7061329, y: 0.099189825, z: 0.7010975} - stabStart: {x: -0.21803169, y: 0.111440904, z: 0.7406768} - stabLength: 0.9993689 - quality: 50 - source: "wl828m1 2026-10-11 16:33 Attack4_S_10202 f11~f15/70@60Hz n=5(\uD2B8\uB9BC - 6\u21925) PC=LH_M05 rootScale=1.0527 weaponK=1.0000 path=1.27 bladeAng=189\xB0 - straight=0.93 sweep=142.4\xB0 pivot=\uCE7C\uB05D\uC6D0 tipR=0.478 hiltR=0.281 - dev=0.071 fitQ=0.70 kind=Swing (\uB7F0\uD0C0\uC784 \uB85C\uCEEC=\uD68C\uC804\uB9CC - \xB7 \uCEE8\uD2B8\uB864\uB7EC \uD074\uB9BD)" - classId: 10101 clipName: Effect_Slash_10101_1 kind: 1 @@ -916,6 +889,44 @@ MonoBehaviour: straight=0.90 sweep=18.0\xB0 pivot=\uC190\uC7A1\uC774\uC911\uC2EC tipR=1.829 hiltR=0.218 dev=0.027 fitQ=0.97 kind=Stab (\uB7F0\uD0C0\uC784 \uB85C\uCEEC=\uD68C\uC804\uB9CC \xB7 \uCEE8\uD2B8\uB864\uB7EC \uD074\uB9BD)" + - classId: 10202 + clipName: Effect_Slash_10202_3 + kind: 1 + planeNormal: {x: 0.2889763, y: 0.95680165, z: 0.031990036} + pivot: {x: 0.039037243, y: 0.46985248, z: -0.03167774} + bisector: {x: -0.7255494, y: 0.19708802, z: 0.65934384} + startDir: {x: 0.8233611, y: -0.23134772, z: -0.51822275} + tipRadius: 0.48337892 + hiltRadius: 0.42111483 + sweepDeg: 380.08942 + stabAxis: {x: -0.3503662, y: 0.03334063, z: 0.9360192} + stabStart: {x: 0.4051076, y: 0.36699417, z: -0.26208207} + stabLength: 1.148149 + quality: 50 + source: "wl828m1 2026-10-21 22:26 Attack3_S_10202 f10~f25/80@60Hz n=16(\uD2B8\uB9BC + 16\u219216) PC=LH_M05 rootScale=1.0527 weaponK=1.0000 path=3.65 bladeAng=413\xB0 + straight=0.58 sweep=380.1\xB0 pivot=\uC190\uC7A1\uC774\uC911\uC2EC tipR=0.483 + hiltR=0.421 dev=0.083 fitQ=0.66 kind=Swing (\uB7F0\uD0C0\uC784 \uB85C\uCEEC=\uD68C\uC804\uB9CC + \xB7 \uCEE8\uD2B8\uB864\uB7EC \uD074\uB9BD)" + - classId: 10202 + clipName: Effect_Slash_10202_4 + kind: 1 + planeNormal: {x: 0.993643, y: 0.09804149, z: -0.055329934} + pivot: {x: 0.098698564, y: 0.4146042, z: 0.68029946} + bisector: {x: 0.029423717, y: 0.24822924, z: 0.9682544} + startDir: {x: -0.11221989, y: 0.8235002, z: -0.55610627} + tipRadius: 0.37558234 + hiltRadius: 0.34842908 + sweepDeg: 219.42944 + stabAxis: {x: 0.07037806, y: -0.93870795, z: 0.33745268} + stabStart: {x: 0.030274354, y: 0.91671973, z: 0.34122294} + stabLength: 0.909731 + quality: 50 + source: "wl828m1 2026-10-21 22:26 Attack4_S_10202 f7~f12/70@60Hz n=6(\uD2B8\uB9BC + 6\u21926) PC=LH_M05 rootScale=1.0527 weaponK=1.0000 path=1.34 bladeAng=187\xB0 + straight=0.68 sweep=219.4\xB0 pivot=\uC190\uC7A1\uC774\uC911\uC2EC tipR=0.376 + hiltR=0.348 dev=0.014 fitQ=0.92 kind=Swing (\uB7F0\uD0C0\uC784 \uB85C\uCEEC=\uD68C\uC804\uB9CC + \xB7 \uCEE8\uD2B8\uB864\uB7EC \uD074\uB9BD)" swingMinSweepDegrees: 150 swingMinTipHiltRatio: 3 stabMinStraightness: 0.86 @@ -935,6 +946,9 @@ MonoBehaviour: - classId: 10801 clipName: Effect_Slash_10101_1 tiltDeg: 0 + - classId: 10202 + clipName: Effect_Slash_10202_4 + tiltDeg: 60 stabAnchor: 0 stabSizeScale: 1 stabFaceCamera: 1