diff --git a/AgentScripts/WL_CombatAnimSetup.cs b/AgentScripts/WL_CombatAnimSetup.cs index e417e35aa..6f72b83a8 100644 --- a/AgentScripts/WL_CombatAnimSetup.cs +++ b/AgentScripts/WL_CombatAnimSetup.cs @@ -149,6 +149,7 @@ public static class WL_CombatAnimSetup { state.motion = clip; if (st.speed > 0f) state.speed = st.speed; // #834 상태 재생 속도(비수 3타 등) + if (state.mirror != (st.mirror != 0)) { state.mirror = st.mirror != 0; state.mirrorParameterActive = false; sb.AppendLine(" 거울 = " + (st.mirror != 0 ? "켬" : "끔") + " → " + state.name); } // #948-6 빈손 내뻗기(오른손 클립 거울) touchedStates++; } diff --git a/Assets/ExplosiveLLC/Mage Warrior Mecanim Animation Pack/Animations/Mage@RangeAttack2.FBX.meta b/Assets/ExplosiveLLC/Mage Warrior Mecanim Animation Pack/Animations/Mage@RangeAttack2.FBX.meta index 55d20e92d..6820d642c 100644 --- a/Assets/ExplosiveLLC/Mage Warrior Mecanim Animation Pack/Animations/Mage@RangeAttack2.FBX.meta +++ b/Assets/ExplosiveLLC/Mage Warrior Mecanim Animation Pack/Animations/Mage@RangeAttack2.FBX.meta @@ -1,7 +1,14 @@ fileFormatVersion: 2 guid: 7a1612ec6fd9fbf4b917575b7c1ecdcb +AssetOrigin: + serializedVersion: 1 + productId: 39519 + packageName: Mage Warrior Mecanim Animation Pack + packageVersion: 2.4.1 + assetPath: Assets/ExplosiveLLC/Mage Warrior Mecanim Animation Pack/Animations/Mage@RangeAttack2.FBX + uploadId: 754788 ModelImporter: - serializedVersion: 25 + serializedVersion: 24300 internalIDToNameTable: - first: 1: 100000 @@ -467,18 +474,18 @@ ModelImporter: second: Mesh-Staff externalObjects: {} materials: - importMaterials: 0 + materialImportMode: 0 materialName: 0 materialSearch: 1 materialLocation: 0 + searchTexturesGlobally: 1 animations: legacyGenerateAnimations: 4 bakeSimulation: 0 resampleCurves: 1 optimizeGameObjects: 0 + removeConstantScaleCurves: 0 motionNodeName: Motion - rigImportErrors: - rigImportWarnings: animationImportErrors: animationImportWarnings: animationRetargetingWarnings: @@ -644,6 +651,49 @@ ModelImporter: maskType: 0 maskSource: {instanceID: 0} additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: StaffCast3_S_10302 + takeName: Take 001 + internalID: 1827226128182048838 + firstFrame: 16 + lastFrame: 46 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 1 + loopBlendPositionY: 1 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 1 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 1 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: + - time: 0 + functionName: LookAtTarget + data: + objectReferenceParameter: {instanceID: 0} + floatParameter: 0 + intParameter: 0 + messageOptions: 0 + - time: 0.35 + functionName: Projectile + data: Projectile_10302 + objectReferenceParameter: {instanceID: 0} + floatParameter: 0 + intParameter: 0 + messageOptions: 0 + transformMask: [] + maskType: 0 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 isReadable: 1 meshes: lODScreenPercentages: [] @@ -651,26 +701,39 @@ ModelImporter: meshCompression: 0 addColliders: 0 useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importPhysicalCameras: 1 importVisibility: 0 importBlendShapes: 0 importCameras: 0 importLights: 0 + nodeNameCollisionStrategy: 0 + fileIdsGeneration: 1 swapUVChannels: 0 generateSecondaryUV: 0 useFileUnits: 1 keepQuads: 0 weldVertices: 0 + bakeAxisConversion: 0 preserveHierarchy: 0 skinWeightsMode: 0 maxBonesPerVertex: 4 minBoneWeight: 0.001 + optimizeBones: 1 + generateMeshLods: 0 + meshLodGenerationFlags: 0 + maximumMeshLod: -1 meshOptimizationFlags: 0 indexFormat: 0 secondaryUVAngleDistortion: 8 secondaryUVAreaDistortion: 15.000001 secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 0 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 secondaryUVPackMargin: 4 useFileScale: 0 + strictVertexDataChecks: 0 tangentSpace: normalSmoothAngle: 60 normalImportMode: 2 @@ -681,7 +744,6 @@ ModelImporter: normalSmoothingSource: 0 referencedClips: [] importAnimation: 1 - copyAvatar: 1 humanDescription: serializedVersion: 3 human: @@ -1390,16 +1452,14 @@ ModelImporter: skeletonHasParents: 0 lastHumanDescriptionAvatarSource: {fileID: 9000000, guid: 7c72ed3f90575084c9f3b5b585887182, type: 3} + autoGenerateAvatarMappingIfUnspecified: 1 animationType: 3 humanoidOversampling: 1 + avatarSetup: 2 + addHumanoidExtraRootOnlyWhenUsingAvatar: 0 + importBlendShapeDeformPercent: 0 + remapMaterialsIfMaterialImportModeIsNone: 1 additionalBone: 0 userData: assetBundleName: assetBundleVariant: -AssetOrigin: - serializedVersion: 1 - productId: 39519 - packageName: Mage Warrior Mecanim Animation Pack - packageVersion: 2.4.1 - assetPath: Assets/ExplosiveLLC/Mage Warrior Mecanim Animation Pack/Animations/Mage@RangeAttack2.FBX - uploadId: 754788 diff --git a/Assets/Res_Addr/Animations/pcanim_sorceress.controller b/Assets/Res_Addr/Animations/pcanim_sorceress.controller index 489da4c4d..f0ac3a816 100644 --- a/Assets/Res_Addr/Animations/pcanim_sorceress.controller +++ b/Assets/Res_Addr/Animations/pcanim_sorceress.controller @@ -2303,7 +2303,7 @@ AnimatorState: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: attack3 - m_Speed: 0.7 + m_Speed: 1 m_CycleOffset: 0 m_Transitions: - {fileID: 7396964718502629461} @@ -2311,12 +2311,12 @@ AnimatorState: m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 m_WriteDefaultValues: 1 - m_Mirror: 0 + m_Mirror: 1 m_SpeedParameterActive: 0 m_MirrorParameterActive: 0 m_CycleOffsetParameterActive: 0 m_TimeParameterActive: 0 - m_Motion: {fileID: 3060872287085348379, guid: 8b4aea68a09b24149ab89408f7199bb1, + m_Motion: {fileID: 1827226128182048838, guid: 7a1612ec6fd9fbf4b917575b7c1ecdcb, type: 3} m_Tag: m_SpeedParameter: diff --git a/Assets/WL/Combat/CombatAnimMapping.asset b/Assets/WL/Combat/CombatAnimMapping.asset index dbf9c9424..404d1b222 100644 --- a/Assets/WL/Combat/CombatAnimMapping.asset +++ b/Assets/WL/Combat/CombatAnimMapping.asset @@ -984,16 +984,17 @@ MonoBehaviour: intParameter: 0 floatParameter: 0 - stateName: attack3 - sourceFbxPath: Assets/ExplosiveLLC/RPG Character Mecanim Animation Pack FREE/Animations/Unarmed/RPG-Character@Unarmed-Attack-R2.FBX + sourceFbxPath: Assets/ExplosiveLLC/Mage Warrior Mecanim Animation Pack/Animations/Mage@RangeAttack2.FBX subClipName: StaffCast3_S_{CID} sourceClipName: incomingExitTime: 0.85 createIfMissing: 1 - firstFrame: 0 - lastFrame: 13 - speed: 0.7 + firstFrame: 16 + lastFrame: 46 + speed: 1 maskPath: bakeRootY: -1 + mirror: 1 events: - functionName: LookAtTarget time: 0 @@ -1005,7 +1006,7 @@ MonoBehaviour: - functionName: Projectile time: 0 useNormalized: 1 - normalizedTime: 0.72 + normalizedTime: 0.35 stringParameter: Projectile_{CID} intParameter: 0 floatParameter: 0 diff --git a/Assets/WL/Combat/CombatAnimMapping.cs b/Assets/WL/Combat/CombatAnimMapping.cs index 69752e627..1c6c75961 100644 --- a/Assets/WL/Combat/CombatAnimMapping.cs +++ b/Assets/WL/Combat/CombatAnimMapping.cs @@ -93,6 +93,9 @@ namespace WL.Combat [Tooltip("#948 임포터 「Root Transform Position (Y) → Bake Into Pose」: -1 = 원본 클립 설정 그대로 · 0 = 끔(위아래 움직임이 포즈에서 빠져 루트모션으로 → PC 는 Y 루트모션을 버리므로 점프가 사라진다) · 1 = 켬")] public int bakeRootY = -1; + [Tooltip("#948-6 애니메이터 상태 거울(AnimatorState.mirror · humanoid 왼손↔오른손): 0 = 그대로 · 1 = 거울. 오른손 동작 클립을 「지팡이를 들지 않은 손」 동작으로 쓸 때(지팡이 3타 = Mage@RangeAttack2 거울)")] + public int mirror; + public List events = new List(); } diff --git a/Assets/WL/Combat/Weapon/Resources/WL/WLOrbFloat.json b/Assets/WL/Combat/Weapon/Resources/WL/WLOrbFloat.json index f729b1eb3..892324bdd 100644 --- a/Assets/WL/Combat/Weapon/Resources/WL/WLOrbFloat.json +++ b/Assets/WL/Combat/Weapon/Resources/WL/WLOrbFloat.json @@ -10,5 +10,7 @@ "bobHz": 1.0, "spinDegPerSec": 40.0, "tiltDeg": 0.0, + "centerChildren": 1, + "_note_948_6": "#948-6 PD 「감싸는 이펙트가 오브 위치와 어긋남 → 오브가 정중앙 · 감싸는 이펙트가 오브를 중점으로」 — 원본 Orb 프리팹의 고리(circle · Cylinder001 메시 입자)가 로컬 +0.727 옆에 있어 오브(inner_glow · 원점)를 중심으로 돌지 않았다(실측) → 부착 때 직접 자식 로컬 위치 0", "note": "#944 PD 「오브(손에 빛나는 원형 이펙트)의 크기를 눈에 띄게 5배 키워줘」 + 레퍼런스(펼친 손바닥 위에 떠서 천천히 흔들리는 빛 고리 · 아트는 무시 · 위치·동작만) — 맹약(1057 · 10301) 무기 Orb 프리팹을 WLWeaponFitter 보정 뒤 ×5 · 손 소켓 위 0.25 m 부유(흔들림 0.04 m · 1 Hz · 회전 40°/s). 값은 Play 실측 뒤 보정." } diff --git a/Assets/WL/Combat/Weapon/Resources/WL/WLWeaponTipGlow.json b/Assets/WL/Combat/Weapon/Resources/WL/WLWeaponTipGlow.json index c92d14640..62cc978a3 100644 --- a/Assets/WL/Combat/Weapon/Resources/WL/WLWeaponTipGlow.json +++ b/Assets/WL/Combat/Weapon/Resources/WL/WLWeaponTipGlow.json @@ -11,8 +11,9 @@ "pulseSeconds": 1.6, "light": 1, "lightColor": [ 1.0, 0.78, 0.42, 1.0 ], - "lightRange": 0.8, - "lightIntensity": 0.6, + "lightRange": 0.3, + "lightIntensity": 1.2, + "_note_948_6": "#948-6 PD 「광원이 바닥에 반사되지 않도록 — 지팡이만 빛나게」 → 점광원 범위 0.8 → 0.3 m(머리 표면 0.08 m 만 닿고 바닥(약 1 m 아래)엔 못 미침) · 세기 1.2 로 머리 밝기 유지", "tipPull": 0.08, "cameraPull": 0.10, "_note_948_5": "#948-5 PD 「둥근 부분이 특정 공격 중에만 잠시 빛나고 평소엔 꺼짐」 = 사본 구슬 입자가 1 s 주기 · 수명 0~1.01 s · 크기 0~1.0 무작위(원본 팩 = 1회성 획득 연출)라 깜빡였다(실측) · 「둥근 이펙트 오브젝트가 튀어나와 있는데 둥근 부분에 항상 가려지면」 → 구슬 렌더러 끔(사본 WL_Fx_TipMarble 루트) · 남는 것 = 부드러운 빛무리(aura · 시작 크기 ×2.07 = 머리보다 조금 큰 0.2~0.27 m) + 반짝이 + 점광원(0.6) · 홀더 = 머리 중심(tipPull 0.08 = 머리 반지름 실측 0.099 × 손 배율) 에서 카메라 쪽 0.10 m(cameraPull · 빛무리가 머리 앞에 그려져 머리 자체가 빛나 보임 · 단단한 물체 없음)" diff --git a/Assets/WL/Combat/Weapon/WLOrbFloat.cs b/Assets/WL/Combat/Weapon/WLOrbFloat.cs index 2fe18662f..859092716 100644 --- a/Assets/WL/Combat/Weapon/WLOrbFloat.cs +++ b/Assets/WL/Combat/Weapon/WLOrbFloat.cs @@ -24,6 +24,7 @@ namespace WL.Combat.Weapon public float bobHz = 1.0f; // 흔들림 주기(초당) public float spinDegPerSec = 40f; // 월드 위 축 회전 public float tiltDeg = 0f; // 고리를 눕히는 각(0 = 프리팹 그대로) + public int centerChildren = 0; // #948-6 1 = 오브 프리팹 직접 자식(circle 고리 등)의 로컬 위치를 0 으로 — 감싸는 이펙트가 오브 중심을 돈다(원본 circle 은 +0.727 옆에 있어 어긋남) public string note = ""; } @@ -60,7 +61,9 @@ namespace WL.Combat.Weapon f = weapon.gameObject.AddComponent(); f._socket = weapon.parent; f._pc = f._socket != null ? f._socket.root : null; f._baseScale = weapon.localScale; f._t0 = Time.time; weapon.localScale = f._baseScale * Mathf.Max(0.01f, c.scaleMul); - Attached++; LastLog = "오브 부착 " + n + " 소켓=" + (f._socket != null ? f._socket.name : "-") + " 크기 ×" + c.scaleMul + " 높이 " + c.hoverHeight; + int centered = 0; + if (c.centerChildren != 0) for (int i = 0; i < weapon.childCount; i++) { var ch = weapon.GetChild(i); if (ch.localPosition.sqrMagnitude > 1e-6f) { ch.localPosition = Vector3.zero; centered++; } } // #948-6 감싸는 고리를 오브 중심으로 + Attached++; LastLog = "오브 부착 " + n + " 소켓=" + (f._socket != null ? f._socket.name : "-") + " 크기 ×" + c.scaleMul + " 높이 " + c.hoverHeight + (centered > 0 ? " · 자식 중심 " + centered : ""); return true; } catch (System.Exception ex) { LastLog = "오브 부착 실패 — " + ex.Message; return false; }