WL #948-6 마법검·오브 PD 재지적 3건 — ① 지팡이 끝 점광원 범위 0.8 → 0.3 m(바닥 반사 제거 · 세기 1.2) ② 3타 = Mage@RangeAttack2 f16~46 거울(mirror · 빈 왼손 앞 0.3 m 뻗기 · 상체 숙임 0.04 · 뻗은 채 약 0.5 s 고정 · 발사 0.35) — 매핑 행 mirror 신설(CombatAnimMapping.cs · WL_CombatAnimSetup state.mirror) ③ 오브(맹약 1057) 고리 circle 이 오브 옆 +0.727 에 있던 것 → WLOrbFloat centerChildren(부착 때 자식 로컬 위치 0 · 고리-오브 거리 0.000 실측)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
ce866cb7fc
commit
34181e6e8e
|
|
@ -149,6 +149,7 @@ public static class WL_CombatAnimSetup
|
||||||
{
|
{
|
||||||
state.motion = clip;
|
state.motion = clip;
|
||||||
if (st.speed > 0f) state.speed = st.speed; // #834 상태 재생 속도(비수 3타 등)
|
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++;
|
touchedStates++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,14 @@
|
||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 7a1612ec6fd9fbf4b917575b7c1ecdcb
|
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:
|
ModelImporter:
|
||||||
serializedVersion: 25
|
serializedVersion: 24300
|
||||||
internalIDToNameTable:
|
internalIDToNameTable:
|
||||||
- first:
|
- first:
|
||||||
1: 100000
|
1: 100000
|
||||||
|
|
@ -467,18 +474,18 @@ ModelImporter:
|
||||||
second: Mesh-Staff
|
second: Mesh-Staff
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
materials:
|
materials:
|
||||||
importMaterials: 0
|
materialImportMode: 0
|
||||||
materialName: 0
|
materialName: 0
|
||||||
materialSearch: 1
|
materialSearch: 1
|
||||||
materialLocation: 0
|
materialLocation: 0
|
||||||
|
searchTexturesGlobally: 1
|
||||||
animations:
|
animations:
|
||||||
legacyGenerateAnimations: 4
|
legacyGenerateAnimations: 4
|
||||||
bakeSimulation: 0
|
bakeSimulation: 0
|
||||||
resampleCurves: 1
|
resampleCurves: 1
|
||||||
optimizeGameObjects: 0
|
optimizeGameObjects: 0
|
||||||
|
removeConstantScaleCurves: 0
|
||||||
motionNodeName: Motion
|
motionNodeName: Motion
|
||||||
rigImportErrors:
|
|
||||||
rigImportWarnings:
|
|
||||||
animationImportErrors:
|
animationImportErrors:
|
||||||
animationImportWarnings:
|
animationImportWarnings:
|
||||||
animationRetargetingWarnings:
|
animationRetargetingWarnings:
|
||||||
|
|
@ -644,6 +651,49 @@ ModelImporter:
|
||||||
maskType: 0
|
maskType: 0
|
||||||
maskSource: {instanceID: 0}
|
maskSource: {instanceID: 0}
|
||||||
additiveReferencePoseFrame: 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
|
isReadable: 1
|
||||||
meshes:
|
meshes:
|
||||||
lODScreenPercentages: []
|
lODScreenPercentages: []
|
||||||
|
|
@ -651,26 +701,39 @@ ModelImporter:
|
||||||
meshCompression: 0
|
meshCompression: 0
|
||||||
addColliders: 0
|
addColliders: 0
|
||||||
useSRGBMaterialColor: 1
|
useSRGBMaterialColor: 1
|
||||||
|
sortHierarchyByName: 1
|
||||||
|
importPhysicalCameras: 1
|
||||||
importVisibility: 0
|
importVisibility: 0
|
||||||
importBlendShapes: 0
|
importBlendShapes: 0
|
||||||
importCameras: 0
|
importCameras: 0
|
||||||
importLights: 0
|
importLights: 0
|
||||||
|
nodeNameCollisionStrategy: 0
|
||||||
|
fileIdsGeneration: 1
|
||||||
swapUVChannels: 0
|
swapUVChannels: 0
|
||||||
generateSecondaryUV: 0
|
generateSecondaryUV: 0
|
||||||
useFileUnits: 1
|
useFileUnits: 1
|
||||||
keepQuads: 0
|
keepQuads: 0
|
||||||
weldVertices: 0
|
weldVertices: 0
|
||||||
|
bakeAxisConversion: 0
|
||||||
preserveHierarchy: 0
|
preserveHierarchy: 0
|
||||||
skinWeightsMode: 0
|
skinWeightsMode: 0
|
||||||
maxBonesPerVertex: 4
|
maxBonesPerVertex: 4
|
||||||
minBoneWeight: 0.001
|
minBoneWeight: 0.001
|
||||||
|
optimizeBones: 1
|
||||||
|
generateMeshLods: 0
|
||||||
|
meshLodGenerationFlags: 0
|
||||||
|
maximumMeshLod: -1
|
||||||
meshOptimizationFlags: 0
|
meshOptimizationFlags: 0
|
||||||
indexFormat: 0
|
indexFormat: 0
|
||||||
secondaryUVAngleDistortion: 8
|
secondaryUVAngleDistortion: 8
|
||||||
secondaryUVAreaDistortion: 15.000001
|
secondaryUVAreaDistortion: 15.000001
|
||||||
secondaryUVHardAngle: 88
|
secondaryUVHardAngle: 88
|
||||||
|
secondaryUVMarginMethod: 0
|
||||||
|
secondaryUVMinLightmapResolution: 40
|
||||||
|
secondaryUVMinObjectScale: 1
|
||||||
secondaryUVPackMargin: 4
|
secondaryUVPackMargin: 4
|
||||||
useFileScale: 0
|
useFileScale: 0
|
||||||
|
strictVertexDataChecks: 0
|
||||||
tangentSpace:
|
tangentSpace:
|
||||||
normalSmoothAngle: 60
|
normalSmoothAngle: 60
|
||||||
normalImportMode: 2
|
normalImportMode: 2
|
||||||
|
|
@ -681,7 +744,6 @@ ModelImporter:
|
||||||
normalSmoothingSource: 0
|
normalSmoothingSource: 0
|
||||||
referencedClips: []
|
referencedClips: []
|
||||||
importAnimation: 1
|
importAnimation: 1
|
||||||
copyAvatar: 1
|
|
||||||
humanDescription:
|
humanDescription:
|
||||||
serializedVersion: 3
|
serializedVersion: 3
|
||||||
human:
|
human:
|
||||||
|
|
@ -1390,16 +1452,14 @@ ModelImporter:
|
||||||
skeletonHasParents: 0
|
skeletonHasParents: 0
|
||||||
lastHumanDescriptionAvatarSource: {fileID: 9000000, guid: 7c72ed3f90575084c9f3b5b585887182,
|
lastHumanDescriptionAvatarSource: {fileID: 9000000, guid: 7c72ed3f90575084c9f3b5b585887182,
|
||||||
type: 3}
|
type: 3}
|
||||||
|
autoGenerateAvatarMappingIfUnspecified: 1
|
||||||
animationType: 3
|
animationType: 3
|
||||||
humanoidOversampling: 1
|
humanoidOversampling: 1
|
||||||
|
avatarSetup: 2
|
||||||
|
addHumanoidExtraRootOnlyWhenUsingAvatar: 0
|
||||||
|
importBlendShapeDeformPercent: 0
|
||||||
|
remapMaterialsIfMaterialImportModeIsNone: 1
|
||||||
additionalBone: 0
|
additionalBone: 0
|
||||||
userData:
|
userData:
|
||||||
assetBundleName:
|
assetBundleName:
|
||||||
assetBundleVariant:
|
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
|
|
||||||
|
|
|
||||||
|
|
@ -2303,7 +2303,7 @@ AnimatorState:
|
||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_Name: attack3
|
m_Name: attack3
|
||||||
m_Speed: 0.7
|
m_Speed: 1
|
||||||
m_CycleOffset: 0
|
m_CycleOffset: 0
|
||||||
m_Transitions:
|
m_Transitions:
|
||||||
- {fileID: 7396964718502629461}
|
- {fileID: 7396964718502629461}
|
||||||
|
|
@ -2311,12 +2311,12 @@ AnimatorState:
|
||||||
m_Position: {x: 50, y: 50, z: 0}
|
m_Position: {x: 50, y: 50, z: 0}
|
||||||
m_IKOnFeet: 0
|
m_IKOnFeet: 0
|
||||||
m_WriteDefaultValues: 1
|
m_WriteDefaultValues: 1
|
||||||
m_Mirror: 0
|
m_Mirror: 1
|
||||||
m_SpeedParameterActive: 0
|
m_SpeedParameterActive: 0
|
||||||
m_MirrorParameterActive: 0
|
m_MirrorParameterActive: 0
|
||||||
m_CycleOffsetParameterActive: 0
|
m_CycleOffsetParameterActive: 0
|
||||||
m_TimeParameterActive: 0
|
m_TimeParameterActive: 0
|
||||||
m_Motion: {fileID: 3060872287085348379, guid: 8b4aea68a09b24149ab89408f7199bb1,
|
m_Motion: {fileID: 1827226128182048838, guid: 7a1612ec6fd9fbf4b917575b7c1ecdcb,
|
||||||
type: 3}
|
type: 3}
|
||||||
m_Tag:
|
m_Tag:
|
||||||
m_SpeedParameter:
|
m_SpeedParameter:
|
||||||
|
|
|
||||||
|
|
@ -984,16 +984,17 @@ MonoBehaviour:
|
||||||
intParameter: 0
|
intParameter: 0
|
||||||
floatParameter: 0
|
floatParameter: 0
|
||||||
- stateName: attack3
|
- 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}
|
subClipName: StaffCast3_S_{CID}
|
||||||
sourceClipName:
|
sourceClipName:
|
||||||
incomingExitTime: 0.85
|
incomingExitTime: 0.85
|
||||||
createIfMissing: 1
|
createIfMissing: 1
|
||||||
firstFrame: 0
|
firstFrame: 16
|
||||||
lastFrame: 13
|
lastFrame: 46
|
||||||
speed: 0.7
|
speed: 1
|
||||||
maskPath:
|
maskPath:
|
||||||
bakeRootY: -1
|
bakeRootY: -1
|
||||||
|
mirror: 1
|
||||||
events:
|
events:
|
||||||
- functionName: LookAtTarget
|
- functionName: LookAtTarget
|
||||||
time: 0
|
time: 0
|
||||||
|
|
@ -1005,7 +1006,7 @@ MonoBehaviour:
|
||||||
- functionName: Projectile
|
- functionName: Projectile
|
||||||
time: 0
|
time: 0
|
||||||
useNormalized: 1
|
useNormalized: 1
|
||||||
normalizedTime: 0.72
|
normalizedTime: 0.35
|
||||||
stringParameter: Projectile_{CID}
|
stringParameter: Projectile_{CID}
|
||||||
intParameter: 0
|
intParameter: 0
|
||||||
floatParameter: 0
|
floatParameter: 0
|
||||||
|
|
|
||||||
|
|
@ -93,6 +93,9 @@ namespace WL.Combat
|
||||||
[Tooltip("#948 임포터 「Root Transform Position (Y) → Bake Into Pose」: -1 = 원본 클립 설정 그대로 · 0 = 끔(위아래 움직임이 포즈에서 빠져 루트모션으로 → PC 는 Y 루트모션을 버리므로 점프가 사라진다) · 1 = 켬")]
|
[Tooltip("#948 임포터 「Root Transform Position (Y) → Bake Into Pose」: -1 = 원본 클립 설정 그대로 · 0 = 끔(위아래 움직임이 포즈에서 빠져 루트모션으로 → PC 는 Y 루트모션을 버리므로 점프가 사라진다) · 1 = 켬")]
|
||||||
public int bakeRootY = -1;
|
public int bakeRootY = -1;
|
||||||
|
|
||||||
|
[Tooltip("#948-6 애니메이터 상태 거울(AnimatorState.mirror · humanoid 왼손↔오른손): 0 = 그대로 · 1 = 거울. 오른손 동작 클립을 「지팡이를 들지 않은 손」 동작으로 쓸 때(지팡이 3타 = Mage@RangeAttack2 거울)")]
|
||||||
|
public int mirror;
|
||||||
|
|
||||||
public List<AnimEventSpec> events = new List<AnimEventSpec>();
|
public List<AnimEventSpec> events = new List<AnimEventSpec>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,5 +10,7 @@
|
||||||
"bobHz": 1.0,
|
"bobHz": 1.0,
|
||||||
"spinDegPerSec": 40.0,
|
"spinDegPerSec": 40.0,
|
||||||
"tiltDeg": 0.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 실측 뒤 보정."
|
"note": "#944 PD 「오브(손에 빛나는 원형 이펙트)의 크기를 눈에 띄게 5배 키워줘」 + 레퍼런스(펼친 손바닥 위에 떠서 천천히 흔들리는 빛 고리 · 아트는 무시 · 위치·동작만) — 맹약(1057 · 10301) 무기 Orb 프리팹을 WLWeaponFitter 보정 뒤 ×5 · 손 소켓 위 0.25 m 부유(흔들림 0.04 m · 1 Hz · 회전 40°/s). 값은 Play 실측 뒤 보정."
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,9 @@
|
||||||
"pulseSeconds": 1.6,
|
"pulseSeconds": 1.6,
|
||||||
"light": 1,
|
"light": 1,
|
||||||
"lightColor": [ 1.0, 0.78, 0.42, 1.0 ],
|
"lightColor": [ 1.0, 0.78, 0.42, 1.0 ],
|
||||||
"lightRange": 0.8,
|
"lightRange": 0.3,
|
||||||
"lightIntensity": 0.6,
|
"lightIntensity": 1.2,
|
||||||
|
"_note_948_6": "#948-6 PD 「광원이 바닥에 반사되지 않도록 — 지팡이만 빛나게」 → 점광원 범위 0.8 → 0.3 m(머리 표면 0.08 m 만 닿고 바닥(약 1 m 아래)엔 못 미침) · 세기 1.2 로 머리 밝기 유지",
|
||||||
"tipPull": 0.08,
|
"tipPull": 0.08,
|
||||||
"cameraPull": 0.10,
|
"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 · 빛무리가 머리 앞에 그려져 머리 자체가 빛나 보임 · 단단한 물체 없음)"
|
"_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 · 빛무리가 머리 앞에 그려져 머리 자체가 빛나 보임 · 단단한 물체 없음)"
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ namespace WL.Combat.Weapon
|
||||||
public float bobHz = 1.0f; // 흔들림 주기(초당)
|
public float bobHz = 1.0f; // 흔들림 주기(초당)
|
||||||
public float spinDegPerSec = 40f; // 월드 위 축 회전
|
public float spinDegPerSec = 40f; // 월드 위 축 회전
|
||||||
public float tiltDeg = 0f; // 고리를 눕히는 각(0 = 프리팹 그대로)
|
public float tiltDeg = 0f; // 고리를 눕히는 각(0 = 프리팹 그대로)
|
||||||
|
public int centerChildren = 0; // #948-6 1 = 오브 프리팹 직접 자식(circle 고리 등)의 로컬 위치를 0 으로 — 감싸는 이펙트가 오브 중심을 돈다(원본 circle 은 +0.727 옆에 있어 어긋남)
|
||||||
public string note = "";
|
public string note = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -60,7 +61,9 @@ namespace WL.Combat.Weapon
|
||||||
f = weapon.gameObject.AddComponent<WLOrbFloat>();
|
f = weapon.gameObject.AddComponent<WLOrbFloat>();
|
||||||
f._socket = weapon.parent; f._pc = f._socket != null ? f._socket.root : null; f._baseScale = weapon.localScale; f._t0 = Time.time;
|
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);
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
catch (System.Exception ex) { LastLog = "오브 부착 실패 — " + ex.Message; return false; }
|
catch (System.Exception ex) { LastLog = "오브 부착 실패 — " + ex.Message; return false; }
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue