[Abnormality] 이상 상태 시스템 구현
- 이상 상태 데이터 (버프/디버프) ScriptableObject 정의 - 런타임임 활성 이상 상태 관리 (ActiveAbnormality) - 캐릭터터별 AbnormalityManager 컴포넌트로 이상 상태 적용/제거 - 스킬 효과(AbnormalityEffect)로 스킬에 이상 상태 연동 - UI 슬롯 및 목록 표시 구현 (버프/디버프 구분) - 테스트 코드 및 씬 설정 추가 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -5,7 +5,13 @@
|
||||
"Bash(git fsck:*)",
|
||||
"Bash(git commit:*)",
|
||||
"Bash(git read-tree:*)",
|
||||
"Bash(git push:*)"
|
||||
"Bash(git push:*)",
|
||||
"Bash(cd \"D:/Colosseum/Assets/Scripts/StatusEffects\" && sed -i 's/ActiveStatusEffect/ActiveStatusEffect/g' StatusEffectManager.cs)",
|
||||
"Bash(cd \"D:/Colosseum/Assets/Scripts/UI\" && sed -i 's/ActiveStatusEffect/ActiveStatusEffect/g' StatusEffectUI.cs StatusEffectListUI.cs)",
|
||||
"Bash(cd \"D:/Colosseum/Assets/Scripts\" && mv StatusEffects Abnormalities)",
|
||||
"Bash(cd \"D:/Colosseum/Assets/Scripts/Abnormalities\" && mv StatusEffectData.cs AbnormalityData.cs && mv ActiveStatusEffect.cs ActiveAbnormality.cs && mv StatusEffectManager.cs AbnormalityManager.cs)",
|
||||
"Bash(cd \"D:/Colosseum/Assets/Scripts/UI\" && mv StatusEffectUI.cs AbnormalitySlotUI.cs && mv StatusEffectListUI.cs AbnormalityListUI.cs)",
|
||||
"Bash(git -C \"D:/Colosseum\" mv \"Assets/Scripts/Skills/Effects/BuffEffect.cs\" \"Assets/Scripts/Skills/Effects/AbnormalityEffect.cs\")"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
8
Assets/Abnormalities.meta
Normal file
8
Assets/Abnormalities.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 72b7a9faa543d444882609fe047a2073
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
24
Assets/Abnormalities/Abnormality_Test_Buff.asset
Normal file
24
Assets/Abnormalities/Abnormality_Test_Buff.asset
Normal file
@@ -0,0 +1,24 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: b08cc671f858a3b409170a5356e960a0, type: 3}
|
||||
m_Name: Abnormality_Test_Buff
|
||||
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Abnormalities.AbnormalityData
|
||||
abnormalityName: Abnormality
|
||||
icon: {fileID: 21300000, guid: 173f7bf0258285c4f8bf01825ac02a11, type: 3}
|
||||
duration: 99
|
||||
level: 1
|
||||
isDebuff: 0
|
||||
statModifiers: []
|
||||
periodicInterval: 0
|
||||
periodicValue: 0
|
||||
controlType: 0
|
||||
slowMultiplier: 0.5
|
||||
8
Assets/Abnormalities/Abnormality_Test_Buff.asset.meta
Normal file
8
Assets/Abnormalities/Abnormality_Test_Buff.asset.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: da5a38e4e2c383940a34d9d8080fbbe0
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
24
Assets/Abnormalities/Abnormality_Test_Debuff.asset
Normal file
24
Assets/Abnormalities/Abnormality_Test_Debuff.asset
Normal file
@@ -0,0 +1,24 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: b08cc671f858a3b409170a5356e960a0, type: 3}
|
||||
m_Name: Abnormality_Test_Debuff
|
||||
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Abnormalities.AbnormalityData
|
||||
abnormalityName: Abnormality
|
||||
icon: {fileID: 21300000, guid: 173f7bf0258285c4f8bf01825ac02a11, type: 3}
|
||||
duration: 99
|
||||
level: 1
|
||||
isDebuff: 1
|
||||
statModifiers: []
|
||||
periodicInterval: 0
|
||||
periodicValue: 0
|
||||
controlType: 0
|
||||
slowMultiplier: 0.5
|
||||
8
Assets/Abnormalities/Abnormality_Test_Debuff.asset.meta
Normal file
8
Assets/Abnormalities/Abnormality_Test_Debuff.asset.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c4abb0f89779f294ab99562e085e8f3b
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -55,6 +55,20 @@ ModelImporter:
|
||||
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
|
||||
curves: []
|
||||
events:
|
||||
- time: 0.4590326
|
||||
functionName: OnEffect
|
||||
data:
|
||||
objectReferenceParameter: {instanceID: 0}
|
||||
floatParameter: 0
|
||||
intParameter: 1
|
||||
messageOptions: 0
|
||||
- time: 0.46052074
|
||||
functionName: OnEffect
|
||||
data:
|
||||
objectReferenceParameter: {instanceID: 0}
|
||||
floatParameter: 0
|
||||
intParameter: 2
|
||||
messageOptions: 0
|
||||
- time: 0.4627699
|
||||
functionName: OnEffect
|
||||
data:
|
||||
|
||||
BIN
Assets/External_Used/UI/SPR_FantasyWarrior_Frame_Box_16.png
Normal file
BIN
Assets/External_Used/UI/SPR_FantasyWarrior_Frame_Box_16.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 59 KiB |
108
Assets/External_Used/UI/SPR_FantasyWarrior_Frame_Box_16.png.meta
Normal file
108
Assets/External_Used/UI/SPR_FantasyWarrior_Frame_Box_16.png.meta
Normal file
@@ -0,0 +1,108 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 976db4f04c3bd4e469e9b8eb2c20e1ca
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 11
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: -1
|
||||
aniso: -1
|
||||
mipBias: -100
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 0
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 80, y: 80, z: 80, w: 80}
|
||||
spriteGenerateFallbackPhysicsShape: 0
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 5e97eb03825dee720800000000000000
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
696
Assets/External_Used/UI/UI_AbnormalitySlot.prefab
Normal file
696
Assets/External_Used/UI/UI_AbnormalitySlot.prefab
Normal file
@@ -0,0 +1,696 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &3383354828365798028
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 8742265258977334277}
|
||||
- component: {fileID: 3698892055439276710}
|
||||
- component: {fileID: 9068576939756357679}
|
||||
- component: {fileID: 8350059981962847808}
|
||||
- component: {fileID: 800351318774919540}
|
||||
- component: {fileID: 5402880947663824673}
|
||||
m_Layer: 5
|
||||
m_Name: UI_AbnormalitySlot
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &8742265258977334277
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3383354828365798028}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 2211778034640404479}
|
||||
- {fileID: 2830353451877067372}
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 0, y: 0}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 50, y: 50}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!222 &3698892055439276710
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3383354828365798028}
|
||||
m_CullTransparentMesh: 1
|
||||
--- !u!114 &9068576939756357679
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3383354828365798028}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 0, g: 1, b: 0.14357352, a: 0}
|
||||
m_RaycastTarget: 1
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 0
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_Sprite: {fileID: 0}
|
||||
m_Type: 0
|
||||
m_PreserveAspect: 0
|
||||
m_FillCenter: 1
|
||||
m_FillMethod: 4
|
||||
m_FillAmount: 1
|
||||
m_FillClockwise: 1
|
||||
m_FillOrigin: 0
|
||||
m_UseSpriteMesh: 0
|
||||
m_PixelsPerUnitMultiplier: 1
|
||||
--- !u!114 &8350059981962847808
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3383354828365798028}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Navigation:
|
||||
m_Mode: 3
|
||||
m_WrapAround: 0
|
||||
m_SelectOnUp: {fileID: 0}
|
||||
m_SelectOnDown: {fileID: 0}
|
||||
m_SelectOnLeft: {fileID: 0}
|
||||
m_SelectOnRight: {fileID: 0}
|
||||
m_Transition: 3
|
||||
m_Colors:
|
||||
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
|
||||
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
|
||||
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
|
||||
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
|
||||
m_ColorMultiplier: 1
|
||||
m_FadeDuration: 0.1
|
||||
m_SpriteState:
|
||||
m_HighlightedSprite: {fileID: 0}
|
||||
m_PressedSprite: {fileID: 0}
|
||||
m_SelectedSprite: {fileID: 0}
|
||||
m_DisabledSprite: {fileID: 0}
|
||||
m_AnimationTriggers:
|
||||
m_NormalTrigger: Normal
|
||||
m_HighlightedTrigger: Highlighted
|
||||
m_PressedTrigger: Pressed
|
||||
m_SelectedTrigger: Selected
|
||||
m_DisabledTrigger: Disabled
|
||||
m_Interactable: 1
|
||||
m_TargetGraphic: {fileID: 9068576939756357679}
|
||||
m_OnClick:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
--- !u!95 &800351318774919540
|
||||
Animator:
|
||||
serializedVersion: 7
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3383354828365798028}
|
||||
m_Enabled: 1
|
||||
m_Avatar: {fileID: 0}
|
||||
m_Controller: {fileID: 9100000, guid: f6c1759d41da8c942acb67824989a5b8, type: 2}
|
||||
m_CullingMode: 0
|
||||
m_UpdateMode: 0
|
||||
m_ApplyRootMotion: 0
|
||||
m_LinearVelocityBlending: 0
|
||||
m_StabilizeFeet: 0
|
||||
m_AnimatePhysics: 0
|
||||
m_WarningMessage:
|
||||
m_HasTransformHierarchy: 1
|
||||
m_AllowConstantClipSamplingOptimization: 1
|
||||
m_KeepAnimatorStateOnDisable: 0
|
||||
m_WriteDefaultValuesOnDisable: 0
|
||||
--- !u!114 &5402880947663824673
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3383354828365798028}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 287a45a81e69cbf48845f88759cf7eb4, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
iconImage: {fileID: 8225599256848301212}
|
||||
durationFill: {fileID: 3807928883176071825}
|
||||
durationText: {fileID: 2584127467159023136}
|
||||
effectNameText: {fileID: 0}
|
||||
backgroundImage: {fileID: 6218527427496975808}
|
||||
buffColor: {r: 0.2, g: 0.6, b: 0.2, a: 0.8}
|
||||
debuffColor: {r: 0.6, g: 0.2, b: 0.2, a: 0.8}
|
||||
--- !u!1 &3546204093425322779
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 2830353451877067372}
|
||||
- component: {fileID: 8318959168881738735}
|
||||
- component: {fileID: 5659953853696642109}
|
||||
- component: {fileID: 3039300877730597146}
|
||||
m_Layer: 5
|
||||
m_Name: SPR_Frame
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &2830353451877067372
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3546204093425322779}
|
||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 8742265258977334277}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!222 &8318959168881738735
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3546204093425322779}
|
||||
m_CullTransparentMesh: 1
|
||||
--- !u!114 &5659953853696642109
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3546204093425322779}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 0, g: 1, b: 0, a: 1}
|
||||
m_RaycastTarget: 0
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 0
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_Sprite: {fileID: 21300000, guid: 976db4f04c3bd4e469e9b8eb2c20e1ca, type: 3}
|
||||
m_Type: 0
|
||||
m_PreserveAspect: 0
|
||||
m_FillCenter: 1
|
||||
m_FillMethod: 4
|
||||
m_FillAmount: 1
|
||||
m_FillClockwise: 1
|
||||
m_FillOrigin: 0
|
||||
m_UseSpriteMesh: 0
|
||||
m_PixelsPerUnitMultiplier: 4
|
||||
--- !u!225 &3039300877730597146
|
||||
CanvasGroup:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3546204093425322779}
|
||||
m_Enabled: 1
|
||||
m_Alpha: 1
|
||||
m_Interactable: 0
|
||||
m_BlocksRaycasts: 0
|
||||
m_IgnoreParentGroups: 0
|
||||
--- !u!1 &4902539774281912895
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 2062133184972599418}
|
||||
- component: {fileID: 5719122352651651396}
|
||||
m_Layer: 5
|
||||
m_Name: Item
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &2062133184972599418
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 4902539774281912895}
|
||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 1336485923641369346}
|
||||
m_Father: {fileID: 2211778034640404479}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!225 &5719122352651651396
|
||||
CanvasGroup:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 4902539774281912895}
|
||||
m_Enabled: 1
|
||||
m_Alpha: 1
|
||||
m_Interactable: 0
|
||||
m_BlocksRaycasts: 0
|
||||
m_IgnoreParentGroups: 0
|
||||
--- !u!1 &5010645131502399754
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 441187093428371753}
|
||||
- component: {fileID: 7014205823490043849}
|
||||
m_Layer: 5
|
||||
m_Name: Normal
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &441187093428371753
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5010645131502399754}
|
||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 1901598294175631088}
|
||||
m_Father: {fileID: 2211778034640404479}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!222 &7014205823490043849
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5010645131502399754}
|
||||
m_CullTransparentMesh: 1
|
||||
--- !u!1 &7471771060503184807
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1901598294175631088}
|
||||
- component: {fileID: 2489496512246523176}
|
||||
- component: {fileID: 6218527427496975808}
|
||||
m_Layer: 5
|
||||
m_Name: SPR_Background
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &1901598294175631088
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7471771060503184807}
|
||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 441187093428371753}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!222 &2489496512246523176
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7471771060503184807}
|
||||
m_CullTransparentMesh: 1
|
||||
--- !u!114 &6218527427496975808
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7471771060503184807}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 0, g: 0.12990497, b: 0.23584908, a: 0.9019608}
|
||||
m_RaycastTarget: 0
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_Sprite: {fileID: 21300000, guid: 626f1122650d7b344a394cf52ebb14ec, type: 3}
|
||||
m_Type: 0
|
||||
m_PreserveAspect: 0
|
||||
m_FillCenter: 1
|
||||
m_FillMethod: 4
|
||||
m_FillAmount: 1
|
||||
m_FillClockwise: 1
|
||||
m_FillOrigin: 0
|
||||
m_UseSpriteMesh: 0
|
||||
m_PixelsPerUnitMultiplier: 2.6
|
||||
--- !u!1 &8154639474077861285
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 2211778034640404479}
|
||||
m_Layer: 5
|
||||
m_Name: MASK
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &2211778034640404479
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 8154639474077861285}
|
||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 441187093428371753}
|
||||
- {fileID: 2062133184972599418}
|
||||
m_Father: {fileID: 8742265258977334277}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!1001 &3573928083118294605
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
serializedVersion: 3
|
||||
m_TransformParent: {fileID: 2062133184972599418}
|
||||
m_Modifications:
|
||||
- target: {fileID: 378688860670387420, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_Type
|
||||
value: 3
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 378688860670387420, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_Color.a
|
||||
value: 0.39215687
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 378688860670387420, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_Color.b
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 378688860670387420, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_Color.g
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 378688860670387420, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_Color.r
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 378688860670387420, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_FillAmount
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 378688860670387420, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_FillMethod
|
||||
value: 4
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 378688860670387420, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_FillOrigin
|
||||
value: 2
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 378688860670387420, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_FillClockwise
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1316615260321933421, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_text
|
||||
value: 99
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1316615260321933421, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_fontSize
|
||||
value: 16
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1316615260321933421, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_margin.x
|
||||
value: -4.874298
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1316615260321933421, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_margin.z
|
||||
value: -4.115387
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1316615260321933421, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_fontSizeBase
|
||||
value: 16
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1316615260321933421, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_VerticalAlignment
|
||||
value: 256
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1316615260321933421, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_HorizontalAlignment
|
||||
value: 2
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1316615260321933421, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: 'm_ActiveFontFeatures.Array.data[0]'
|
||||
value: 1801810542
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_Pivot.x
|
||||
value: 0.5
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_Pivot.y
|
||||
value: 0.5
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_RootOrder
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_AnchorMax.x
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_AnchorMin.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_AnchorMin.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_SizeDelta.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_SizeDelta.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_LocalRotation.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_LocalRotation.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_LocalRotation.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2889380205718597033, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_IsActive
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3471770531181138231, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_SizeDelta.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3471770531181138231, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_SizeDelta.y
|
||||
value: 30
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3471770531181138231, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_AnchoredPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3471770531181138231, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 15
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4290268768443257266, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_CullTransparentMesh
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6658490951639871620, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_Name
|
||||
value: CooldownItem
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 8431704748052656868, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
propertyPath: m_IsActive
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects: []
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
--- !u!224 &1336485923641369346 stripped
|
||||
RectTransform:
|
||||
m_CorrespondingSourceObject: {fileID: 2527929489434551631, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
m_PrefabInstance: {fileID: 3573928083118294605}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
--- !u!114 &2584127467159023136 stripped
|
||||
MonoBehaviour:
|
||||
m_CorrespondingSourceObject: {fileID: 1316615260321933421, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
m_PrefabInstance: {fileID: 3573928083118294605}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
--- !u!114 &3807928883176071825 stripped
|
||||
MonoBehaviour:
|
||||
m_CorrespondingSourceObject: {fileID: 378688860670387420, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
m_PrefabInstance: {fileID: 3573928083118294605}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
--- !u!114 &8225599256848301212 stripped
|
||||
MonoBehaviour:
|
||||
m_CorrespondingSourceObject: {fileID: 4881363607392615121, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
|
||||
m_PrefabInstance: {fileID: 3573928083118294605}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
7
Assets/External_Used/UI/UI_AbnormalitySlot.prefab.meta
Normal file
7
Assets/External_Used/UI/UI_AbnormalitySlot.prefab.meta
Normal file
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 60d898ecea82b6c429850e04d2e95b7c
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -20,6 +20,7 @@ GameObject:
|
||||
- component: {fileID: 6048740021537676210}
|
||||
- component: {fileID: 6912018896034183004}
|
||||
- component: {fileID: 6585367215453362640}
|
||||
- component: {fileID: 7524694206394173403}
|
||||
m_Layer: 0
|
||||
m_Name: Player
|
||||
m_TagString: Untagged
|
||||
@@ -134,6 +135,7 @@ MonoBehaviour:
|
||||
gravity: -9.81
|
||||
jumpForce: 5
|
||||
skillController: {fileID: 0}
|
||||
animator: {fileID: 0}
|
||||
--- !u!114 &194806265065691022
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -193,8 +195,7 @@ MonoBehaviour:
|
||||
m_Name:
|
||||
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Player.PlayerNetworkController
|
||||
ShowTopMostFoldoutHeaderGroup: 1
|
||||
maxHealth: 100
|
||||
maxMana: 50
|
||||
characterStats: {fileID: 0}
|
||||
--- !u!114 &8606252901290138286
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -248,7 +249,10 @@ Animator:
|
||||
m_LinearVelocityBlending: 0
|
||||
m_StabilizeFeet: 0
|
||||
m_AnimatePhysics: 0
|
||||
m_WarningMessage:
|
||||
m_WarningMessage: "\nBinding warning: Some generic clip(s) animate transforms that
|
||||
are already bound by a Humanoid avatar. These transforms can only be changed
|
||||
by Humanoid clips.\n\tTransform 'Toes_R'\n\tTransform 'Toes_R'\n\tFrom animation
|
||||
clip 'A_Idle_Base_Sword'\n\tFrom animation clip 'A_Attack_LightCombo01A_Sword'"
|
||||
m_HasTransformHierarchy: 1
|
||||
m_AllowConstantClipSamplingOptimization: 1
|
||||
m_KeepAnimatorStateOnDisable: 0
|
||||
@@ -287,6 +291,8 @@ MonoBehaviour:
|
||||
baseController: {fileID: 9100000, guid: db718381bb2992e469c76c64015e065b, type: 2}
|
||||
baseSkillClip: {fileID: -7717634560727564301, guid: 079bd00af1b92964d8973dcbf2dcd21f, type: 3}
|
||||
debugMode: 1
|
||||
showAreaDebug: 1
|
||||
debugDrawDuration: 1
|
||||
--- !u!114 &6585367215453362640
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -308,6 +314,22 @@ MonoBehaviour:
|
||||
- {fileID: 0}
|
||||
- {fileID: 0}
|
||||
skillController: {fileID: 6912018896034183004}
|
||||
networkController: {fileID: 0}
|
||||
--- !u!114 &7524694206394173403
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 6473031571298860035}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 1301e893694bcc741a7c4c9be05334ad, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier: Colosseum.Game::Colosseum.StatusEffects.StatusEffectManager
|
||||
ShowTopMostFoldoutHeaderGroup: 1
|
||||
characterStats: {fileID: 0}
|
||||
networkController: {fileID: 0}
|
||||
--- !u!1001 &7705728874586931617
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
|
||||
@@ -250,6 +250,7 @@ RectTransform:
|
||||
m_Children:
|
||||
- {fileID: 1162990049}
|
||||
- {fileID: 7078605117837265129}
|
||||
- {fileID: 1269404371}
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
@@ -1121,6 +1122,68 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI
|
||||
--- !u!1 &972424299
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 972424300}
|
||||
- component: {fileID: 972424301}
|
||||
m_Layer: 5
|
||||
m_Name: Bad Abnormalities
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &972424300
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 972424299}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 1269404371}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 0, y: 0}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 400, y: 100}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!114 &972424301
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 972424299}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.HorizontalLayoutGroup
|
||||
m_Padding:
|
||||
m_Left: 0
|
||||
m_Right: 0
|
||||
m_Top: 0
|
||||
m_Bottom: 0
|
||||
m_ChildAlignment: 0
|
||||
m_Spacing: 0
|
||||
m_ChildForceExpandWidth: 1
|
||||
m_ChildForceExpandHeight: 1
|
||||
m_ChildControlWidth: 0
|
||||
m_ChildControlHeight: 0
|
||||
m_ChildScaleWidth: 0
|
||||
m_ChildScaleHeight: 0
|
||||
m_ReverseArrangement: 0
|
||||
--- !u!1 &998115954
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -1328,6 +1391,88 @@ MonoBehaviour:
|
||||
useColorTransition: 0
|
||||
smoothTransition: 1
|
||||
lerpSpeed: 15
|
||||
--- !u!1 &1269404370
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1269404371}
|
||||
- component: {fileID: 1269404372}
|
||||
- component: {fileID: 1269404373}
|
||||
m_Layer: 5
|
||||
m_Name: Abnormalities
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &1269404371
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1269404370}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 1873670928}
|
||||
- {fileID: 972424300}
|
||||
m_Father: {fileID: 260528176}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0.5, y: 0}
|
||||
m_AnchorMax: {x: 0.5, y: 0}
|
||||
m_AnchoredPosition: {x: -520, y: 120}
|
||||
m_SizeDelta: {x: 400, y: 200}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!114 &1269404372
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1269404370}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup
|
||||
m_Padding:
|
||||
m_Left: 0
|
||||
m_Right: 0
|
||||
m_Top: 0
|
||||
m_Bottom: 0
|
||||
m_ChildAlignment: 0
|
||||
m_Spacing: 0
|
||||
m_ChildForceExpandWidth: 1
|
||||
m_ChildForceExpandHeight: 1
|
||||
m_ChildControlWidth: 0
|
||||
m_ChildControlHeight: 0
|
||||
m_ChildScaleWidth: 0
|
||||
m_ChildScaleHeight: 0
|
||||
m_ReverseArrangement: 0
|
||||
--- !u!114 &1269404373
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1269404370}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 15447f4a4d271354fb52bbdf1a526c6e, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
buffContainer: {fileID: 1873670928}
|
||||
debuffContainer: {fileID: 972424300}
|
||||
slotPrefab: {fileID: 5402880947663824673, guid: 287a45a81e69cbf48845f88759cf7eb4, type: 3}
|
||||
maxSlots: 10
|
||||
autoFindPlayer: 1
|
||||
--- !u!1 &1432187382
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -1576,6 +1721,68 @@ Transform:
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1 &1873670927
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1873670928}
|
||||
- component: {fileID: 1873670929}
|
||||
m_Layer: 5
|
||||
m_Name: Good Abnormalities
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &1873670928
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1873670927}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 1269404371}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 0, y: 0}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 400, y: 100}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!114 &1873670929
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1873670927}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.HorizontalLayoutGroup
|
||||
m_Padding:
|
||||
m_Left: 0
|
||||
m_Right: 0
|
||||
m_Top: 0
|
||||
m_Bottom: 0
|
||||
m_ChildAlignment: 0
|
||||
m_Spacing: 0
|
||||
m_ChildForceExpandWidth: 1
|
||||
m_ChildForceExpandHeight: 1
|
||||
m_ChildControlWidth: 0
|
||||
m_ChildControlHeight: 0
|
||||
m_ChildScaleWidth: 0
|
||||
m_ChildScaleHeight: 0
|
||||
m_ReverseArrangement: 0
|
||||
--- !u!1 &2122318093
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
|
||||
8
Assets/Scripts/Abnormalities.meta
Normal file
8
Assets/Scripts/Abnormalities.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bc6434195fb88a443939a5a0b2747f0a
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
101
Assets/Scripts/Abnormalities/AbnormalityData.cs
Normal file
101
Assets/Scripts/Abnormalities/AbnormalityData.cs
Normal file
@@ -0,0 +1,101 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using Colosseum.Stats;
|
||||
|
||||
namespace Colosseum.Abnormalities
|
||||
{
|
||||
/// <summary>
|
||||
/// 제어 효과 타입
|
||||
/// </summary>
|
||||
public enum ControlType
|
||||
{
|
||||
None, // 제어 효과 없음
|
||||
Stun, // 기절 (이동, 스킬 사용 불가)
|
||||
Silence, // 침묵 (스킬 사용 불가)
|
||||
Slow // 둔화 (이동 속도 감소)
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 스탯 수정자 엔트리
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class AbnormalityStatModifier
|
||||
{
|
||||
[Tooltip("수정할 스탯 타입")]
|
||||
public StatType statType;
|
||||
|
||||
[Tooltip("수정값")]
|
||||
public float value;
|
||||
|
||||
[Tooltip("수정 타입 (Flat: 고정값, PercentAdd: 퍼센트 합산, PercentMult: 퍼센트 곱셈)")]
|
||||
public StatModType modType;
|
||||
|
||||
public AbnormalityStatModifier() { }
|
||||
|
||||
public AbnormalityStatModifier(StatType statType, float value, StatModType modType)
|
||||
{
|
||||
this.statType = statType;
|
||||
this.value = value;
|
||||
this.modType = modType;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 이상 상태 정의 ScriptableObject
|
||||
/// 버프/디버프의 데이터를 정의합니다.
|
||||
/// </summary>
|
||||
[CreateAssetMenu(fileName = "AbnormalityData", menuName = "Colosseum/Abnormalities/Abnormality")]
|
||||
public class AbnormalityData : ScriptableObject
|
||||
{
|
||||
[Header("기본 정보")]
|
||||
[Tooltip("이상 상태 이름")]
|
||||
public string abnormalityName = "Abnormality";
|
||||
|
||||
[Tooltip("아이콘")]
|
||||
public Sprite icon;
|
||||
|
||||
[Tooltip("지속 시간 (초, 0 이하면 영구)")]
|
||||
public float duration = 5f;
|
||||
|
||||
[Tooltip("효과 레벨 (중복 처리용, 높으면 우선)")]
|
||||
public int level = 1;
|
||||
|
||||
[Tooltip("디버프 여부")]
|
||||
public bool isDebuff = false;
|
||||
|
||||
[Header("스탯 수정자")]
|
||||
[Tooltip("스탯에 적용할 수정자 목록")]
|
||||
public List<AbnormalityStatModifier> statModifiers = new List<AbnormalityStatModifier>();
|
||||
|
||||
[Header("주기적 효과 (DoT/HoT)")]
|
||||
[Tooltip("주기적 효과 간격 (초, 0이면 비활성)")]
|
||||
public float periodicInterval = 0f;
|
||||
|
||||
[Tooltip("주기적 효과값 (양수=힐, 음수=데미지)")]
|
||||
public float periodicValue = 0f;
|
||||
|
||||
[Header("제어 효과 (CC)")]
|
||||
[Tooltip("제어 효과 타입")]
|
||||
public ControlType controlType = ControlType.None;
|
||||
|
||||
[Tooltip("둔화 배율 (Slow일 때, 0.5 = 50% 감소)")]
|
||||
[Range(0f, 1f)]
|
||||
public float slowMultiplier = 0.5f;
|
||||
|
||||
/// <summary>
|
||||
/// 영구 효과인지 확인
|
||||
/// </summary>
|
||||
public bool IsPermanent => duration <= 0f;
|
||||
|
||||
/// <summary>
|
||||
/// 주기적 효과가 있는지 확인
|
||||
/// </summary>
|
||||
public bool HasPeriodicEffect => periodicInterval > 0f && periodicValue != 0f;
|
||||
|
||||
/// <summary>
|
||||
/// 제어 효과가 있는지 확인
|
||||
/// </summary>
|
||||
public bool HasControlEffect => controlType != ControlType.None;
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/Abnormalities/AbnormalityData.cs.meta
Normal file
2
Assets/Scripts/Abnormalities/AbnormalityData.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b08cc671f858a3b409170a5356e960a0
|
||||
494
Assets/Scripts/Abnormalities/AbnormalityManager.cs
Normal file
494
Assets/Scripts/Abnormalities/AbnormalityManager.cs
Normal file
@@ -0,0 +1,494 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using Unity.Netcode;
|
||||
using Colosseum.Stats;
|
||||
using Colosseum.Player;
|
||||
|
||||
namespace Colosseum.Abnormalities
|
||||
{
|
||||
/// <summary>
|
||||
/// 캐릭터에 부착되어 이상 상태를 관리하는 컴포넌트
|
||||
/// 버프/디버프의 적용, 제거, 주기적 효과를 처리합니다.
|
||||
/// </summary>
|
||||
public class AbnormalityManager : NetworkBehaviour
|
||||
{
|
||||
[Header("References")]
|
||||
[Tooltip("CharacterStats 컴포넌트 (없으면 자동 검색)")]
|
||||
[SerializeField] private CharacterStats characterStats;
|
||||
|
||||
[Tooltip("PlayerNetworkController 컴포넌트 (HP/MP 관리용)")]
|
||||
[SerializeField] private PlayerNetworkController networkController;
|
||||
|
||||
// 활성화된 이상 상태 목록
|
||||
private readonly List<ActiveAbnormality> activeAbnormalities = new List<ActiveAbnormality>();
|
||||
|
||||
// 제어 효과 상태
|
||||
private int stunCount;
|
||||
private int silenceCount;
|
||||
private float slowMultiplier = 1f;
|
||||
|
||||
// 네트워크 동기화용 데이터
|
||||
private NetworkList<AbnormalitySyncData> syncedAbnormalities;
|
||||
|
||||
/// <summary>
|
||||
/// 기절 상태 여부
|
||||
/// </summary>
|
||||
public bool IsStunned => stunCount > 0;
|
||||
|
||||
/// <summary>
|
||||
/// 침묵 상태 여부
|
||||
/// </summary>
|
||||
public bool IsSilenced => silenceCount > 0;
|
||||
|
||||
/// <summary>
|
||||
/// 이동 속도 배율 (1.0 = 기본, 0.5 = 50% 감소)
|
||||
/// </summary>
|
||||
public float MoveSpeedMultiplier => slowMultiplier;
|
||||
|
||||
/// <summary>
|
||||
/// 행동 가능 여부 (기절이 아닐 때)
|
||||
/// </summary>
|
||||
public bool CanAct => !IsStunned;
|
||||
|
||||
/// <summary>
|
||||
/// 스킬 사용 가능 여부
|
||||
/// </summary>
|
||||
public bool CanUseSkills => !IsStunned && !IsSilenced;
|
||||
|
||||
/// <summary>
|
||||
/// 활성화된 이상 상태 목록 (읽기 전용)
|
||||
/// </summary>
|
||||
public IReadOnlyList<ActiveAbnormality> ActiveAbnormalities => activeAbnormalities;
|
||||
|
||||
// 이벤트
|
||||
public event Action<ActiveAbnormality> OnAbnormalityAdded;
|
||||
public event Action<ActiveAbnormality> OnAbnormalityRemoved;
|
||||
public event Action OnAbnormalitiesChanged;
|
||||
|
||||
/// <summary>
|
||||
/// 네트워크 동기화용 이상 상태 데이터 구조체
|
||||
/// </summary>
|
||||
private struct AbnormalitySyncData : INetworkSerializable, IEquatable<AbnormalitySyncData>
|
||||
{
|
||||
public int AbnormalityId;
|
||||
public float RemainingDuration;
|
||||
public ulong SourceClientId;
|
||||
|
||||
public void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReaderWriter
|
||||
{
|
||||
serializer.SerializeValue(ref AbnormalityId);
|
||||
serializer.SerializeValue(ref RemainingDuration);
|
||||
serializer.SerializeValue(ref SourceClientId);
|
||||
}
|
||||
|
||||
public bool Equals(AbnormalitySyncData other)
|
||||
{
|
||||
return AbnormalityId == other.AbnormalityId;
|
||||
}
|
||||
}
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (characterStats == null)
|
||||
characterStats = GetComponent<CharacterStats>();
|
||||
|
||||
if (networkController == null)
|
||||
networkController = GetComponent<PlayerNetworkController>();
|
||||
|
||||
syncedAbnormalities = new NetworkList<AbnormalitySyncData>();
|
||||
}
|
||||
|
||||
public override void OnNetworkSpawn()
|
||||
{
|
||||
syncedAbnormalities.OnListChanged += OnSyncedAbnormalitiesChanged;
|
||||
}
|
||||
|
||||
public override void OnNetworkDespawn()
|
||||
{
|
||||
syncedAbnormalities.OnListChanged -= OnSyncedAbnormalitiesChanged;
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (!IsServer) return;
|
||||
|
||||
UpdateAbnormalities(Time.deltaTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 이상 상태 적용
|
||||
/// </summary>
|
||||
/// <param name="data">적용할 이상 상태 데이터</param>
|
||||
/// <param name="source">효과 시전자</param>
|
||||
public void ApplyAbnormality(AbnormalityData data, GameObject source)
|
||||
{
|
||||
if (data == null)
|
||||
{
|
||||
Debug.LogWarning("[Abnormality] ApplyAbnormality called with null data");
|
||||
return;
|
||||
}
|
||||
|
||||
if (IsServer)
|
||||
{
|
||||
ApplyAbnormalityInternal(data, source);
|
||||
}
|
||||
else
|
||||
{
|
||||
var sourceNetId = source != null && source.TryGetComponent<NetworkObject>(out var netObj) ? netObj.NetworkObjectId : 0UL;
|
||||
ApplyAbnormalityServerRpc(data.GetInstanceID(), sourceNetId);
|
||||
}
|
||||
}
|
||||
|
||||
[Rpc(SendTo.Server)]
|
||||
private void ApplyAbnormalityServerRpc(int dataId, ulong sourceNetworkId)
|
||||
{
|
||||
var data = FindAbnormalityDataById(dataId);
|
||||
if (data == null)
|
||||
{
|
||||
Debug.LogWarning($"[Abnormality] Could not find data with ID: {dataId}");
|
||||
return;
|
||||
}
|
||||
|
||||
GameObject source = null;
|
||||
if (sourceNetworkId != 0UL && NetworkManager.Singleton.SpawnManager.SpawnedObjects.TryGetValue(sourceNetworkId, out var netObj))
|
||||
{
|
||||
source = netObj.gameObject;
|
||||
}
|
||||
|
||||
ApplyAbnormalityInternal(data, source);
|
||||
}
|
||||
|
||||
private void ApplyAbnormalityInternal(AbnormalityData data, GameObject source)
|
||||
{
|
||||
var existing = FindExistingAbnormality(data);
|
||||
|
||||
if (existing != null)
|
||||
{
|
||||
if (existing.Data == data)
|
||||
{
|
||||
existing.RefreshDuration();
|
||||
UpdateSyncedAbnormalityDuration(existing);
|
||||
Debug.Log($"[Abnormality] Refreshed {data.abnormalityName} on {gameObject.name}");
|
||||
return;
|
||||
}
|
||||
|
||||
if (data.level > existing.Data.level)
|
||||
{
|
||||
RemoveAbnormalityInternal(existing);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log($"[Abnormality] Ignored {data.abnormalityName} (level {data.level}) - existing level {existing.Data.level} is higher or equal");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
var newAbnormality = new ActiveAbnormality(data, source);
|
||||
activeAbnormalities.Add(newAbnormality);
|
||||
|
||||
ApplyStatModifiers(newAbnormality);
|
||||
ApplyControlEffect(data);
|
||||
SyncAbnormalityAdd(newAbnormality, source);
|
||||
|
||||
OnAbnormalityAdded?.Invoke(newAbnormality);
|
||||
OnAbnormalitiesChanged?.Invoke();
|
||||
|
||||
Debug.Log($"[Abnormality] Applied {data.abnormalityName} (level {data.level}) to {gameObject.name} for {data.duration}s");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 이상 상태 제거
|
||||
/// </summary>
|
||||
/// <param name="data">제거할 이상 상태 데이터</param>
|
||||
public void RemoveAbnormality(AbnormalityData data)
|
||||
{
|
||||
if (data == null) return;
|
||||
|
||||
if (IsServer)
|
||||
{
|
||||
var abnormality = FindExistingAbnormality(data);
|
||||
if (abnormality != null)
|
||||
{
|
||||
RemoveAbnormalityInternal(abnormality);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
RemoveAbnormalityServerRpc(data.GetInstanceID());
|
||||
}
|
||||
}
|
||||
|
||||
[Rpc(SendTo.Server)]
|
||||
private void RemoveAbnormalityServerRpc(int dataId)
|
||||
{
|
||||
var abnormality = activeAbnormalities.Find(a => a.Data.GetInstanceID() == dataId);
|
||||
if (abnormality != null)
|
||||
{
|
||||
RemoveAbnormalityInternal(abnormality);
|
||||
}
|
||||
}
|
||||
|
||||
private void RemoveAbnormalityInternal(ActiveAbnormality abnormality)
|
||||
{
|
||||
RemoveStatModifiers(abnormality);
|
||||
RemoveControlEffect(abnormality.Data);
|
||||
SyncAbnormalityRemove(abnormality);
|
||||
activeAbnormalities.Remove(abnormality);
|
||||
|
||||
OnAbnormalityRemoved?.Invoke(abnormality);
|
||||
OnAbnormalitiesChanged?.Invoke();
|
||||
|
||||
Debug.Log($"[Abnormality] Removed {abnormality.Data.abnormalityName} from {gameObject.name}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 모든 이상 상태 제거
|
||||
/// </summary>
|
||||
public void RemoveAllAbnormalities()
|
||||
{
|
||||
if (!IsServer)
|
||||
{
|
||||
RemoveAllAbnormalitiesServerRpc();
|
||||
return;
|
||||
}
|
||||
|
||||
while (activeAbnormalities.Count > 0)
|
||||
{
|
||||
RemoveAbnormalityInternal(activeAbnormalities[0]);
|
||||
}
|
||||
}
|
||||
|
||||
[Rpc(SendTo.Server)]
|
||||
private void RemoveAllAbnormalitiesServerRpc()
|
||||
{
|
||||
RemoveAllAbnormalities();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 특정 출처의 모든 이상 상태 제거
|
||||
/// </summary>
|
||||
public void RemoveAbnormalitiesFromSource(GameObject source)
|
||||
{
|
||||
if (!IsServer)
|
||||
{
|
||||
var sourceNetId = source != null && source.TryGetComponent<NetworkObject>(out var netObj) ? netObj.NetworkObjectId : 0UL;
|
||||
RemoveAbnormalitiesFromSourceServerRpc(sourceNetId);
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = activeAbnormalities.Count - 1; i >= 0; i--)
|
||||
{
|
||||
if (activeAbnormalities[i].Source == source)
|
||||
{
|
||||
RemoveAbnormalityInternal(activeAbnormalities[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Rpc(SendTo.Server)]
|
||||
private void RemoveAbnormalitiesFromSourceServerRpc(ulong sourceNetworkId)
|
||||
{
|
||||
for (int i = activeAbnormalities.Count - 1; i >= 0; i--)
|
||||
{
|
||||
var abnormality = activeAbnormalities[i];
|
||||
var sourceNetId = abnormality.Source != null && abnormality.Source.TryGetComponent<NetworkObject>(out var netObj) ? netObj.NetworkObjectId : 0UL;
|
||||
if (sourceNetId == sourceNetworkId)
|
||||
{
|
||||
RemoveAbnormalityInternal(abnormality);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateAbnormalities(float deltaTime)
|
||||
{
|
||||
for (int i = activeAbnormalities.Count - 1; i >= 0; i--)
|
||||
{
|
||||
var abnormality = activeAbnormalities[i];
|
||||
|
||||
if (abnormality.CanTriggerPeriodic())
|
||||
{
|
||||
TriggerPeriodicEffect(abnormality);
|
||||
}
|
||||
|
||||
if (abnormality.Tick(deltaTime))
|
||||
{
|
||||
RemoveAbnormalityInternal(abnormality);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void TriggerPeriodicEffect(ActiveAbnormality abnormality)
|
||||
{
|
||||
if (networkController == null) return;
|
||||
|
||||
float value = abnormality.Data.periodicValue;
|
||||
|
||||
if (value > 0)
|
||||
{
|
||||
networkController.RestoreHealthRpc(value);
|
||||
Debug.Log($"[Abnormality] Periodic heal: +{value} HP from {abnormality.Data.abnormalityName}");
|
||||
}
|
||||
else if (value < 0)
|
||||
{
|
||||
networkController.TakeDamageRpc(-value);
|
||||
Debug.Log($"[Abnormality] Periodic damage: {-value} HP from {abnormality.Data.abnormalityName}");
|
||||
}
|
||||
}
|
||||
|
||||
private ActiveAbnormality FindExistingAbnormality(AbnormalityData data)
|
||||
{
|
||||
return activeAbnormalities.Find(a => a.Data.abnormalityName == data.abnormalityName);
|
||||
}
|
||||
|
||||
private void ApplyStatModifiers(ActiveAbnormality abnormality)
|
||||
{
|
||||
if (characterStats == null) return;
|
||||
|
||||
foreach (var entry in abnormality.Data.statModifiers)
|
||||
{
|
||||
var stat = characterStats.GetStat(entry.statType);
|
||||
if (stat != null)
|
||||
{
|
||||
var modifier = new StatModifier(entry.value, entry.modType, abnormality);
|
||||
abnormality.AppliedModifiers.Add(modifier);
|
||||
stat.AddModifier(modifier);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void RemoveStatModifiers(ActiveAbnormality abnormality)
|
||||
{
|
||||
if (characterStats == null) return;
|
||||
|
||||
foreach (StatType statType in Enum.GetValues(typeof(StatType)))
|
||||
{
|
||||
var stat = characterStats.GetStat(statType);
|
||||
stat?.RemoveAllModifiersFromSource(abnormality);
|
||||
}
|
||||
|
||||
abnormality.AppliedModifiers.Clear();
|
||||
}
|
||||
|
||||
private void ApplyControlEffect(AbnormalityData data)
|
||||
{
|
||||
switch (data.controlType)
|
||||
{
|
||||
case ControlType.Stun:
|
||||
stunCount++;
|
||||
break;
|
||||
|
||||
case ControlType.Silence:
|
||||
silenceCount++;
|
||||
break;
|
||||
|
||||
case ControlType.Slow:
|
||||
slowMultiplier = Mathf.Min(slowMultiplier, data.slowMultiplier);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void RemoveControlEffect(AbnormalityData data)
|
||||
{
|
||||
switch (data.controlType)
|
||||
{
|
||||
case ControlType.Stun:
|
||||
stunCount = Mathf.Max(0, stunCount - 1);
|
||||
break;
|
||||
|
||||
case ControlType.Silence:
|
||||
silenceCount = Mathf.Max(0, silenceCount - 1);
|
||||
break;
|
||||
|
||||
case ControlType.Slow:
|
||||
RecalculateSlowMultiplier();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void RecalculateSlowMultiplier()
|
||||
{
|
||||
slowMultiplier = 1f;
|
||||
|
||||
foreach (var abnormality in activeAbnormalities)
|
||||
{
|
||||
if (abnormality.Data.controlType == ControlType.Slow)
|
||||
{
|
||||
slowMultiplier = Mathf.Min(slowMultiplier, abnormality.Data.slowMultiplier);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SyncAbnormalityAdd(ActiveAbnormality abnormality, GameObject source)
|
||||
{
|
||||
var sourceClientId = source != null && source.TryGetComponent<NetworkObject>(out var netObj) ? netObj.OwnerClientId : 0UL;
|
||||
|
||||
var syncData = new AbnormalitySyncData
|
||||
{
|
||||
AbnormalityId = abnormality.Data.GetInstanceID(),
|
||||
RemainingDuration = abnormality.RemainingDuration,
|
||||
SourceClientId = sourceClientId
|
||||
};
|
||||
|
||||
syncedAbnormalities.Add(syncData);
|
||||
}
|
||||
|
||||
private void UpdateSyncedAbnormalityDuration(ActiveAbnormality abnormality)
|
||||
{
|
||||
for (int i = 0; i < syncedAbnormalities.Count; i++)
|
||||
{
|
||||
if (syncedAbnormalities[i].AbnormalityId == abnormality.Data.GetInstanceID())
|
||||
{
|
||||
var syncData = syncedAbnormalities[i];
|
||||
syncData.RemainingDuration = abnormality.RemainingDuration;
|
||||
syncedAbnormalities[i] = syncData;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SyncAbnormalityRemove(ActiveAbnormality abnormality)
|
||||
{
|
||||
for (int i = 0; i < syncedAbnormalities.Count; i++)
|
||||
{
|
||||
if (syncedAbnormalities[i].AbnormalityId == abnormality.Data.GetInstanceID())
|
||||
{
|
||||
syncedAbnormalities.RemoveAt(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnSyncedAbnormalitiesChanged(NetworkListEvent<AbnormalitySyncData> changeEvent)
|
||||
{
|
||||
OnAbnormalitiesChanged?.Invoke();
|
||||
}
|
||||
|
||||
private AbnormalityData FindAbnormalityDataById(int instanceId)
|
||||
{
|
||||
var allData = Resources.FindObjectsOfTypeAll<AbnormalityData>();
|
||||
foreach (var data in allData)
|
||||
{
|
||||
if (data.GetInstanceID() == instanceId)
|
||||
return data;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 특정 이름의 이상 상태가 활성화되어 있는지 확인
|
||||
/// </summary>
|
||||
public bool HasAbnormality(string name)
|
||||
{
|
||||
return activeAbnormalities.Exists(a => a.Data.abnormalityName == name);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 특정 데이터의 이상 상태가 활성화되어 있는지 확인
|
||||
/// </summary>
|
||||
public bool HasAbnormality(AbnormalityData data)
|
||||
{
|
||||
return activeAbnormalities.Exists(a => a.Data.abnormalityName == data.abnormalityName);
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/Abnormalities/AbnormalityManager.cs.meta
Normal file
2
Assets/Scripts/Abnormalities/AbnormalityManager.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7a766b6ab825c1445a3385079bb32cc5
|
||||
134
Assets/Scripts/Abnormalities/ActiveAbnormality.cs
Normal file
134
Assets/Scripts/Abnormalities/ActiveAbnormality.cs
Normal file
@@ -0,0 +1,134 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using Colosseum.Stats;
|
||||
|
||||
namespace Colosseum.Abnormalities
|
||||
{
|
||||
/// <summary>
|
||||
/// 런타임 활성 이상 상태 인스턴스
|
||||
/// AbnormalityData의 인스턴스로, 실제 적용 중인 이상 상태를 관리합니다.
|
||||
/// </summary>
|
||||
public class ActiveAbnormality
|
||||
{
|
||||
/// <summary>
|
||||
/// 이상 상태 데이터
|
||||
/// </summary>
|
||||
public AbnormalityData Data { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 효과를 건 대상 (버프/디버프 시전자)
|
||||
/// </summary>
|
||||
public GameObject Source { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 남은 지속 시간
|
||||
/// </summary>
|
||||
public float RemainingDuration { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 적용된 스탯 수정자 목록
|
||||
/// </summary>
|
||||
public List<StatModifier> AppliedModifiers { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 주기적 효과 타이머
|
||||
/// </summary>
|
||||
public float PeriodicTimer { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 고유 식별자 (네트워크 동기화용)
|
||||
/// </summary>
|
||||
public Guid Id { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 활성 이상 상태 생성
|
||||
/// </summary>
|
||||
/// <param name="data">이상 상태 데이터</param>
|
||||
/// <param name="source">효과 시전자</param>
|
||||
public ActiveAbnormality(AbnormalityData data, GameObject source)
|
||||
{
|
||||
Data = data;
|
||||
Source = source;
|
||||
RemainingDuration = data.duration;
|
||||
PeriodicTimer = 0f;
|
||||
Id = Guid.NewGuid();
|
||||
AppliedModifiers = new List<StatModifier>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 지속 시간 갱신
|
||||
/// </summary>
|
||||
public void RefreshDuration()
|
||||
{
|
||||
RemainingDuration = Data.duration;
|
||||
PeriodicTimer = 0f;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 시간 경과 처리
|
||||
/// </summary>
|
||||
/// <param name="deltaTime">경과 시간</param>
|
||||
/// <returns>효과가 만료되었으면 true</returns>
|
||||
public bool Tick(float deltaTime)
|
||||
{
|
||||
// 영구 효과는 시간 감소 없음
|
||||
if (Data.IsPermanent)
|
||||
return false;
|
||||
|
||||
RemainingDuration -= deltaTime;
|
||||
|
||||
// 주기적 효과 타이머 업데이트
|
||||
if (Data.HasPeriodicEffect)
|
||||
{
|
||||
PeriodicTimer += deltaTime;
|
||||
}
|
||||
|
||||
return RemainingDuration <= 0f;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 주기적 효과 발동 가능 여부 확인
|
||||
/// </summary>
|
||||
/// <returns>발동 가능하면 true</returns>
|
||||
public bool CanTriggerPeriodic()
|
||||
{
|
||||
if (!Data.HasPeriodicEffect)
|
||||
return false;
|
||||
|
||||
if (PeriodicTimer >= Data.periodicInterval)
|
||||
{
|
||||
PeriodicTimer -= Data.periodicInterval;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 진행률 (0~1)
|
||||
/// </summary>
|
||||
public float Progress
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Data.IsPermanent)
|
||||
return 1f;
|
||||
return Mathf.Clamp01(1f - (RemainingDuration / Data.duration));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 남은 시간 비율 (1~0, UI 표시용)
|
||||
/// </summary>
|
||||
public float RemainingRatio
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Data.IsPermanent)
|
||||
return 1f;
|
||||
return Mathf.Clamp01(RemainingDuration / Data.duration);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/Abnormalities/ActiveAbnormality.cs.meta
Normal file
2
Assets/Scripts/Abnormalities/ActiveAbnormality.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b90fb3ef8cb13be4383eb397857cfa2b
|
||||
46
Assets/Scripts/Skills/Effects/AbnormalityEffect.cs
Normal file
46
Assets/Scripts/Skills/Effects/AbnormalityEffect.cs
Normal file
@@ -0,0 +1,46 @@
|
||||
using UnityEngine;
|
||||
using Colosseum.Abnormalities;
|
||||
|
||||
namespace Colosseum.Skills.Effects
|
||||
{
|
||||
/// <summary>
|
||||
/// 이상 상태 효과
|
||||
/// AbnormalityManager를 통해 대상에게 이상 상태를 적용합니다.
|
||||
/// </summary>
|
||||
[CreateAssetMenu(fileName = "AbnormalityEffect", menuName = "Colosseum/Skills/Effects/Abnormality")]
|
||||
public class AbnormalityEffect : SkillEffect
|
||||
{
|
||||
[Header("Abnormality")]
|
||||
[Tooltip("적용할 이상 상태 데이터")]
|
||||
[SerializeField] private AbnormalityData abnormalityData;
|
||||
|
||||
protected override void ApplyEffect(GameObject caster, GameObject target)
|
||||
{
|
||||
if (target == null) return;
|
||||
|
||||
if (abnormalityData == null)
|
||||
{
|
||||
Debug.LogWarning($"[AbnormalityEffect] AbnormalityData is not assigned");
|
||||
return;
|
||||
}
|
||||
|
||||
var abnormalityManager = target.GetComponent<AbnormalityManager>();
|
||||
if (abnormalityManager == null)
|
||||
{
|
||||
Debug.LogWarning($"[AbnormalityEffect] Target {target.name} has no AbnormalityManager");
|
||||
return;
|
||||
}
|
||||
|
||||
abnormalityManager.ApplyAbnormality(abnormalityData, caster);
|
||||
Debug.Log($"[AbnormalityEffect] Applied {abnormalityData.abnormalityName} to {target.name} from {caster?.name ?? "unknown"}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 이상 상태 데이터 설정 (런타임용)
|
||||
/// </summary>
|
||||
public void SetAbnormalityData(AbnormalityData data)
|
||||
{
|
||||
abnormalityData = data;
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/Skills/Effects/AbnormalityEffect.cs.meta
Normal file
2
Assets/Scripts/Skills/Effects/AbnormalityEffect.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bf750718c64c4bd48af905d2927351de
|
||||
@@ -1,32 +0,0 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace Colosseum.Skills.Effects
|
||||
{
|
||||
/// <summary>
|
||||
/// 버프/디버프 효과
|
||||
/// </summary>
|
||||
[CreateAssetMenu(fileName = "BuffEffect", menuName = "Colosseum/Skills/Effects/Buff")]
|
||||
public class BuffEffect : SkillEffect
|
||||
{
|
||||
[Header("Buff Settings")]
|
||||
[SerializeField] private string buffName = "Buff";
|
||||
[Min(0f)] [SerializeField] private float duration = 5f;
|
||||
|
||||
[Header("Stat Modifiers")]
|
||||
[Range(0f, 10f)] [SerializeField] private float moveSpeedMultiplier = 1f;
|
||||
[Range(0f, 10f)] [SerializeField] private float attackPowerMultiplier = 1f;
|
||||
[Range(0f, 10f)] [SerializeField] private float defenseMultiplier = 1f;
|
||||
|
||||
protected override void ApplyEffect(GameObject caster, GameObject target)
|
||||
{
|
||||
if (target == null) return;
|
||||
|
||||
// TODO: 실제 버프 시스템 연동
|
||||
// var buffSystem = target.GetComponent<BuffSystem>();
|
||||
// buffSystem?.ApplyBuff(new BuffData(buffName, duration, moveSpeedMultiplier, attackPowerMultiplier, defenseMultiplier));
|
||||
|
||||
Debug.Log($"[Buff] {buffName} on {target.name} for {duration}s " +
|
||||
$"(Speed: {moveSpeedMultiplier}x, ATK: {attackPowerMultiplier}x, DEF: {defenseMultiplier}x)");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 32bab3b586da0d7469f63e03f18ee29f
|
||||
8
Assets/Scripts/StatusEffects.meta
Normal file
8
Assets/Scripts/StatusEffects.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 148d81d9974baed45b212857d96aed37
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
279
Assets/Scripts/UI/AbnormalityListUI.cs
Normal file
279
Assets/Scripts/UI/AbnormalityListUI.cs
Normal file
@@ -0,0 +1,279 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using Colosseum.Abnormalities;
|
||||
|
||||
namespace Colosseum.UI
|
||||
{
|
||||
/// <summary>
|
||||
/// 이상 상태 목록 UI 관리자
|
||||
/// 버프/디버프 목록을 표시하고 관리합니다.
|
||||
/// </summary>
|
||||
public class AbnormalityListUI : MonoBehaviour
|
||||
{
|
||||
[Header("Containers")]
|
||||
[Tooltip("버프 컨테이너")]
|
||||
[SerializeField] private Transform buffContainer;
|
||||
|
||||
[Tooltip("디버프 컨테이너")]
|
||||
[SerializeField] private Transform debuffContainer;
|
||||
|
||||
[Header("Prefab")]
|
||||
[Tooltip("이상 상태 슬롯 프리팹")]
|
||||
[SerializeField] private AbnormalitySlotUI slotPrefab;
|
||||
|
||||
[Header("Settings")]
|
||||
[Tooltip("최대 표시 개수")]
|
||||
[SerializeField] private int maxSlots = 10;
|
||||
|
||||
[Tooltip("자동으로 플레이어 추적")]
|
||||
[SerializeField] private bool autoFindPlayer = true;
|
||||
|
||||
// 추적 중인 AbnormalityManager
|
||||
private AbnormalityManager targetManager;
|
||||
|
||||
// 생성된 슬롯 풀
|
||||
private readonly List<AbnormalitySlotUI> slotPool = new List<AbnormalitySlotUI>();
|
||||
|
||||
// 현재 활성화된 슬롯 목록
|
||||
private readonly List<AbnormalitySlotUI> activeSlots = new List<AbnormalitySlotUI>();
|
||||
|
||||
// 이전 프레임의 효과 수 (변경 감지용)
|
||||
private int lastAbnormalityCount = -1;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
if (autoFindPlayer)
|
||||
{
|
||||
// 로컬 플레이어 찾기
|
||||
FindLocalPlayer();
|
||||
}
|
||||
|
||||
// 슬롯 풀 초기화
|
||||
InitializeSlotPool();
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
// 이벤트 구독 해제
|
||||
if (targetManager != null)
|
||||
{
|
||||
targetManager.OnAbnormalityAdded -= OnAbnormalityAdded;
|
||||
targetManager.OnAbnormalityRemoved -= OnAbnormalityRemoved;
|
||||
targetManager.OnAbnormalitiesChanged -= OnAbnormalitiesChanged;
|
||||
}
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
// 주기적으로 UI 갱신 (성능 최적화를 위해 매 프레임이 아닌 일정 간격으로)
|
||||
if (Time.frameCount % 10 == 0) // 10프레임마다 한 번
|
||||
{
|
||||
RefreshUI();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 로컬 플레이어 찾기
|
||||
/// </summary>
|
||||
private void FindLocalPlayer()
|
||||
{
|
||||
var playerObjects = FindObjectsByType<AbnormalityManager>(FindObjectsSortMode.None);
|
||||
|
||||
foreach (var manager in playerObjects)
|
||||
{
|
||||
// 네트워크 오브젝트인 경우 로컬 플레이어 확인
|
||||
if (manager.TryGetComponent<Unity.Netcode.NetworkObject>(out var netObj) && netObj.IsOwner)
|
||||
{
|
||||
SetTarget(manager);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// 네트워크 오브젝트가 없거나 로컬 플레이어를 찾지 못한 경우
|
||||
// 첫 번째 플레이어 사용 (싱글플레이어용)
|
||||
if (playerObjects.Length > 0)
|
||||
{
|
||||
SetTarget(playerObjects[0]);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 추적 대상 설정
|
||||
/// </summary>
|
||||
/// <param name="manager">추적할 AbnormalityManager</param>
|
||||
public void SetTarget(AbnormalityManager manager)
|
||||
{
|
||||
// 기존 구독 해제
|
||||
if (targetManager != null)
|
||||
{
|
||||
targetManager.OnAbnormalityAdded -= OnAbnormalityAdded;
|
||||
targetManager.OnAbnormalityRemoved -= OnAbnormalityRemoved;
|
||||
targetManager.OnAbnormalitiesChanged -= OnAbnormalitiesChanged;
|
||||
}
|
||||
|
||||
targetManager = manager;
|
||||
|
||||
// 새로운 대상 구독
|
||||
if (targetManager != null)
|
||||
{
|
||||
targetManager.OnAbnormalityAdded += OnAbnormalityAdded;
|
||||
targetManager.OnAbnormalityRemoved += OnAbnormalityRemoved;
|
||||
targetManager.OnAbnormalitiesChanged += OnAbnormalitiesChanged;
|
||||
}
|
||||
|
||||
// 즉시 UI 갱신
|
||||
ForceRefreshUI();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 슬롯 풀 초기화
|
||||
/// </summary>
|
||||
private void InitializeSlotPool()
|
||||
{
|
||||
if (slotPrefab == null)
|
||||
{
|
||||
Debug.LogWarning("[AbnormalityListUI] Slot prefab is not assigned");
|
||||
return;
|
||||
}
|
||||
|
||||
// 필요한 만큼 슬롯 미리 생성
|
||||
for (int i = 0; i < maxSlots; i++)
|
||||
{
|
||||
var slot = CreateSlot();
|
||||
slot.gameObject.SetActive(false);
|
||||
slotPool.Add(slot);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 새 슬롯 생성
|
||||
/// </summary>
|
||||
private AbnormalitySlotUI CreateSlot()
|
||||
{
|
||||
var go = Instantiate(slotPrefab.gameObject, transform);
|
||||
return go.GetComponent<AbnormalitySlotUI>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 슬롯 가져오기 (풀에서 또는 새로 생성)
|
||||
/// </summary>
|
||||
private AbnormalitySlotUI GetSlot()
|
||||
{
|
||||
// 풀에서 비활성화된 슬롯 찾기
|
||||
foreach (var slot in slotPool)
|
||||
{
|
||||
if (!slot.gameObject.activeSelf)
|
||||
{
|
||||
return slot;
|
||||
}
|
||||
}
|
||||
|
||||
// 풀에 없으면 새로 생성
|
||||
if (slotPool.Count < maxSlots)
|
||||
{
|
||||
var newSlot = CreateSlot();
|
||||
slotPool.Add(newSlot);
|
||||
return newSlot;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 슬롯 반환 (비활성화)
|
||||
/// </summary>
|
||||
private void ReturnSlot(AbnormalitySlotUI slot)
|
||||
{
|
||||
slot.gameObject.SetActive(false);
|
||||
activeSlots.Remove(slot);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 이상 상태 추가 시 호출
|
||||
/// </summary>
|
||||
private void OnAbnormalityAdded(ActiveAbnormality abnormality)
|
||||
{
|
||||
ForceRefreshUI();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 이상 상태 제거 시 호출
|
||||
/// </summary>
|
||||
private void OnAbnormalityRemoved(ActiveAbnormality abnormality)
|
||||
{
|
||||
ForceRefreshUI();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 이상 상태 변경 시 호출
|
||||
/// </summary>
|
||||
private void OnAbnormalitiesChanged()
|
||||
{
|
||||
ForceRefreshUI();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// UI 강제 갱신
|
||||
/// </summary>
|
||||
public void ForceRefreshUI()
|
||||
{
|
||||
if (targetManager == null) return;
|
||||
|
||||
// 모든 슬롯 반환
|
||||
foreach (var slot in activeSlots.ToArray())
|
||||
{
|
||||
ReturnSlot(slot);
|
||||
}
|
||||
|
||||
activeSlots.Clear();
|
||||
|
||||
// 활성화된 이상 상태 표시
|
||||
var abnormalities = targetManager.ActiveAbnormalities;
|
||||
foreach (var abnormality in abnormalities)
|
||||
{
|
||||
var slot = GetSlot();
|
||||
if (slot == null) continue;
|
||||
|
||||
// 버프/디버프에 따라 적절한 컨테이너에 배치
|
||||
Transform container = abnormality.Data.isDebuff ? debuffContainer : buffContainer;
|
||||
if (container == null) container = transform;
|
||||
|
||||
slot.transform.SetParent(container, false);
|
||||
slot.Initialize(abnormality);
|
||||
slot.gameObject.SetActive(true);
|
||||
activeSlots.Add(slot);
|
||||
}
|
||||
|
||||
lastAbnormalityCount = abnormalities.Count;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// UI 주기적 갱신 (변경 감지 시에만)
|
||||
/// </summary>
|
||||
private void RefreshUI()
|
||||
{
|
||||
if (targetManager == null) return;
|
||||
|
||||
int currentCount = targetManager.ActiveAbnormalities.Count;
|
||||
|
||||
// 이상 상태 수가 변경되었으면 갱신
|
||||
if (currentCount != lastAbnormalityCount)
|
||||
{
|
||||
ForceRefreshUI();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 모든 슬롯 숨기기
|
||||
/// </summary>
|
||||
public void HideAll()
|
||||
{
|
||||
foreach (var slot in activeSlots.ToArray())
|
||||
{
|
||||
ReturnSlot(slot);
|
||||
}
|
||||
|
||||
activeSlots.Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/UI/AbnormalityListUI.cs.meta
Normal file
2
Assets/Scripts/UI/AbnormalityListUI.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 15447f4a4d271354fb52bbdf1a526c6e
|
||||
182
Assets/Scripts/UI/AbnormalitySlotUI.cs
Normal file
182
Assets/Scripts/UI/AbnormalitySlotUI.cs
Normal file
@@ -0,0 +1,182 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using TMPro;
|
||||
using Colosseum.Abnormalities;
|
||||
|
||||
namespace Colosseum.UI
|
||||
{
|
||||
/// <summary>
|
||||
/// 개별 이상 상태 UI 슬롯
|
||||
/// 버프/디버프 아이콘, 지속 시간 등을 표시합니다.
|
||||
/// </summary>
|
||||
public class AbnormalitySlotUI : MonoBehaviour
|
||||
{
|
||||
[Header("UI References")]
|
||||
[Tooltip("이상 상태 아이콘")]
|
||||
[SerializeField] private Image iconImage;
|
||||
|
||||
[Tooltip("지속 시간 채우기 이미지 (시계 방향)")]
|
||||
[SerializeField] private Image durationFill;
|
||||
|
||||
[Tooltip("남은 시간 텍스트")]
|
||||
[SerializeField] private TMP_Text durationText;
|
||||
|
||||
[Tooltip("효과 이름 텍스트")]
|
||||
[SerializeField] private TMP_Text effectNameText;
|
||||
|
||||
[Tooltip("배경 이미지 (버프/디버프 구분용)")]
|
||||
[SerializeField] private Image backgroundImage;
|
||||
|
||||
[Header("Colors")]
|
||||
[Tooltip("버프 배경 색상")]
|
||||
[SerializeField] private Color buffColor = new Color(0.2f, 0.6f, 0.2f, 0.8f);
|
||||
|
||||
[Tooltip("디버프 배경 색상")]
|
||||
[SerializeField] private Color debuffColor = new Color(0.6f, 0.2f, 0.2f, 0.8f);
|
||||
|
||||
private ActiveAbnormality trackedAbnormality;
|
||||
|
||||
/// <summary>
|
||||
/// 추적 중인 활성 이상 상태
|
||||
/// </summary>
|
||||
public ActiveAbnormality TrackedAbnormality => trackedAbnormality;
|
||||
|
||||
/// <summary>
|
||||
/// UI 초기화
|
||||
/// </summary>
|
||||
/// <param name="abnormality">표시할 활성 이상 상태</param>
|
||||
public void Initialize(ActiveAbnormality abnormality)
|
||||
{
|
||||
trackedAbnormality = abnormality;
|
||||
|
||||
if (abnormality?.Data == null)
|
||||
{
|
||||
Debug.LogWarning("[AbnormalitySlotUI] Initialize called with null abnormality or data");
|
||||
return;
|
||||
}
|
||||
|
||||
// 아이콘 설정
|
||||
if (iconImage != null)
|
||||
{
|
||||
iconImage.sprite = abnormality.Data.icon;
|
||||
iconImage.enabled = abnormality.Data.icon != null;
|
||||
}
|
||||
|
||||
// 이름 설정
|
||||
if (effectNameText != null)
|
||||
{
|
||||
effectNameText.text = abnormality.Data.abnormalityName;
|
||||
}
|
||||
|
||||
// 배경 색상 설정 (버프/디버프 구분)
|
||||
if (backgroundImage != null)
|
||||
{
|
||||
backgroundImage.color = abnormality.Data.isDebuff ? debuffColor : buffColor;
|
||||
}
|
||||
|
||||
// 초기 상태 업데이트
|
||||
UpdateDisplay(abnormality.RemainingDuration, abnormality.Data.duration);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 화면 표시 업데이트
|
||||
/// </summary>
|
||||
/// <param name="remainingDuration">남은 시간</param>
|
||||
/// <param name="totalDuration">전체 시간</param>
|
||||
public void UpdateDisplay(float remainingDuration, float totalDuration)
|
||||
{
|
||||
// 지속 시간 채우기 업데이트
|
||||
if (durationFill != null)
|
||||
{
|
||||
if (totalDuration > 0f)
|
||||
{
|
||||
float fillAmount = Mathf.Clamp01(remainingDuration / totalDuration);
|
||||
durationFill.fillAmount = fillAmount;
|
||||
durationFill.enabled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 영구 효과
|
||||
durationFill.fillAmount = 1f;
|
||||
}
|
||||
}
|
||||
|
||||
// 남은 시간 텍스트 업데이트
|
||||
if (durationText != null)
|
||||
{
|
||||
if (totalDuration > 0f)
|
||||
{
|
||||
if (remainingDuration >= 60f)
|
||||
{
|
||||
durationText.text = $"{remainingDuration / 60f:F0}m";
|
||||
}
|
||||
else if (remainingDuration >= 1f)
|
||||
{
|
||||
durationText.text = $"{remainingDuration:F0}s";
|
||||
}
|
||||
else
|
||||
{
|
||||
durationText.text = $"{remainingDuration:F1}s";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 영구 효과
|
||||
durationText.text = "∞";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 프레임마다 호출하여 추적 중인 효과 업데이트
|
||||
/// </summary>
|
||||
private void Update()
|
||||
{
|
||||
if (trackedAbnormality == null)
|
||||
{
|
||||
gameObject.SetActive(false);
|
||||
return;
|
||||
}
|
||||
|
||||
UpdateDisplay(trackedAbnormality.RemainingDuration, trackedAbnormality.Data.duration);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 툴팁 표시용 정보 반환
|
||||
/// </summary>
|
||||
public string GetTooltipText()
|
||||
{
|
||||
if (trackedAbnormality?.Data == null) return string.Empty;
|
||||
|
||||
var data = trackedAbnormality.Data;
|
||||
string tooltip = $"<b>{data.abnormalityName}</b>\n";
|
||||
|
||||
if (!data.IsPermanent)
|
||||
{
|
||||
tooltip += $"지속 시간: {trackedAbnormality.RemainingDuration:F1}초\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
tooltip += "영구 효과\n";
|
||||
}
|
||||
|
||||
if (data.HasPeriodicEffect)
|
||||
{
|
||||
tooltip += $"주기적 효과: {data.periodicValue:+0}/ {data.periodicInterval}초\n";
|
||||
}
|
||||
|
||||
if (data.HasControlEffect)
|
||||
{
|
||||
tooltip += $"제어 효과: {data.controlType}\n";
|
||||
}
|
||||
|
||||
foreach (var mod in data.statModifiers)
|
||||
{
|
||||
string sign = mod.value >= 0 ? "+" : "";
|
||||
tooltip += $"{mod.statType}: {sign}{mod.value}\n";
|
||||
}
|
||||
|
||||
return tooltip;
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/UI/AbnormalitySlotUI.cs.meta
Normal file
2
Assets/Scripts/UI/AbnormalitySlotUI.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 287a45a81e69cbf48845f88759cf7eb4
|
||||
116
Assets/Scripts/UI/AbnormalitySystemTest.cs
Normal file
116
Assets/Scripts/UI/AbnormalitySystemTest.cs
Normal file
@@ -0,0 +1,116 @@
|
||||
using UnityEngine;
|
||||
using Colosseum.Abnormalities;
|
||||
|
||||
namespace Colosseum.UI
|
||||
{
|
||||
/// <summary>
|
||||
/// 이상 상태 시스템 테스트 스크립트
|
||||
/// Q 키: 버프 적용, E 키: 디버프 적용
|
||||
/// 로그를 통해 OnEffect 이벤트 호출 및 이상 상태 적용 과정을 추적합니다.
|
||||
/// </summary>
|
||||
public class AbnormalitySystemTest : MonoBehaviour
|
||||
{
|
||||
private AbnormalityManager abnormalityManager;
|
||||
private AbnormalityData testBuff;
|
||||
private AbnormalityData testDebuff;
|
||||
|
||||
private float testTimer;
|
||||
|
||||
void Start()
|
||||
{
|
||||
// 플레이어에서 AbnormalityManager 찾기
|
||||
abnormalityManager = GetComponent<AbnormalityManager>();
|
||||
if (abnormalityManager == null)
|
||||
{
|
||||
Debug.LogError("[AbnormalitySystemTest] AbnormalityManager not found on player!");
|
||||
return;
|
||||
}
|
||||
|
||||
// 테스트용 이상 상태 데이터 생성 (에셋 생성)
|
||||
testBuff = ScriptableObject.CreateInstance<AbnormalityData>();
|
||||
testBuff.abnormalityName = "Test Buff";
|
||||
testBuff.duration = 5f;
|
||||
testBuff.isDebuff = false;
|
||||
|
||||
testDebuff = ScriptableObject.CreateInstance<AbnormalityData>();
|
||||
testDebuff.abnormalityName = "Test Debuff";
|
||||
testDebuff.duration = 5f;
|
||||
testDebuff.isDebuff = true;
|
||||
|
||||
// 이벤트 구독
|
||||
abnormalityManager.OnAbnormalityAdded += OnAbnormalityAdded;
|
||||
abnormalityManager.OnAbnormalityRemoved += OnAbnormalityRemoved;
|
||||
|
||||
Debug.Log("=== Abnormality System Test Started ===");
|
||||
Debug.Log("Press Q to apply buff, Press E to apply debuff");
|
||||
Debug.Log($"Initial Active Abnormalities Count: {abnormalityManager.ActiveAbnormalities.Count}");
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
testTimer += Time.deltaTime;
|
||||
|
||||
// Q 키로 버프 적용 (3초마다 1회만)
|
||||
if (Input.GetKeyDown(KeyCode.Q) && testTimer >= 3f)
|
||||
{
|
||||
testTimer = 0f;
|
||||
ApplyTestBuff();
|
||||
}
|
||||
|
||||
// E 키로 디버프 적용 (3초마다 1회만)
|
||||
if (Input.GetKeyDown(KeyCode.E) && testTimer >= 3f)
|
||||
{
|
||||
testTimer = 0f;
|
||||
ApplyTestDebuff();
|
||||
}
|
||||
}
|
||||
|
||||
private void ApplyTestBuff()
|
||||
{
|
||||
if (testBuff == null || abnormalityManager == null)
|
||||
{
|
||||
Debug.LogWarning("[AbnormalitySystemTest] Cannot apply buff - data or manager is null");
|
||||
return;
|
||||
}
|
||||
|
||||
Debug.Log($"[AbnormalitySystemTest] >>> Applying BUFF: {testBuff.abnormalityName} to {gameObject.name}");
|
||||
abnormalityManager.ApplyAbnormality(testBuff, gameObject);
|
||||
}
|
||||
|
||||
private void ApplyTestDebuff()
|
||||
{
|
||||
if (testDebuff == null || abnormalityManager == null)
|
||||
{
|
||||
Debug.LogWarning("[AbnormalitySystemTest] Cannot apply debuff - data or manager is null");
|
||||
return;
|
||||
}
|
||||
|
||||
Debug.Log($"[AbnormalitySystemTest] >>> Applying DEBUFF: {testDebuff.abnormalityName} to {gameObject.name}");
|
||||
abnormalityManager.ApplyAbnormality(testDebuff, gameObject);
|
||||
}
|
||||
|
||||
private void OnAbnormalityAdded(ActiveAbnormality abnormality)
|
||||
{
|
||||
Debug.Log($"[AbnormalitySystemTest] <<< ABNORMALITY ADDED: {abnormality.Data.abnormalityName} | isDebuff: {abnormality.Data.isDebuff} | Duration: {abnormality.Data.duration}s | Remaining: {abnormality.RemainingDuration:F1}s");
|
||||
}
|
||||
|
||||
private void OnAbnormalityRemoved(ActiveAbnormality abnormality)
|
||||
{
|
||||
Debug.Log($"[AbnormalitySystemTest] <<< ABNORMALITY REMOVED: {abnormality.Data.abnormalityName}");
|
||||
}
|
||||
|
||||
void OnDestroy()
|
||||
{
|
||||
// 이벤트 구독 해제
|
||||
if (abnormalityManager != null)
|
||||
{
|
||||
abnormalityManager.OnAbnormalityAdded -= OnAbnormalityAdded;
|
||||
abnormalityManager.OnAbnormalityRemoved -= OnAbnormalityRemoved;
|
||||
}
|
||||
|
||||
// 정리
|
||||
if (testBuff != null) Destroy(testBuff);
|
||||
if (testDebuff != null) Destroy(testDebuff);
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/UI/AbnormalitySystemTest.cs.meta
Normal file
2
Assets/Scripts/UI/AbnormalitySystemTest.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a1b2c3d4e5f6a7b8c9a0d1e5e3
|
||||
26
Assets/Skills/Effects/Melee_Slash_1.asset
Normal file
26
Assets/Skills/Effects/Melee_Slash_1.asset
Normal file
@@ -0,0 +1,26 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: bf750718c64c4bd48af905d2927351de, type: 3}
|
||||
m_Name: Melee_Slash_1
|
||||
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.Effects.AbnormalityEffect
|
||||
targetType: 0
|
||||
targetTeam: 0
|
||||
areaCenter: 0
|
||||
areaShape: 0
|
||||
targetLayers:
|
||||
serializedVersion: 2
|
||||
m_Bits: 0
|
||||
areaRadius: 3
|
||||
fanOriginDistance: 0
|
||||
fanRadius: 3
|
||||
fanHalfAngle: 45
|
||||
abnormalityData: {fileID: 11400000, guid: da5a38e4e2c383940a34d9d8080fbbe0, type: 2}
|
||||
8
Assets/Skills/Effects/Melee_Slash_1.asset.meta
Normal file
8
Assets/Skills/Effects/Melee_Slash_1.asset.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 75bac55a016a0da46899806f58b76ce3
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
26
Assets/Skills/Effects/Melee_Slash_2.asset
Normal file
26
Assets/Skills/Effects/Melee_Slash_2.asset
Normal file
@@ -0,0 +1,26 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: bf750718c64c4bd48af905d2927351de, type: 3}
|
||||
m_Name: Melee_Slash_2
|
||||
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.Effects.AbnormalityEffect
|
||||
targetType: 0
|
||||
targetTeam: 0
|
||||
areaCenter: 0
|
||||
areaShape: 0
|
||||
targetLayers:
|
||||
serializedVersion: 2
|
||||
m_Bits: 0
|
||||
areaRadius: 3
|
||||
fanOriginDistance: 0
|
||||
fanRadius: 3
|
||||
fanHalfAngle: 45
|
||||
abnormalityData: {fileID: 11400000, guid: c4abb0f89779f294ab99562e085e8f3b, type: 2}
|
||||
8
Assets/Skills/Effects/Melee_Slash_2.asset.meta
Normal file
8
Assets/Skills/Effects/Melee_Slash_2.asset.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0e496b26a1dbf40488ce54cb4fe9c27b
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user