feat: 채널링 빔 스킬 시스템 구현 및 PolygonParticleFX VFX 에셋 추가
- SkillData: 채널링 필드 추가 (지속시간, 틱 간격, 틱/종료 효과, VFX 프리팹, 마운트 경로, 크기 배율) - SkillController: 채널링 상태 관리 (Start/Update/End), VFX 생성/파괴, 틱 효과 주기 발동, 버튼 해제로 중단 - SkillEffect: Beam(원통) 범위 판정 추가 (OverlapCapsule), 디버그 시각화 - PlayerSkillInput: 스킬 취소(canceled) 이벤트 구독 → 채널링 중단 통지 - SkillLoadoutEntry: 채널링 틱/종료 효과 수집 메서드 추가 - 스킬 데이터/이펙트/애니메이션/VFX 에셋 추가 (채널링 스킬용) - PolygonParticleFX VFX 에셋 패키지 추가 (Materials, Models, Prefabs, Textures, Scenes)
This commit is contained in:
42034
Assets/_Game/Animations/Anim_Player_마법_마법광선_0.anim
Normal file
42034
Assets/_Game/Animations/Anim_Player_마법_마법광선_0.anim
Normal file
File diff suppressed because it is too large
Load Diff
8
Assets/_Game/Animations/Anim_Player_마법_마법광선_0.anim.meta
Normal file
8
Assets/_Game/Animations/Anim_Player_마법_마법광선_0.anim.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5c93f4c7dbc1b314d8e7b318826ef530
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
38830
Assets/_Game/Animations/Anim_Player_마법_마법광선_1.anim
Normal file
38830
Assets/_Game/Animations/Anim_Player_마법_마법광선_1.anim
Normal file
File diff suppressed because it is too large
Load Diff
8
Assets/_Game/Animations/Anim_Player_마법_마법광선_1.anim.meta
Normal file
8
Assets/_Game/Animations/Anim_Player_마법_마법광선_1.anim.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: afba3dfa5c315c04fa8af0e2e52aee3c
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -6,7 +6,7 @@ AnimationClip:
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: "Anim_Player_\uD55C\uC190_\uB9C8\uBC95\uBC1C\uC0AC_0"
|
||||
m_Name: "Anim_Player_\uB9C8\uBC95_\uB9C8\uBC95\uBC1C\uC0AC_0"
|
||||
serializedVersion: 7
|
||||
m_Legacy: 0
|
||||
m_Compressed: 0
|
||||
@@ -6,7 +6,7 @@ AnimationClip:
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: "Anim_Player_\uD55C\uC190_\uB9C8\uBC95\uC624\uB984_0"
|
||||
m_Name: "Anim_Player_\uB9C8\uBC95_\uB9C8\uBC95\uC624\uB984_0"
|
||||
serializedVersion: 7
|
||||
m_Legacy: 0
|
||||
m_Compressed: 0
|
||||
@@ -6,7 +6,7 @@ AnimationClip:
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: "Anim_Player_\uD55C\uC190_\uB9C8\uBC95\uD718\uB450\uB974\uAE30_0"
|
||||
m_Name: "Anim_Player_\uB9C8\uBC95_\uB9C8\uBC95\uD718\uB450\uB974\uAE30_0"
|
||||
serializedVersion: 7
|
||||
m_Legacy: 0
|
||||
m_Compressed: 0
|
||||
@@ -12,4 +12,28 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: 144e0ffda72c68941800f40c5755fee8, type: 3}
|
||||
m_Name: SkillRegistry
|
||||
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillRegistry
|
||||
playerSkills: []
|
||||
playerSkills:
|
||||
- {fileID: 11400000, guid: 491ca92a12e0b23408e4b18b00606e85, type: 2}
|
||||
- {fileID: 11400000, guid: 1020083ab98b8214f918fa2ab7c1a3a1, type: 2}
|
||||
- {fileID: 11400000, guid: 5471bbcd63b72054e93bf4d85eed52d3, type: 2}
|
||||
- {fileID: 11400000, guid: ffbdc00937ab5bb4a908e05cf3f7f50a, type: 2}
|
||||
- {fileID: 11400000, guid: 4653bb40be03e3d418389a2268afb3e5, type: 2}
|
||||
- {fileID: 11400000, guid: ea124c6d433217f458eac16db0f9115b, type: 2}
|
||||
- {fileID: 11400000, guid: 8d988890e48d61e49b51798bc3c2b1bc, type: 2}
|
||||
- {fileID: 11400000, guid: f40f7b46c3150804cb6fe9e38fd9f0df, type: 2}
|
||||
- {fileID: 11400000, guid: a91f7cec6259877409b03c6c938bdd8d, type: 2}
|
||||
- {fileID: 11400000, guid: 6b601dec8dbf0a04fa29b9e2456e883a, type: 2}
|
||||
- {fileID: 11400000, guid: 66885753ef6a6d94786d1131a0a61b7b, type: 2}
|
||||
- {fileID: 11400000, guid: 0438dd507266d7a48aa76af00ad6a725, type: 2}
|
||||
- {fileID: 11400000, guid: b7e1f5a6b8c9d0e2f3a4b5c6d7e8a9f0, type: 2}
|
||||
- {fileID: 11400000, guid: a36eb41df76200a4982b3a85d956a55b, type: 2}
|
||||
- {fileID: 11400000, guid: 5f92a97bbfe18454b81ec5c6c8a465cf, type: 2}
|
||||
- {fileID: 11400000, guid: 219227f1d7a9d7f4b9e08f340f80a5c0, type: 2}
|
||||
- {fileID: 11400000, guid: a8f2a6b7c9d0e1f3a4b5c6d7e8a9f0b1, type: 2}
|
||||
- {fileID: 11400000, guid: 2b3c4d5e6f7890abcdef1234567890ab, type: 2}
|
||||
- {fileID: 11400000, guid: 09a3b7c8d0e1f2a4b5c6d7e8a9f0b1c2, type: 2}
|
||||
- {fileID: 11400000, guid: b7f09e0e899c8fc4bb2cc9204cc6eb4a, type: 2}
|
||||
- {fileID: 11400000, guid: 5e89e0c07a0cdcb4abaff9b34b40ee80, type: 2}
|
||||
- {fileID: 11400000, guid: b86e7a8cbae3eb24b940754ab9748af5, type: 2}
|
||||
- {fileID: 11400000, guid: 1cac7541505a6e74abbcdd41ce1c402d, type: 2}
|
||||
- {fileID: 11400000, guid: b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5, type: 2}
|
||||
|
||||
@@ -32,7 +32,10 @@ MonoBehaviour:
|
||||
manaCost: 0
|
||||
maxGemSlotCount: 2
|
||||
castStartEffects: []
|
||||
effects:
|
||||
- {fileID: 11400000, guid: 87b064a0134987b4b9638e184ab07411, type: 2}
|
||||
- {fileID: 11400000, guid: 2db6d8d7f5da4f7ab9f0a12e65498ab1, type: 2}
|
||||
- {fileID: 0}
|
||||
triggeredEffects:
|
||||
- triggerIndex: 0
|
||||
effects:
|
||||
- {fileID: 11400000, guid: 87b064a0134987b4b9638e184ab07411, type: 2}
|
||||
- triggerIndex: 1
|
||||
effects:
|
||||
- {fileID: 11400000, guid: 2db6d8d7f5da4f7ab9f0a12e65498ab1, type: 2}
|
||||
|
||||
@@ -33,4 +33,4 @@ MonoBehaviour:
|
||||
maxGemSlotCount: 2
|
||||
castStartEffects:
|
||||
- {fileID: 11400000, guid: 032be692478542b2b7eae48b2a5b29c1, type: 2}
|
||||
effects: []
|
||||
triggeredEffects: []
|
||||
|
||||
@@ -32,6 +32,10 @@ MonoBehaviour:
|
||||
manaCost: 0
|
||||
maxGemSlotCount: 2
|
||||
castStartEffects: []
|
||||
effects:
|
||||
- {fileID: 11400000, guid: 0f134a897a7e4d0e98c8d9058b1d79d1, type: 2}
|
||||
- {fileID: 11400000, guid: 216d4b5f6ce9479e94e0d306399f4891, type: 2}
|
||||
triggeredEffects:
|
||||
- triggerIndex: 0
|
||||
effects:
|
||||
- {fileID: 11400000, guid: 0f134a897a7e4d0e98c8d9058b1d79d1, type: 2}
|
||||
- triggerIndex: 1
|
||||
effects:
|
||||
- {fileID: 11400000, guid: 216d4b5f6ce9479e94e0d306399f4891, type: 2}
|
||||
|
||||
@@ -34,7 +34,10 @@ MonoBehaviour:
|
||||
manaCost: 0
|
||||
maxGemSlotCount: 2
|
||||
castStartEffects: []
|
||||
effects:
|
||||
- {fileID: 11400000, guid: 87b064a0134987b4b9638e184ab07411, type: 2}
|
||||
- {fileID: 11400000, guid: 2db6d8d7f5da4f7ab9f0a12e65498ab1, type: 2}
|
||||
- {fileID: 0}
|
||||
triggeredEffects:
|
||||
- triggerIndex: 0
|
||||
effects:
|
||||
- {fileID: 11400000, guid: 87b064a0134987b4b9638e184ab07411, type: 2}
|
||||
- triggerIndex: 1
|
||||
effects:
|
||||
- {fileID: 11400000, guid: 2db6d8d7f5da4f7ab9f0a12e65498ab1, type: 2}
|
||||
|
||||
@@ -10,7 +10,7 @@ MonoBehaviour:
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 94f0a76cebcac2f4fb5daf1b675fd79f, type: 3}
|
||||
m_Name: "Data_Skill_Player_\uB9C8\uBC95_\uAD11\uC120"
|
||||
m_Name: "Data_Skill_Player_\uB9C8\uBC95_\uB9C8\uBC95\uAD11\uC120"
|
||||
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillData
|
||||
skillName: "\uAD11\uC120"
|
||||
description:
|
||||
@@ -18,7 +18,9 @@ MonoBehaviour:
|
||||
skillRole: 1
|
||||
activationType: 1
|
||||
baseTypes: 1
|
||||
animationClips: []
|
||||
animationClips:
|
||||
- {fileID: 7400000, guid: 5c93f4c7dbc1b314d8e7b318826ef530, type: 2}
|
||||
- {fileID: 7400000, guid: afba3dfa5c315c04fa8af0e2e52aee3c, type: 2}
|
||||
animationSpeed: 1
|
||||
useRootMotion: 0
|
||||
ignoreRootMotionY: 1
|
||||
@@ -27,9 +29,18 @@ MonoBehaviour:
|
||||
blockJumpWhileCasting: 1
|
||||
blockOtherSkillsWhileCasting: 1
|
||||
allowedWeaponTraits: 8
|
||||
cooldown: 3
|
||||
manaCost: 8
|
||||
cooldown: 5
|
||||
manaCost: 10
|
||||
maxGemSlotCount: 2
|
||||
castStartEffects: []
|
||||
effects:
|
||||
triggeredEffects: []
|
||||
isChanneling: 1
|
||||
channelDuration: 3
|
||||
channelTickInterval: 0.5
|
||||
channelTickEffects:
|
||||
- {fileID: 11400000, guid: 958fe7b9b5d33bb4d83303d3478756ba, type: 2}
|
||||
channelEndEffects: []
|
||||
channelVfxPrefab: {fileID: 1062685050423962, guid: 75ec5047abb8242419c33baf6ca45ca8, type: 3}
|
||||
channelVfxMountPath: CastPoint
|
||||
channelVfxLengthScale: 1
|
||||
channelVfxWidthScale: 1
|
||||
@@ -10,7 +10,7 @@ MonoBehaviour:
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 94f0a76cebcac2f4fb5daf1b675fd79f, type: 3}
|
||||
m_Name: "Data_Skill_Player_\uD55C\uC190_\uB9C8\uBC95\uBC1C\uC0AC"
|
||||
m_Name: "Data_Skill_Player_\uB9C8\uBC95_\uB9C8\uBC95\uBC1C\uC0AC"
|
||||
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillData
|
||||
skillName: "\uB9C8\uBC95 \uBC1C\uC0AC"
|
||||
description:
|
||||
@@ -32,5 +32,7 @@ MonoBehaviour:
|
||||
manaCost: 10
|
||||
maxGemSlotCount: 2
|
||||
castStartEffects: []
|
||||
effects:
|
||||
- {fileID: 11400000, guid: d5c9d3e4a6b7c8d0e1f2a3b4c5d6e7f8, type: 2}
|
||||
triggeredEffects:
|
||||
- triggerIndex: 0
|
||||
effects:
|
||||
- {fileID: 11400000, guid: d5c9d3e4a6b7c8d0e1f2a3b4c5d6e7f8, type: 2}
|
||||
@@ -10,7 +10,7 @@ MonoBehaviour:
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 94f0a76cebcac2f4fb5daf1b675fd79f, type: 3}
|
||||
m_Name: "Data_Skill_Player_\uD55C\uC190_\uB9C8\uBC95\uC624\uB984"
|
||||
m_Name: "Data_Skill_Player_\uB9C8\uBC95_\uB9C8\uBC95\uC624\uB984"
|
||||
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillData
|
||||
skillName: "\uB9C8\uBC95 \uC624\uB984"
|
||||
description:
|
||||
@@ -33,5 +33,7 @@ MonoBehaviour:
|
||||
maxGemSlotCount: 2
|
||||
castStartEffects:
|
||||
- {fileID: 11400000, guid: f7a3b2c1d4e50968abcdef0123456789, type: 2}
|
||||
effects:
|
||||
- {fileID: 11400000, guid: 1a2b3c4d5e6f7890abcdef1234567890, type: 2}
|
||||
triggeredEffects:
|
||||
- triggerIndex: 0
|
||||
effects:
|
||||
- {fileID: 11400000, guid: 1a2b3c4d5e6f7890abcdef1234567890, type: 2}
|
||||
@@ -10,7 +10,7 @@ MonoBehaviour:
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 94f0a76cebcac2f4fb5daf1b675fd79f, type: 3}
|
||||
m_Name: "Data_Skill_Player_\uD55C\uC190_\uB9C8\uBC95\uD718\uB450\uB974\uAE30"
|
||||
m_Name: "Data_Skill_Player_\uB9C8\uBC95_\uB9C8\uBC95\uD718\uB450\uB974\uAE30"
|
||||
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillData
|
||||
skillName: "\uB9C8\uBC95 \uD754\uB450\uB824\uAE30"
|
||||
description:
|
||||
@@ -32,5 +32,7 @@ MonoBehaviour:
|
||||
manaCost: 8
|
||||
maxGemSlotCount: 2
|
||||
castStartEffects: []
|
||||
effects:
|
||||
- {fileID: 11400000, guid: c6d0e4f5a7b8c9d1e2f3a4b5c6d7e8a9, type: 2}
|
||||
triggeredEffects:
|
||||
- triggerIndex: 0
|
||||
effects:
|
||||
- {fileID: 11400000, guid: c6d0e4f5a7b8c9d1e2f3a4b5c6d7e8a9, type: 2}
|
||||
@@ -31,5 +31,14 @@ MonoBehaviour:
|
||||
manaCost: 8
|
||||
maxGemSlotCount: 2
|
||||
castStartEffects: []
|
||||
effects:
|
||||
triggeredEffects: []
|
||||
isChanneling: 1
|
||||
channelDuration: 2.5
|
||||
channelTickInterval: 0.5
|
||||
channelTickEffects:
|
||||
- {fileID: 11400000, guid: 3c87c068bc01da443bbb6e89eaaceb18, type: 2}
|
||||
channelEndEffects: []
|
||||
channelVfxPrefab: {fileID: 100100000, guid: b9aac1c232ed68c44be97372b7fc6914, type: 3}
|
||||
channelVfxMountPath: CastPoint
|
||||
channelVfxLengthScale: 1
|
||||
channelVfxWidthScale: 1
|
||||
|
||||
@@ -12,17 +12,17 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: 58efb3c775496fa40b801b21127a011e, type: 3}
|
||||
m_Name: "Data_SkillEffect_Player_\uAD11\uC120_0_\uB370\uBBF8\uC9C0"
|
||||
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.Effects.DamageEffect
|
||||
targetType: 0
|
||||
targetType: 1
|
||||
targetTeam: 0
|
||||
areaCenter: 0
|
||||
areaShape: 0
|
||||
areaShape: 2
|
||||
targetLayers:
|
||||
serializedVersion: 2
|
||||
m_Bits: 0
|
||||
m_Bits: 64
|
||||
includeCasterInArea: 0
|
||||
areaRadius: 3
|
||||
areaRadius: 15
|
||||
fanOriginDistance: 1
|
||||
fanRadius: 3
|
||||
fanRadius: 1
|
||||
fanHalfAngle: 45
|
||||
baseDamage: 5
|
||||
damageType: 1
|
||||
|
||||
@@ -10,7 +10,7 @@ MonoBehaviour:
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: a3139ddf07cfe324fa692a88cd565e24, type: 3}
|
||||
m_Name: "Data_SkillEffect_Player_\uD55C\uC190_\uB9C8\uBC95\uBC1C\uC0AC_1_\uC2A4\uD3F0"
|
||||
m_Name: "Data_SkillEffect_Player_\uB9C8\uBC95_\uB9C8\uBC95\uBC1C\uC0AC_1_\uC2A4\uD3F0"
|
||||
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.Effects.SpawnEffect
|
||||
targetType: 0
|
||||
targetTeam: 0
|
||||
@@ -10,7 +10,7 @@ MonoBehaviour:
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 58efb3c775496fa40b801b21127a011e, type: 3}
|
||||
m_Name: "Data_SkillEffect_Player_\uD55C\uC190_\uB9C8\uBC95\uC624\uB984_0_\uB370\uBBF8\uC9C0"
|
||||
m_Name: "Data_SkillEffect_Player_\uB9C8\uBC95_\uB9C8\uBC95\uC624\uB984_0_\uB370\uBBF8\uC9C0"
|
||||
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.Effects.DamageEffect
|
||||
targetType: 1
|
||||
targetTeam: 0
|
||||
@@ -10,7 +10,7 @@ MonoBehaviour:
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 69581e050479a094782d2ca9eb142fe4, type: 3}
|
||||
m_Name: "Data_SkillEffect_Player_\uD55C\uC190_\uB9C8\uBC95\uC624\uB984_1_VFX"
|
||||
m_Name: "Data_SkillEffect_Player_\uB9C8\uBC95_\uB9C8\uBC95\uC624\uB984_1_VFX"
|
||||
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.Effects.VfxEffect
|
||||
targetType: 0
|
||||
targetTeam: 0
|
||||
@@ -10,7 +10,7 @@ MonoBehaviour:
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 58efb3c775496fa40b801b21127a011e, type: 3}
|
||||
m_Name: "Data_SkillEffect_Player_\uD55C\uC190_\uB9C8\uBC95\uD718\uB450\uB974\uAE30_0_\uB370\uBBF8\uC9C0"
|
||||
m_Name: "Data_SkillEffect_Player_\uB9C8\uBC95_\uB9C8\uBC95\uD718\uB450\uB974\uAE30_0_\uB370\uBBF8\uC9C0"
|
||||
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.Effects.DamageEffect
|
||||
targetType: 1
|
||||
targetTeam: 0
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
115
Assets/_Game/Materials/M_Skill_Player_마법_마법광선.mat
Normal file
115
Assets/_Game/Materials/M_Skill_Player_마법_마법광선.mat
Normal file
@@ -0,0 +1,115 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: "M_Skill_Player_\uB9C8\uBC95_\uB9C8\uBC95\uAD11\uC120"
|
||||
m_Shader: {fileID: 200, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords:
|
||||
- _ALPHABLEND_ON
|
||||
- _GLOSSYREFLECTIONS_OFF
|
||||
- _SPECULARHIGHLIGHTS_OFF
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _AlphaTex:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: 2eb84df899ad7fc4aa3b987e587d5fcb, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- PixelSnap: 0
|
||||
- _BlendOp: 0
|
||||
- _BumpScale: 1
|
||||
- _CameraFadingEnabled: 0
|
||||
- _CameraFarFadeDistance: 2
|
||||
- _CameraNearFadeDistance: 1
|
||||
- _Cull: 2
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DistortionBlend: 0.5
|
||||
- _DistortionEnabled: 0
|
||||
- _DistortionStrength: 1
|
||||
- _DistortionStrengthScaled: 0
|
||||
- _DstBlend: 10
|
||||
- _EmissionEnabled: 0
|
||||
- _EnableExternalAlpha: 0
|
||||
- _FlipbookMode: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0
|
||||
- _GlossyReflections: 0
|
||||
- _InvFade: 3
|
||||
- _LightingEnabled: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 2
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SoftParticlesEnabled: 0
|
||||
- _SoftParticlesFarFadeDistance: 1
|
||||
- _SoftParticlesNearFadeDistance: 0
|
||||
- _SpecularHighlights: 0
|
||||
- _SrcBlend: 5
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 0
|
||||
m_Colors:
|
||||
- _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0}
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmisColor: {r: 0.2, g: 0.2, b: 0.2, a: 0}
|
||||
- _EmissionColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _Flip: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _RendererColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0}
|
||||
- _TintColor: {r: 1, g: 0, b: 0, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
m_AllowLocking: 1
|
||||
8
Assets/_Game/Materials/M_Skill_Player_마법_마법광선.mat.meta
Normal file
8
Assets/_Game/Materials/M_Skill_Player_마법_마법광선.mat.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7150963a752e721408a8e6f2ce797d26
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
115
Assets/_Game/Materials/M_Skill_Player_마법_치유광선.mat
Normal file
115
Assets/_Game/Materials/M_Skill_Player_마법_치유광선.mat
Normal file
@@ -0,0 +1,115 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: "M_Skill_Player_\uB9C8\uBC95_\uCE58\uC720\uAD11\uC120"
|
||||
m_Shader: {fileID: 200, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords:
|
||||
- _ALPHABLEND_ON
|
||||
- _GLOSSYREFLECTIONS_OFF
|
||||
- _SPECULARHIGHLIGHTS_OFF
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _AlphaTex:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: 2eb84df899ad7fc4aa3b987e587d5fcb, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- PixelSnap: 0
|
||||
- _BlendOp: 0
|
||||
- _BumpScale: 1
|
||||
- _CameraFadingEnabled: 0
|
||||
- _CameraFarFadeDistance: 2
|
||||
- _CameraNearFadeDistance: 1
|
||||
- _Cull: 2
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DistortionBlend: 0.5
|
||||
- _DistortionEnabled: 0
|
||||
- _DistortionStrength: 1
|
||||
- _DistortionStrengthScaled: 0
|
||||
- _DstBlend: 10
|
||||
- _EmissionEnabled: 0
|
||||
- _EnableExternalAlpha: 0
|
||||
- _FlipbookMode: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0
|
||||
- _GlossyReflections: 0
|
||||
- _InvFade: 3
|
||||
- _LightingEnabled: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 2
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SoftParticlesEnabled: 0
|
||||
- _SoftParticlesFarFadeDistance: 1
|
||||
- _SoftParticlesNearFadeDistance: 0
|
||||
- _SpecularHighlights: 0
|
||||
- _SrcBlend: 5
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 0
|
||||
m_Colors:
|
||||
- _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0}
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmisColor: {r: 0.2, g: 0.2, b: 0.2, a: 0}
|
||||
- _EmissionColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _Flip: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _RendererColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0}
|
||||
- _TintColor: {r: 0, g: 1, b: 0, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
m_AllowLocking: 1
|
||||
8
Assets/_Game/Materials/M_Skill_Player_마법_치유광선.mat.meta
Normal file
8
Assets/_Game/Materials/M_Skill_Player_마법_치유광선.mat.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9a1c0f9a3fd0d6344b67b09480db7ea8
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
115
Assets/_Game/Materials/PolygonParticleFX_Fumes_01 1.mat
Normal file
115
Assets/_Game/Materials/PolygonParticleFX_Fumes_01 1.mat
Normal file
@@ -0,0 +1,115 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: PolygonParticleFX_Fumes_01 1
|
||||
m_Shader: {fileID: 200, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords:
|
||||
- _ALPHABLEND_ON
|
||||
- _GLOSSYREFLECTIONS_OFF
|
||||
- _SPECULARHIGHLIGHTS_OFF
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _AlphaTex:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: 2eb84df899ad7fc4aa3b987e587d5fcb, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- PixelSnap: 0
|
||||
- _BlendOp: 0
|
||||
- _BumpScale: 1
|
||||
- _CameraFadingEnabled: 0
|
||||
- _CameraFarFadeDistance: 2
|
||||
- _CameraNearFadeDistance: 1
|
||||
- _Cull: 2
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DistortionBlend: 0.5
|
||||
- _DistortionEnabled: 0
|
||||
- _DistortionStrength: 1
|
||||
- _DistortionStrengthScaled: 0
|
||||
- _DstBlend: 10
|
||||
- _EmissionEnabled: 0
|
||||
- _EnableExternalAlpha: 0
|
||||
- _FlipbookMode: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0
|
||||
- _GlossyReflections: 0
|
||||
- _InvFade: 3
|
||||
- _LightingEnabled: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 2
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SoftParticlesEnabled: 0
|
||||
- _SoftParticlesFarFadeDistance: 1
|
||||
- _SoftParticlesNearFadeDistance: 0
|
||||
- _SpecularHighlights: 0
|
||||
- _SrcBlend: 5
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 0
|
||||
m_Colors:
|
||||
- _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0}
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmisColor: {r: 0.2, g: 0.2, b: 0.2, a: 0}
|
||||
- _EmissionColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _Flip: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _RendererColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0}
|
||||
- _TintColor: {r: 0, g: 1, b: 0, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
m_AllowLocking: 1
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 56c8504d025fe294b9904a6470de74dc
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
115
Assets/_Game/Materials/PolygonParticleFX_Fumes_02.mat
Normal file
115
Assets/_Game/Materials/PolygonParticleFX_Fumes_02.mat
Normal file
@@ -0,0 +1,115 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: PolygonParticleFX_Fumes_02
|
||||
m_Shader: {fileID: 205, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords:
|
||||
- _ALPHABLEND_ON
|
||||
- _GLOSSYREFLECTIONS_OFF
|
||||
- _SPECULARHIGHLIGHTS_OFF
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _AlphaTex:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: 2eb84df899ad7fc4aa3b987e587d5fcb, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- PixelSnap: 0
|
||||
- _BlendOp: 0
|
||||
- _BumpScale: 1
|
||||
- _CameraFadingEnabled: 0
|
||||
- _CameraFarFadeDistance: 2
|
||||
- _CameraNearFadeDistance: 1
|
||||
- _Cull: 2
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DistortionBlend: 0.5
|
||||
- _DistortionEnabled: 0
|
||||
- _DistortionStrength: 1
|
||||
- _DistortionStrengthScaled: 0
|
||||
- _DstBlend: 10
|
||||
- _EmissionEnabled: 0
|
||||
- _EnableExternalAlpha: 0
|
||||
- _FlipbookMode: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0
|
||||
- _GlossyReflections: 0
|
||||
- _InvFade: 3
|
||||
- _LightingEnabled: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 2
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SoftParticlesEnabled: 0
|
||||
- _SoftParticlesFarFadeDistance: 1
|
||||
- _SoftParticlesNearFadeDistance: 0
|
||||
- _SpecularHighlights: 0
|
||||
- _SrcBlend: 5
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 0
|
||||
m_Colors:
|
||||
- _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0}
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmisColor: {r: 0.2, g: 0.2, b: 0.2, a: 0}
|
||||
- _EmissionColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _Flip: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _RendererColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0}
|
||||
- _TintColor: {r: 0.5, g: 0.5, b: 0.5, a: 0.5}
|
||||
m_BuildTextureStacks: []
|
||||
m_AllowLocking: 1
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c885e0e1da229bc4288f638bb9ab00d8
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,5 +1,36 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &2496650503913344580
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 8546932470540784318}
|
||||
m_Layer: 0
|
||||
m_Name: CastPoint
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &8546932470540784318
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2496650503913344580}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0.6, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 2062977780136741170}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1001 &1957819133893439193
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -58,7 +89,10 @@ PrefabInstance:
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects: []
|
||||
m_AddedGameObjects:
|
||||
- targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: 8fbe33fca238e4b438c17b36142a5c76, type: 3}
|
||||
insertIndex: -1
|
||||
addedObject: {fileID: 8546932470540784318}
|
||||
m_AddedComponents:
|
||||
- targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 8fbe33fca238e4b438c17b36142a5c76, type: 3}
|
||||
insertIndex: -1
|
||||
@@ -131,7 +165,7 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject
|
||||
GlobalObjectIdHash: 0
|
||||
GlobalObjectIdHash: 1559047469
|
||||
InScenePlacedSourceGlobalObjectIdHash: 0
|
||||
DeferredDespawnTick: 0
|
||||
Ownership: 1
|
||||
@@ -144,3 +178,8 @@ MonoBehaviour:
|
||||
AutoObjectParentSync: 1
|
||||
SyncOwnerTransformWhenParented: 1
|
||||
AllowOwnerToParent: 0
|
||||
--- !u!4 &2062977780136741170 stripped
|
||||
Transform:
|
||||
m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 8fbe33fca238e4b438c17b36142a5c76, type: 3}
|
||||
m_PrefabInstance: {fileID: 1957819133893439193}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
|
||||
@@ -5026,11 +5026,14 @@ MonoBehaviour:
|
||||
registeredClips:
|
||||
- {fileID: 7400000, guid: e920395a39d50ca429748ac26967e22f, type: 2}
|
||||
- {fileID: 7400000, guid: 920ea8a73bbf84849b01d3875ff4e4c3, type: 2}
|
||||
- {fileID: 7400000, guid: 581f9de1a3e502f4eb95b1e922117c5c, type: 2}
|
||||
- {fileID: 7400000, guid: b08df23bb6e5efe4db4dae2bb02382b1, type: 2}
|
||||
- {fileID: 7400000, guid: 5c93f4c7dbc1b314d8e7b318826ef530, type: 2}
|
||||
- {fileID: 7400000, guid: afba3dfa5c315c04fa8af0e2e52aee3c, type: 2}
|
||||
- {fileID: 7400000, guid: d8bb58f4f1cc36440896fec5c4002e59, type: 2}
|
||||
- {fileID: 7400000, guid: dc5e72498abe07149b02d93a308697db, type: 2}
|
||||
- {fileID: 7400000, guid: 53d4b641824bfd248ab6ba10ec9c4b00, type: 2}
|
||||
- {fileID: 7400000, guid: fabf33afcfd658d47a5566582fdbf044, type: 2}
|
||||
- {fileID: 7400000, guid: 581f9de1a3e502f4eb95b1e922117c5c, type: 2}
|
||||
- {fileID: 7400000, guid: b08df23bb6e5efe4db4dae2bb02382b1, type: 2}
|
||||
- {fileID: 7400000, guid: e586d02e6719b56489738b82604abdcf, type: 2}
|
||||
- {fileID: 7400000, guid: 0c9ba11ed23236649929b0225a8beadb, type: 2}
|
||||
- {fileID: 7400000, guid: 7813457eddc067249a6ed50f31b6fe8c, type: 2}
|
||||
@@ -5063,9 +5066,9 @@ MonoBehaviour:
|
||||
- {fileID: 0}
|
||||
- {fileID: 11400000, guid: 2b3c4d5e6f7890abcdef1234567890ab, type: 2}
|
||||
- {fileID: 11400000, guid: a8f2a6b7c9d0e1f3a4b5c6d7e8a9f0b1, type: 2}
|
||||
- {fileID: 11400000, guid: 4653bb40be03e3d418389a2268afb3e5, type: 2}
|
||||
- {fileID: 0}
|
||||
- {fileID: 0}
|
||||
- {fileID: 11400000, guid: 2ed15dca92a165046b6df17b28f64874, type: 2}
|
||||
- {fileID: 11400000, guid: 491ca92a12e0b23408e4b18b00606e85, type: 2}
|
||||
skillLoadoutEntries:
|
||||
- baseSkill: {fileID: 0}
|
||||
socketedGems:
|
||||
@@ -5083,7 +5086,7 @@ MonoBehaviour:
|
||||
socketedGems:
|
||||
- {fileID: 0}
|
||||
- {fileID: 0}
|
||||
- baseSkill: {fileID: 0}
|
||||
- baseSkill: {fileID: 11400000, guid: 4653bb40be03e3d418389a2268afb3e5, type: 2}
|
||||
socketedGems:
|
||||
- {fileID: 0}
|
||||
- {fileID: 0}
|
||||
@@ -5091,7 +5094,7 @@ MonoBehaviour:
|
||||
socketedGems:
|
||||
- {fileID: 0}
|
||||
- {fileID: 0}
|
||||
- baseSkill: {fileID: 11400000, guid: 2ed15dca92a165046b6df17b28f64874, type: 2}
|
||||
- baseSkill: {fileID: 11400000, guid: 491ca92a12e0b23408e4b18b00606e85, type: 2}
|
||||
socketedGems:
|
||||
- {fileID: 0}
|
||||
- {fileID: 0}
|
||||
|
||||
38569
Assets/_Game/Prefabs/VFX/FX_Skill_Player_마법_마법광선_빔.prefab
Normal file
38569
Assets/_Game/Prefabs/VFX/FX_Skill_Player_마법_마법광선_빔.prefab
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,9 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 75ec5047abb8242419c33baf6ca45ca8
|
||||
timeCreated: 1587610166
|
||||
licenseType: Store
|
||||
NativeFormatImporter:
|
||||
mainObjectFileID: 100100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
6628
Assets/_Game/Prefabs/VFX/FX_Skill_Player_마법_마법광선_차지.prefab
Normal file
6628
Assets/_Game/Prefabs/VFX/FX_Skill_Player_마법_마법광선_차지.prefab
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,9 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1e60ab1e81cd07d4bb0871e60907a244
|
||||
timeCreated: 1587011417
|
||||
licenseType: Store
|
||||
NativeFormatImporter:
|
||||
mainObjectFileID: 100100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
38569
Assets/_Game/Prefabs/VFX/FX_Skill_Player_마법_치유광선_빔.prefab
Normal file
38569
Assets/_Game/Prefabs/VFX/FX_Skill_Player_마법_치유광선_빔.prefab
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,9 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b9aac1c232ed68c44be97372b7fc6914
|
||||
timeCreated: 1587610166
|
||||
licenseType: Store
|
||||
NativeFormatImporter:
|
||||
mainObjectFileID: 100100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
6628
Assets/_Game/Prefabs/VFX/FX_Skill_Player_마법_치유광선_차지.prefab
Normal file
6628
Assets/_Game/Prefabs/VFX/FX_Skill_Player_마법_치유광선_차지.prefab
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,9 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fde87a17ace66784f93cef0697f63c4b
|
||||
timeCreated: 1587011417
|
||||
licenseType: Store
|
||||
NativeFormatImporter:
|
||||
mainObjectFileID: 100100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -150,6 +150,12 @@ namespace Colosseum.Player
|
||||
inputActions.Player.Skill5.performed += OnSkill5Performed;
|
||||
inputActions.Player.Skill6.performed += OnSkill6Performed;
|
||||
inputActions.Player.Evade.performed += OnEvadePerformed;
|
||||
inputActions.Player.Skill1.canceled += OnSkill1Canceled;
|
||||
inputActions.Player.Skill2.canceled += OnSkill2Canceled;
|
||||
inputActions.Player.Skill3.canceled += OnSkill3Canceled;
|
||||
inputActions.Player.Skill4.canceled += OnSkill4Canceled;
|
||||
inputActions.Player.Skill5.canceled += OnSkill5Canceled;
|
||||
inputActions.Player.Skill6.canceled += OnSkill6Canceled;
|
||||
}
|
||||
|
||||
SetGameplayInputEnabled(true);
|
||||
@@ -377,6 +383,12 @@ namespace Colosseum.Player
|
||||
{
|
||||
if (inputActions != null)
|
||||
{
|
||||
inputActions.Player.Skill1.canceled -= OnSkill1Canceled;
|
||||
inputActions.Player.Skill2.canceled -= OnSkill2Canceled;
|
||||
inputActions.Player.Skill3.canceled -= OnSkill3Canceled;
|
||||
inputActions.Player.Skill4.canceled -= OnSkill4Canceled;
|
||||
inputActions.Player.Skill5.canceled -= OnSkill5Canceled;
|
||||
inputActions.Player.Skill6.canceled -= OnSkill6Canceled;
|
||||
inputActions.Player.Disable();
|
||||
}
|
||||
}
|
||||
@@ -852,6 +864,24 @@ namespace Colosseum.Player
|
||||
|
||||
private void OnEvadePerformed(InputAction.CallbackContext context) => OnSkillInput(6);
|
||||
|
||||
private void OnSkill1Canceled(InputAction.CallbackContext context) => OnSkillCanceled();
|
||||
private void OnSkill2Canceled(InputAction.CallbackContext context) => OnSkillCanceled();
|
||||
private void OnSkill3Canceled(InputAction.CallbackContext context) => OnSkillCanceled();
|
||||
private void OnSkill4Canceled(InputAction.CallbackContext context) => OnSkillCanceled();
|
||||
private void OnSkill5Canceled(InputAction.CallbackContext context) => OnSkillCanceled();
|
||||
private void OnSkill6Canceled(InputAction.CallbackContext context) => OnSkillCanceled();
|
||||
|
||||
/// <summary>
|
||||
/// 스킬 버튼 해제 시 채널링 중단을 알립니다.
|
||||
/// </summary>
|
||||
private void OnSkillCanceled()
|
||||
{
|
||||
if (skillController != null && skillController.IsChannelingActive)
|
||||
{
|
||||
skillController.NotifyChannelHoldReleased();
|
||||
}
|
||||
}
|
||||
|
||||
private PlayerActionState GetOrCreateActionState()
|
||||
{
|
||||
var foundState = GetComponent<PlayerActionState>();
|
||||
|
||||
@@ -76,6 +76,14 @@ namespace Colosseum.Skills
|
||||
private GameObject currentTargetOverride;
|
||||
private Vector3? currentGroundTargetPosition;
|
||||
|
||||
// 채널링 상태
|
||||
private bool isChannelingActive = false;
|
||||
private float channelElapsedTime = 0f;
|
||||
private float channelTickAccumulator = 0f;
|
||||
private GameObject channelVfxInstance;
|
||||
private readonly List<SkillEffect> currentChannelTickEffects = new();
|
||||
private readonly List<SkillEffect> currentChannelEndEffects = new();
|
||||
|
||||
// 쿨타임 추적
|
||||
private Dictionary<SkillData, float> cooldownTracker = new Dictionary<SkillData, float>();
|
||||
|
||||
@@ -90,6 +98,7 @@ namespace Colosseum.Skills
|
||||
public SkillCancelReason LastCancelReason => lastCancelReason;
|
||||
public string LastCancelledSkillName => lastCancelledSkillName;
|
||||
public GameObject CurrentTargetOverride => currentTargetOverride;
|
||||
public bool IsChannelingActive => isChannelingActive;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
@@ -224,6 +233,13 @@ namespace Colosseum.Skills
|
||||
{
|
||||
if (currentSkill == null || animator == null) return;
|
||||
|
||||
// 채널링 중일 때
|
||||
if (isChannelingActive)
|
||||
{
|
||||
UpdateChanneling();
|
||||
return;
|
||||
}
|
||||
|
||||
var stateInfo = animator.GetCurrentAnimatorStateInfo(0);
|
||||
|
||||
// 애니메이션 종료 시 처리
|
||||
@@ -237,6 +253,13 @@ namespace Colosseum.Skills
|
||||
if (TryStartNextIteration())
|
||||
return;
|
||||
|
||||
// 채널링 스킬이면 채널링 시작
|
||||
if (currentSkill.IsChanneling)
|
||||
{
|
||||
StartChanneling();
|
||||
return;
|
||||
}
|
||||
|
||||
// 모든 클립과 반복이 끝나면 종료
|
||||
if (debugMode) Debug.Log($"[Skill] Animation complete: {currentSkill.SkillName}");
|
||||
RestoreBaseController();
|
||||
@@ -444,6 +467,8 @@ namespace Colosseum.Skills
|
||||
loadoutEntry.CollectTriggeredEffects(currentTriggeredEffects);
|
||||
loadoutEntry.CollectCastStartAbnormalities(currentCastStartAbnormalities);
|
||||
loadoutEntry.CollectTriggeredAbnormalities(currentTriggeredAbnormalities);
|
||||
loadoutEntry.CollectChannelTickEffects(currentChannelTickEffects);
|
||||
loadoutEntry.CollectChannelEndEffects(currentChannelEndEffects);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -717,6 +742,262 @@ namespace Colosseum.Skills
|
||||
cooldownTracker.Clear();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 채널링을 시작합니다. 캐스트 애니메이션 종료 후 호출됩니다.
|
||||
/// </summary>
|
||||
private void StartChanneling()
|
||||
{
|
||||
if (currentSkill == null || !currentSkill.IsChanneling)
|
||||
return;
|
||||
|
||||
isChannelingActive = true;
|
||||
channelElapsedTime = 0f;
|
||||
channelTickAccumulator = 0f;
|
||||
|
||||
SpawnChannelVfx();
|
||||
|
||||
if (debugMode)
|
||||
Debug.Log($"[Skill] 채널링 시작: {currentSkill.SkillName} (duration={currentSkill.ChannelDuration}s, tick={currentSkill.ChannelTickInterval}s)");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 채널링 VFX를 시전자 위치에 생성합니다.
|
||||
/// </summary>
|
||||
private void SpawnChannelVfx()
|
||||
{
|
||||
if (currentSkill == null || currentSkill.ChannelVfxPrefab == null)
|
||||
return;
|
||||
|
||||
Transform mount = ResolveChannelVfxMount();
|
||||
Vector3 spawnPos = mount != null ? mount.position : transform.position;
|
||||
|
||||
channelVfxInstance = UnityEngine.Object.Instantiate(
|
||||
currentSkill.ChannelVfxPrefab,
|
||||
spawnPos,
|
||||
transform.rotation);
|
||||
|
||||
if (mount != null)
|
||||
channelVfxInstance.transform.SetParent(mount);
|
||||
|
||||
channelVfxInstance.transform.localScale = new Vector3(
|
||||
currentSkill.ChannelVfxWidthScale,
|
||||
currentSkill.ChannelVfxWidthScale,
|
||||
currentSkill.ChannelVfxLengthScale);
|
||||
|
||||
// 모든 파티클을 루핑 모드로 설정
|
||||
ForceLoopParticleSystems(channelVfxInstance);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 하위 모든 ParticleSystem을 루핑 모드로 강제 설정하고 충돌을 비활성화합니다.
|
||||
/// 채널링 종료 시 파괴되므로 자연 종료 및 충돌 반응 방지용.
|
||||
/// </summary>
|
||||
private static void ForceLoopParticleSystems(GameObject instance)
|
||||
{
|
||||
if (instance == null) return;
|
||||
|
||||
ParticleSystem[] particles = instance.GetComponentsInChildren<ParticleSystem>(true);
|
||||
for (int i = 0; i < particles.Length; i++)
|
||||
{
|
||||
var main = particles[i].main;
|
||||
main.loop = true;
|
||||
main.stopAction = ParticleSystemStopAction.None;
|
||||
|
||||
var collision = particles[i].collision;
|
||||
collision.enabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// channelVfxMountPath에서 VFX 장착 위치를 찾습니다.
|
||||
/// </summary>
|
||||
private Transform ResolveChannelVfxMount()
|
||||
{
|
||||
if (currentSkill == null || string.IsNullOrEmpty(currentSkill.ChannelVfxMountPath))
|
||||
return null;
|
||||
|
||||
// Animator 하위에서 이름으로 재귀 검색
|
||||
Animator animator = GetComponentInChildren<Animator>();
|
||||
if (animator != null)
|
||||
{
|
||||
Transform found = FindTransformRecursive(animator.transform, currentSkill.ChannelVfxMountPath);
|
||||
if (found != null)
|
||||
return found;
|
||||
}
|
||||
|
||||
// 자식 GameObject에서 경로 검색
|
||||
return transform.Find(currentSkill.ChannelVfxMountPath);
|
||||
}
|
||||
|
||||
private static Transform FindTransformRecursive(Transform parent, string name)
|
||||
{
|
||||
for (int i = 0; i < parent.childCount; i++)
|
||||
{
|
||||
Transform child = parent.GetChild(i);
|
||||
if (child.name == name)
|
||||
return child;
|
||||
|
||||
Transform found = FindTransformRecursive(child, name);
|
||||
if (found != null)
|
||||
return found;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 채널링 VFX를 파괴합니다.
|
||||
/// </summary>
|
||||
private void DestroyChannelVfx()
|
||||
{
|
||||
if (channelVfxInstance != null)
|
||||
{
|
||||
UnityEngine.Object.Destroy(channelVfxInstance);
|
||||
channelVfxInstance = null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 채널링을 매 프레임 업데이트합니다. 틱 효과를 주기적으로 발동합니다.
|
||||
/// </summary>
|
||||
private void UpdateChanneling()
|
||||
{
|
||||
if (!isChannelingActive || currentSkill == null)
|
||||
return;
|
||||
|
||||
channelElapsedTime += Time.deltaTime;
|
||||
channelTickAccumulator += Time.deltaTime;
|
||||
|
||||
// 틱 효과 발동
|
||||
float tickInterval = currentSkill.ChannelTickInterval;
|
||||
while (channelTickAccumulator >= tickInterval)
|
||||
{
|
||||
channelTickAccumulator -= tickInterval;
|
||||
TriggerChannelTick();
|
||||
}
|
||||
|
||||
// 지속 시간 초과 → 채널링 종료
|
||||
if (channelElapsedTime >= currentSkill.ChannelDuration)
|
||||
{
|
||||
if (debugMode)
|
||||
Debug.Log($"[Skill] 채널링 지속 시간 만료: {currentSkill.SkillName}");
|
||||
EndChanneling();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 채널링 틱 효과를 발동합니다.
|
||||
/// </summary>
|
||||
private void TriggerChannelTick()
|
||||
{
|
||||
if (currentChannelTickEffects.Count == 0)
|
||||
return;
|
||||
|
||||
if (debugMode)
|
||||
Debug.Log($"[Skill] 채널링 틱 발동: {currentSkill.SkillName} (elapsed={channelElapsedTime:F1}s)");
|
||||
|
||||
// VFX는 모든 클라이언트에서 로컬 실행
|
||||
for (int i = 0; i < currentChannelTickEffects.Count; i++)
|
||||
{
|
||||
SkillEffect effect = currentChannelTickEffects[i];
|
||||
if (effect != null && effect.IsVisualOnly)
|
||||
{
|
||||
effect.ExecuteOnCast(gameObject, currentTargetOverride, currentGroundTargetPosition);
|
||||
}
|
||||
}
|
||||
|
||||
// 게임플레이 효과는 서버에서만 실행
|
||||
if (NetworkManager.Singleton != null && !NetworkManager.Singleton.IsServer)
|
||||
return;
|
||||
|
||||
for (int i = 0; i < currentChannelTickEffects.Count; i++)
|
||||
{
|
||||
SkillEffect effect = currentChannelTickEffects[i];
|
||||
if (effect == null || effect.IsVisualOnly)
|
||||
continue;
|
||||
|
||||
if (debugMode)
|
||||
Debug.Log($"[Skill] 채널링 틱 효과: {effect.name}");
|
||||
|
||||
if (showAreaDebug)
|
||||
effect.DrawDebugRange(gameObject, debugDrawDuration, currentGroundTargetPosition);
|
||||
|
||||
effect.ExecuteOnCast(gameObject, currentTargetOverride, currentGroundTargetPosition);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 채널링을 종료합니다. 종료 효과를 발동하고 스킬 상태를 정리합니다.
|
||||
/// </summary>
|
||||
private void EndChanneling()
|
||||
{
|
||||
if (!isChannelingActive)
|
||||
return;
|
||||
|
||||
// 채널링 종료 효과 발동
|
||||
TriggerChannelEndEffects();
|
||||
DestroyChannelVfx();
|
||||
|
||||
isChannelingActive = false;
|
||||
channelElapsedTime = 0f;
|
||||
channelTickAccumulator = 0f;
|
||||
|
||||
if (debugMode)
|
||||
Debug.Log($"[Skill] 채널링 종료: {currentSkill?.SkillName}");
|
||||
|
||||
RestoreBaseController();
|
||||
ClearCurrentSkillState();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 채널링 종료 효과를 발동합니다.
|
||||
/// </summary>
|
||||
private void TriggerChannelEndEffects()
|
||||
{
|
||||
if (currentChannelEndEffects.Count == 0)
|
||||
return;
|
||||
|
||||
// VFX는 모든 클라이언트에서 로컬 실행
|
||||
for (int i = 0; i < currentChannelEndEffects.Count; i++)
|
||||
{
|
||||
SkillEffect effect = currentChannelEndEffects[i];
|
||||
if (effect != null && effect.IsVisualOnly)
|
||||
{
|
||||
effect.ExecuteOnCast(gameObject, currentTargetOverride, currentGroundTargetPosition);
|
||||
}
|
||||
}
|
||||
|
||||
// 게임플레이 효과는 서버에서만 실행
|
||||
if (NetworkManager.Singleton != null && !NetworkManager.Singleton.IsServer)
|
||||
return;
|
||||
|
||||
for (int i = 0; i < currentChannelEndEffects.Count; i++)
|
||||
{
|
||||
SkillEffect effect = currentChannelEndEffects[i];
|
||||
if (effect == null || effect.IsVisualOnly)
|
||||
continue;
|
||||
|
||||
if (debugMode)
|
||||
Debug.Log($"[Skill] 채널링 종료 효과: {effect.name}");
|
||||
|
||||
effect.ExecuteOnCast(gameObject, currentTargetOverride, currentGroundTargetPosition);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 플레이어가 버튼을 놓았을 때 채널링을 중단합니다.
|
||||
/// PlayerSkillInput에서 호출됩니다.
|
||||
/// </summary>
|
||||
public void NotifyChannelHoldReleased()
|
||||
{
|
||||
if (!isChannelingActive)
|
||||
return;
|
||||
|
||||
if (debugMode)
|
||||
Debug.Log($"[Skill] 채널링 버튼 해제로 중단: {currentSkill?.SkillName}");
|
||||
|
||||
EndChanneling();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 현재 실행 중인 스킬 상태를 정리합니다.
|
||||
/// </summary>
|
||||
@@ -729,6 +1010,12 @@ namespace Colosseum.Skills
|
||||
currentCastStartAbnormalities.Clear();
|
||||
currentTriggeredAbnormalities.Clear();
|
||||
currentTriggeredTargetsBuffer.Clear();
|
||||
currentChannelTickEffects.Clear();
|
||||
currentChannelEndEffects.Clear();
|
||||
isChannelingActive = false;
|
||||
channelElapsedTime = 0f;
|
||||
channelTickAccumulator = 0f;
|
||||
DestroyChannelVfx();
|
||||
currentTargetOverride = null;
|
||||
currentGroundTargetPosition = null;
|
||||
currentClipSequenceIndex = 0;
|
||||
|
||||
@@ -67,35 +67,9 @@ namespace Colosseum.Skills
|
||||
/// </summary>
|
||||
private void OnValidate()
|
||||
{
|
||||
MigrateLegacyEffects();
|
||||
RefreshAnimationClips();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 레거시 flat effects 리스트를 grouped triggeredEffects 구조로 마이그레이션합니다.
|
||||
/// </summary>
|
||||
private void MigrateLegacyEffects()
|
||||
{
|
||||
if (effects == null || effects.Count == 0)
|
||||
return;
|
||||
if (triggeredEffects != null && triggeredEffects.Count > 0)
|
||||
return;
|
||||
|
||||
triggeredEffects = new List<SkillTriggeredEffectEntry>();
|
||||
for (int i = 0; i < effects.Count; i++)
|
||||
{
|
||||
SkillEffect effect = effects[i];
|
||||
if (effect == null)
|
||||
continue;
|
||||
|
||||
triggeredEffects.Add(new SkillTriggeredEffectEntry(i, new List<SkillEffect> { effect }));
|
||||
}
|
||||
|
||||
effects.Clear();
|
||||
UnityEditor.EditorUtility.SetDirty(this);
|
||||
Debug.Log($"[SkillData] '{name}' effects 마이그레이션 완료: {triggeredEffects.Count}개 엔트리", this);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 애셋 이름 기반으로 매칭되는 애니메이션 클립을 자동 수집합니다.
|
||||
/// SkillData 이름이 'Data_Skill_'으로 시작하면 'Anim_{key}_{순서}' 클립을 찾아 animationClips에 채웁니다.
|
||||
@@ -226,10 +200,25 @@ namespace Colosseum.Skills
|
||||
[Tooltip("애니메이션 이벤트 OnEffect(index)로 발동. 각 엔트리의 Trigger Index가 이벤트 인덱스와 매칭됩니다.")]
|
||||
[SerializeField] private List<SkillTriggeredEffectEntry> triggeredEffects = new();
|
||||
|
||||
/// <summary>
|
||||
/// 레거시 flat effects 리스트. OnValidate에서 triggeredEffects로 자동 마이그레이션됩니다.
|
||||
/// </summary>
|
||||
[HideInInspector] [SerializeField] private List<SkillEffect> effects = new List<SkillEffect>();
|
||||
[Header("채널링")]
|
||||
[Tooltip("이 스킬이 채널링 스킬인지 여부. 캐스트 애니메이션 종료 후 채널링이 시작됩니다.")]
|
||||
[SerializeField] private bool isChanneling = false;
|
||||
[Tooltip("채널링 최대 지속 시간 (초)")]
|
||||
[Min(0.1f)] [SerializeField] private float channelDuration = 3f;
|
||||
[Tooltip("채널링 틱 간격 (초). 이 간격마다 channelTickEffects가 발동합니다.")]
|
||||
[Min(0.05f)] [SerializeField] private float channelTickInterval = 0.5f;
|
||||
[Tooltip("채널링 중 주기적으로 발동하는 효과 목록")]
|
||||
[SerializeField] private List<SkillEffect> channelTickEffects = new();
|
||||
[Tooltip("채널링 종료 시 발동하는 효과 목록 (지속 시간 만료 시)")]
|
||||
[SerializeField] private List<SkillEffect> channelEndEffects = new();
|
||||
[Tooltip("채널링 중 지속되는 VFX 프리팹. 채널링 시작에 시전자 위치에 생성되고 종료에 파괴됩니다.")]
|
||||
[SerializeField] private GameObject channelVfxPrefab;
|
||||
[Tooltip("VFX 생성 기준 위치의 Transform 경로. Animator 본 이름 (예: RightHand, Head) 또는 자식 GameObject 경로. 비어있으면 루트 위치.")]
|
||||
[SerializeField] private string channelVfxMountPath;
|
||||
[Tooltip("채널링 VFX 길이 배율. 빔의 진행 방향 (z축) 크기를 조절합니다.")]
|
||||
[Min(0.01f)] [SerializeField] private float channelVfxLengthScale = 1f;
|
||||
[Tooltip("채널링 VFX 폭 배율. 빔의 너비 (x/y축) 크기를 조절합니다.")]
|
||||
[Min(0.01f)] [SerializeField] private float channelVfxWidthScale = 1f;
|
||||
|
||||
// Properties
|
||||
public string SkillName => skillName;
|
||||
@@ -260,6 +249,15 @@ namespace Colosseum.Skills
|
||||
public IReadOnlyList<SkillEffect> CastStartEffects => castStartEffects;
|
||||
public IReadOnlyList<SkillTriggeredEffectEntry> TriggeredEffects => triggeredEffects;
|
||||
public WeaponTrait AllowedWeaponTraits => allowedWeaponTraits;
|
||||
public bool IsChanneling => isChanneling;
|
||||
public float ChannelDuration => channelDuration;
|
||||
public float ChannelTickInterval => channelTickInterval;
|
||||
public IReadOnlyList<SkillEffect> ChannelTickEffects => channelTickEffects;
|
||||
public IReadOnlyList<SkillEffect> ChannelEndEffects => channelEndEffects;
|
||||
public GameObject ChannelVfxPrefab => channelVfxPrefab;
|
||||
public string ChannelVfxMountPath => channelVfxMountPath;
|
||||
public float ChannelVfxLengthScale => channelVfxLengthScale;
|
||||
public float ChannelVfxWidthScale => channelVfxWidthScale;
|
||||
|
||||
/// <summary>
|
||||
/// 지정한 장착 조건과 현재 스킬 분류가 맞는지 확인합니다.
|
||||
|
||||
@@ -144,6 +144,15 @@ namespace Colosseum.Skills
|
||||
|
||||
private void CollectAreaTargets(GameObject caster, List<GameObject> destination, Vector3? groundPosition = null)
|
||||
{
|
||||
switch (areaShape)
|
||||
{
|
||||
case AreaShapeType.Beam:
|
||||
CollectBeamTargets(caster, destination);
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
Vector3 center = GetAreaCenter(caster, groundPosition);
|
||||
Collider[] hits = Physics.OverlapSphere(center, Mathf.Max(areaRadius, fanRadius), targetLayers);
|
||||
foreach (var hit in hits)
|
||||
@@ -161,6 +170,31 @@ namespace Colosseum.Skills
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 빔(원통) 범위 내 타겟을 수집합니다.
|
||||
/// 시전자 정면 fanOriginDistance 위치에서 areaRadius 길이의 원통을 판정합니다.
|
||||
/// </summary>
|
||||
private void CollectBeamTargets(GameObject caster, List<GameObject> destination)
|
||||
{
|
||||
Vector3 casterPos = caster.transform.position;
|
||||
Vector3 forward = caster.transform.forward;
|
||||
float beamLength = Mathf.Max(areaRadius, 0.1f);
|
||||
float beamRadius = Mathf.Max(fanRadius, 0.1f);
|
||||
float startOffset = Mathf.Max(fanOriginDistance, 0f);
|
||||
|
||||
Vector3 origin = casterPos + forward * startOffset;
|
||||
Vector3 point1 = origin + forward * beamRadius;
|
||||
Vector3 point2 = origin + forward * (beamLength - beamRadius);
|
||||
|
||||
Collider[] hits = Physics.OverlapCapsule(point1, point2, beamRadius, targetLayers);
|
||||
foreach (var hit in hits)
|
||||
{
|
||||
if (!includeCasterInArea && hit.gameObject == caster) continue;
|
||||
if (!IsCorrectTeam(caster, hit.gameObject)) continue;
|
||||
AddUniqueTarget(destination, hit.gameObject);
|
||||
}
|
||||
}
|
||||
|
||||
private static void AddUniqueTarget(List<GameObject> destination, GameObject target)
|
||||
{
|
||||
if (target == null || destination.Contains(target))
|
||||
@@ -232,6 +266,10 @@ namespace Colosseum.Skills
|
||||
? (center - casterPos).normalized
|
||||
: forward, fanOriginDistance, fanRadius, fanHalfAngle, Color.red, duration);
|
||||
}
|
||||
else if (areaShape == AreaShapeType.Beam)
|
||||
{
|
||||
DebugDrawBeam(casterPos, forward, areaRadius, fanRadius, fanOriginDistance, Color.red, duration);
|
||||
}
|
||||
}
|
||||
|
||||
private void DebugDrawSphere(Vector3 center, float radius, Color color, float duration)
|
||||
@@ -287,6 +325,51 @@ namespace Colosseum.Skills
|
||||
// 원점 표시
|
||||
Debug.DrawLine(fanOrigin + Vector3.up * 0.1f, fanOrigin + Vector3.up * 1.5f, color, duration);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 빔(원통) 범위를 디버그 시각화합니다.
|
||||
/// 시전자 정면 startOffset 위치에서 사거리만큼의 원통과 단면 원을 그립니다.
|
||||
/// </summary>
|
||||
private void DebugDrawBeam(Vector3 casterPos, Vector3 forward, float beamLength, float beamRadius, float startOffset, Color color, float duration)
|
||||
{
|
||||
Vector3 origin = casterPos + forward * startOffset;
|
||||
Vector3 end = origin + forward * beamLength;
|
||||
int segments = 16;
|
||||
float step = 360f / segments;
|
||||
|
||||
// 시작 단면 원
|
||||
Vector3 prevStart = origin + new Vector3(beamRadius, 0, 0);
|
||||
for (int i = 1; i <= segments; i++)
|
||||
{
|
||||
float angle = i * step * Mathf.Deg2Rad;
|
||||
Vector3 next = origin + new Vector3(Mathf.Cos(angle) * beamRadius, 0, Mathf.Sin(angle) * beamRadius);
|
||||
Debug.DrawLine(prevStart, next, color, duration);
|
||||
prevStart = next;
|
||||
}
|
||||
|
||||
// 끝 단면 원
|
||||
Vector3 prevEnd = end + new Vector3(beamRadius, 0, 0);
|
||||
for (int i = 1; i <= segments; i++)
|
||||
{
|
||||
float angle = i * step * Mathf.Deg2Rad;
|
||||
Vector3 next = end + new Vector3(Mathf.Cos(angle) * beamRadius, 0, Mathf.Sin(angle) * beamRadius);
|
||||
Debug.DrawLine(prevEnd, next, color, duration);
|
||||
prevEnd = next;
|
||||
}
|
||||
|
||||
// 네 모서리 연결선
|
||||
Debug.DrawLine(origin + forward * 0 + new Vector3(beamRadius, 0, 0), end + new Vector3(beamRadius, 0, 0), color, duration);
|
||||
Debug.DrawLine(origin + new Vector3(-beamRadius, 0, 0), end + new Vector3(-beamRadius, 0, 0), color, duration);
|
||||
Debug.DrawLine(origin + new Vector3(0, 0, beamRadius), end + new Vector3(0, 0, beamRadius), color, duration);
|
||||
Debug.DrawLine(origin + new Vector3(0, 0, -beamRadius), end + new Vector3(0, 0, -beamRadius), color, duration);
|
||||
|
||||
// 중심선
|
||||
Debug.DrawLine(origin, end, color, duration);
|
||||
|
||||
// 높이 표시
|
||||
Debug.DrawLine(origin + Vector3.up * 0.1f, origin + Vector3.up * 1.5f, color, duration);
|
||||
Debug.DrawLine(end + Vector3.up * 0.1f, end + Vector3.up * 1.5f, color, duration);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -314,6 +397,7 @@ namespace Colosseum.Skills
|
||||
public enum AreaShapeType
|
||||
{
|
||||
Sphere, // 원형 범위
|
||||
Fan // 부채꼴 범위
|
||||
Fan, // 부채꼴 범위
|
||||
Beam // 원통 범위 (areaRadius=사거리, fanRadius=빔 폭)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -396,6 +396,64 @@ namespace Colosseum.Skills
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 기반 스킬의 채널링 틱 효과를 수집합니다.
|
||||
/// </summary>
|
||||
public void CollectChannelTickEffects(List<SkillEffect> destination)
|
||||
{
|
||||
if (destination == null)
|
||||
return;
|
||||
|
||||
if (baseSkill != null && baseSkill.ChannelTickEffects != null)
|
||||
{
|
||||
for (int i = 0; i < baseSkill.ChannelTickEffects.Count; i++)
|
||||
{
|
||||
SkillEffect effect = baseSkill.ChannelTickEffects[i];
|
||||
if (effect != null)
|
||||
destination.Add(effect);
|
||||
}
|
||||
}
|
||||
|
||||
if (socketedGems == null)
|
||||
return;
|
||||
|
||||
for (int i = 0; i < socketedGems.Length; i++)
|
||||
{
|
||||
SkillGemData gem = socketedGems[i];
|
||||
if (gem == null)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 기반 스킬의 채널링 종료 효과를 수집합니다.
|
||||
/// </summary>
|
||||
public void CollectChannelEndEffects(List<SkillEffect> destination)
|
||||
{
|
||||
if (destination == null)
|
||||
return;
|
||||
|
||||
if (baseSkill != null && baseSkill.ChannelEndEffects != null)
|
||||
{
|
||||
for (int i = 0; i < baseSkill.ChannelEndEffects.Count; i++)
|
||||
{
|
||||
SkillEffect effect = baseSkill.ChannelEndEffects[i];
|
||||
if (effect != null)
|
||||
destination.Add(effect);
|
||||
}
|
||||
}
|
||||
|
||||
if (socketedGems == null)
|
||||
return;
|
||||
|
||||
for (int i = 0; i < socketedGems.Length; i++)
|
||||
{
|
||||
SkillGemData gem = socketedGems[i];
|
||||
if (gem == null)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
private static void AddTriggeredEffect(Dictionary<int, List<SkillEffect>> destination, int triggerIndex, SkillEffect effect)
|
||||
{
|
||||
if (!destination.TryGetValue(triggerIndex, out List<SkillEffect> effectList))
|
||||
|
||||
Reference in New Issue
Block a user