Compare commits

..

11 Commits

Author SHA1 Message Date
7016b3c575 [Docs] AGENTS.md 추가
프로젝트 가이드라인 및 코딩 컨벤션 문서

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-11 02:58:50 +09:00
7c15b56201 [Scene] 테스트 씬 및 프리팹 업데이트
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-11 02:58:38 +09:00
f7bef8f504 [Config] 프로젝트 설정 업데이트
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-11 02:58:30 +09:00
05816f2b8e [Assets] TextMesh Pro 폰트 에셋 데이터 정리
불필요한 폰트 캐시 데이터 정리로 용량 최적화

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-11 02:58:21 +09:00
a1f0f28964 [Config] 퀄리티 설정 단순화
- 모바일 퀄리티 레벨 삭제, PC만 유지

- 플랫폼 기본 퀄리티 매핑 제거

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-11 02:58:12 +09:00
ac5bfc548b [Skills] 근접 스킬에 이상상태 효과 추가
Melee_Slash 스킬에 이상상태 효과 2개 연결

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-11 02:58:03 +09:00
fd0ba9e9fd [Abnormality] 테스트 이상상태 이름 중복 수정
- abnormalityName: Abnormality -> Test Buff/Test Debuff로 변경

- duration: 99 -> 10으로 변경

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-11 02:57:46 +09:00
3d3591784f [UI] 이상 상태 슬롯 UI 개선
- 지속 시간 표시가 주기적으로 업데이트되도록 수정
- fill 이미지가 시간이 지날수록 채워지도록 변경
- 남은 시간 정수로만 표시
- 비활성화된 Cooltime 요소 자동 활성화
- Animator Controller 제거로 UI 정상 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 02:40:44 +09:00
ec99e302ed [Abnormality] 이상 상태 시스템 구현
- 이상 상태 데이터 (버프/디버프) ScriptableObject 정의
- 런타임임 활성 이상 상태 관리 (ActiveAbnormality)
- 캐릭터터별 AbnormalityManager 컴포넌트로 이상 상태 적용/제거
- 스킬 효과(AbnormalityEffect)로 스킬에 이상 상태 연동
- UI 슬롯 및 목록 표시 구현 (버프/디버프 구분)
- 테스트 코드 및 씬 설정 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 01:35:02 +09:00
8add066c3c [UI] 스킬 퀵슬롯 UI 구현
- SkillSlotUI: 개별 슬롯 (아이콘, 쿨다운 오버레이, 텍스트)
- SkillQuickSlotUI: 6개 슬롯 관리 및 PlayerSkillInput 연동
- Animator 제어 문제 해결: 수동 SetActive로 쿨다운 표시
- UI_Bar에 PlayerHUD, StatBar 컴포넌트 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 20:58:28 +09:00
2ac491683f HP, MP, Skill HUD 변경
및 스킬 애니메이션 초기화 로직 강화
2026-03-10 17:29:33 +09:00
57 changed files with 9695 additions and 2110 deletions

View File

@@ -5,7 +5,14 @@
"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\")",
"Bash(find /d/Colosseum -name \"*.controller\" 2>/dev/null | head -20)"
]
}
}

329
AGENTS.md Normal file
View File

@@ -0,0 +1,329 @@
# Colosseum - Unity Game Project
## Project Overview
Multiplayer arena game built with **Unity 6000.3.10f1** and **Unity Netcode for GameObjects**.
- **Language**: C# 9.0
- **Target Framework**: .NET Standard 2.1
- **Root Namespace**: `Colosseum`
- **Assembly Definition**: `Colosseum.Game` (Assets/Scripts/Colosseum.Game.asmdef)
## Game Design Documentation
Design docs are maintained in Obsidian Vault: `C:\Users\dal4s\OneDrive\문서\Obsidian Vault\Colosseum`
### Game Concept
- **Genre**: Online multiplayer co-op action RPG (3rd person)
- **Theme**: Gladiator survival boss raid in Colosseum
- **Roles**: Multi-role system - players can hybridize (e.g., Tank 0.5 + DPS 0.5) instead of fixed Tank/DPS/Healer
### Stats System
| Stat | Abbr | Description | Derived Formula |
|------|------|-------------|-----------------|
| Strength | STR | Weapon damage | Physical Damage = STR × 2 |
| Dexterity | DEX | Ranged aim/damage, melee speed | Ranged Damage = DEX × 2 |
| Intelligence | INT | Magic damage | Magic Damage = INT × 2 |
| Vitality | VIT | Max health | Max HP = VIT × 10 |
| Wisdom | WIS | Healing power | Heal Power = WIS × 1.5 |
| Spirit | SPI | Max mana | Max MP = SPI × 5 |
### Damage Calculation
```
Final Damage = baseDamage + (statDamage × statScaling)
```
| DamageType | Base Stat | Description |
|------------|-----------|-------------|
| Physical | STR | Melee weapon damage |
| Magical | INT | Spell damage |
| Ranged | DEX | Bow/ranged damage |
| True | None | Fixed damage, no stat scaling |
### Stat Modifier System
Modifiers are applied in order:
1. **Flat**: Add fixed value
2. **PercentAdd**: Sum percentages, then multiply
3. **PercentMult**: Multiply individually
```
Final = (Base + FlatSum) × (1 + PercentAddSum) × PercentMult1 × PercentMult2...
```
### Skill System
- **Active Skills**: 6 slots (L-click, R-click, 1, 2, 3, 4)
- **Passive Skills**: Tree-based progression from center
- **Effects**: Triggered via animation events (`OnEffect(index)`)
- **Animation**: Start clip + optional end clip
## Build/Run Commands
This is a Unity project. Use Unity Editor for building and testing.
```bash
# Open in Unity Editor (requires Unity Hub)
# Build via: File > Build Settings > Build
# Run tests in Unity Editor
# Window > General > Test Runner > EditMode / PlayMode
```
### Build from Command Line (Windows)
```bash
# Build Windows standalone (adjust paths as needed)
"C:\Program Files\Unity\Hub\Editor\6000.3.10f1\Editor\Unity.exe" -batchmode -projectPath . -buildWindows64Player ./Builds/Windows/Colosseum.exe -quit
```
## Project Structure
```
Assets/
Scripts/
Abnormalities/ # Buff/debuff system
Editor/ # Unity editor extensions
Network/ # Network management
Player/ # Player controllers
Skills/ # Skill system
Effects/ # Skill effects (damage, heal, etc.)
Stats/ # Character statistics
UI/ # User interface
```
## Code Style Guidelines
### Namespaces
Follow `Colosseum.{Subnamespace}` pattern:
```csharp
namespace Colosseum.Player { }
namespace Colosseum.Skills { }
namespace Colosseum.Skills.Effects { }
namespace Colosseum.Stats { }
namespace Colosseum.Network { }
namespace Colosseum.Abnormalities { }
```
### Using Statements Order
Organize imports in this order, separated by blank lines:
1. System namespaces
2. UnityEngine namespaces
3. Unity.Netcode / Unity packages
4. Colosseum namespaces
```csharp
using System;
using System.Collections.Generic;
using UnityEngine;
using Unity.Netcode;
using Colosseum.Stats;
using Colosseum.Player;
```
### Naming Conventions
| Element | Convention | Example |
|---------|------------|---------|
| Classes | PascalCase | `PlayerNetworkController` |
| Interfaces | IPascalCase | `IDamageable` |
| Methods | PascalCase | `TakeDamageRpc()` |
| Public Properties | PascalCase | `MaxHealth`, `IsStunned` |
| Private Fields | camelCase | `currentHealth`, `characterStats` |
| Constants | PascalCase or SCREAMING_SNAKE | `SKILL_STATE_NAME`, `MaxValue` |
| Enum values | PascalCase | `DamageType.Physical` |
### Serialization & Inspector
Use `[SerializeField]` with `[Header]` and `[Tooltip]` for organization:
```csharp
[Header("References")]
[Tooltip("CharacterStats component (auto-searched if null)")]
[SerializeField] private CharacterStats characterStats;
[Header("Settings")]
[Min(0f)] [SerializeField] private float baseDamage = 10f;
[SerializeField] private DamageType damageType = DamageType.Physical;
```
### Documentation
Use XML documentation comments in **Korean**:
```csharp
/// <summary>
/// 플레이어 네트워크 상태 관리 (HP, MP 등)
/// </summary>
public class PlayerNetworkController : NetworkBehaviour
{
/// <summary>
/// 대미지 적용 (서버에서만 실행)
/// </summary>
[Rpc(SendTo.Server)]
public void TakeDamageRpc(float damage)
{
// ...
}
}
```
### Network Code Patterns
Use Unity Netcode patterns:
```csharp
// Network variables for synchronized state
private NetworkVariable<float> currentHealth = new NetworkVariable<float>(100f);
// Server RPCs for client-to-server calls
[Rpc(SendTo.Server)]
public void TakeDamageRpc(float damage)
{
currentHealth.Value = Mathf.Max(0f, currentHealth.Value - damage);
}
// Check authority before modifying
if (IsServer)
{
currentHealth.Value = MaxHealth;
}
```
### Expression Body Members
Use for simple properties and methods:
```csharp
public float MaxHealth => vitality.FinalValue * 10f;
public bool IsStunned => stunCount > 0;
public bool CanAct => !IsStunned;
```
### Switch Expressions
Prefer switch expressions for concise mapping:
```csharp
public CharacterStat GetStat(StatType statType)
{
return statType switch
{
StatType.Strength => strength,
StatType.Dexterity => dexterity,
StatType.Intelligence => intelligence,
_ => null,
};
}
```
### ScriptableObjects for Data
Use ScriptableObject for configuration data:
```csharp
[CreateAssetMenu(fileName = "NewSkill", menuName = "Colosseum/Skill")]
public class SkillData : ScriptableObject
{
[SerializeField] private string skillName;
[SerializeField] private List<SkillEffect> effects;
public string SkillName => skillName;
public IReadOnlyList<SkillEffect> Effects => effects;
}
```
### Error Handling
- Use `Debug.LogWarning()` for recoverable issues
- Use `Debug.LogError()` for critical failures
- Null-check parameters in public methods
```csharp
public void ApplyAbnormality(AbnormalityData data, GameObject source)
{
if (data == null)
{
Debug.LogWarning("[Abnormality] ApplyAbnormality called with null data");
return;
}
// ...
}
```
### Events
Use C# events with `Action<T>` or custom delegates:
```csharp
public event Action<ActiveAbnormality> OnAbnormalityAdded;
public event Action<ActiveAbnormality> OnAbnormalityRemoved;
public event Action OnAbnormalitiesChanged;
// Invoke with null-conditional
OnAbnormalityAdded?.Invoke(newAbnormality);
```
## Key Dependencies
| Package | Purpose |
|---------|---------|
| Unity.Netcode.Runtime | Multiplayer networking |
| Unity.InputSystem | New input system |
| Unity.TextMeshPro | Text rendering |
| Unity.Networking.Transport | Low-level networking |
## Common Patterns
### MonoBehaviour Components
```csharp
public class ExampleComponent : MonoBehaviour
{
[Header("References")]
[SerializeField] private Animator animator;
public Animator Animator => animator;
private void Awake()
{
if (animator == null)
animator = GetComponentInChildren<Animator>();
}
}
```
### NetworkBehaviour Components
```csharp
public class NetworkedComponent : NetworkBehaviour
{
private NetworkVariable<int> value = new NetworkVariable<int>();
public override void OnNetworkSpawn()
{
// Initialize networked state
}
public override void OnNetworkDespawn()
{
// Cleanup
}
}
```
## Notes
- All code comments and documentation should be in Korean
- Use `[Min()]` attribute for numeric minimums in Inspector
- Use `[TextArea]` for multi-line string fields
- Private fields should use `camelCase` (no `m_` or `_` prefix)
- Prefer `IReadOnlyList<T>` for exposing collections

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 72b7a9faa543d444882609fe047a2073
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View 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: Test Buff
icon: {fileID: 21300000, guid: 173f7bf0258285c4f8bf01825ac02a11, type: 3}
duration: 10
level: 1
isDebuff: 0
statModifiers: []
periodicInterval: 0
periodicValue: 0
controlType: 0
slowMultiplier: 0.5

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: da5a38e4e2c383940a34d9d8080fbbe0
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View 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: Test Debuff
icon: {fileID: 21300000, guid: 173f7bf0258285c4f8bf01825ac02a11, type: 3}
duration: 10
level: 1
isDebuff: 1
statModifiers: []
periodicInterval: 0
periodicValue: 0
controlType: 0
slowMultiplier: 0.5

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c4abb0f89779f294ab99562e085e8f3b
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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:

View File

@@ -55,13 +55,34 @@ ModelImporter:
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
curves: []
events:
- time: 0.49976447
- time: 0
functionName: OnEffect
data:
objectReferenceParameter: {instanceID: 0}
floatParameter: 0
intParameter: 0
messageOptions: 0
- time: 0.50297606
functionName: OnEffect
data:
objectReferenceParameter: {instanceID: 0}
floatParameter: 0
intParameter: 0
messageOptions: 0
- time: 0.5238095
functionName: OnEffect
data:
objectReferenceParameter: {instanceID: 0}
floatParameter: 0
intParameter: 1
messageOptions: 0
- time: 0.5429192
functionName: OnEffect
data:
objectReferenceParameter: {instanceID: 0}
floatParameter: 0
intParameter: 2
messageOptions: 0
- time: 0.9981159
functionName: OnSkillEnd
data:

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

View 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:

View File

@@ -0,0 +1,655 @@
%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: 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!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: 0}
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.46
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: 0
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: 1819597544659277106, guid: 76cc919941c27814fa50c37e4df08f89, type: 3}
propertyPath: m_Controller
value:
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:

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 60d898ecea82b6c429850e04d2e95b7c
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 553b74bdb60f6af47b5d2c8928a2af07
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 54087b4bd46db9e4fb7da13cf7a6cc69
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -20,6 +20,7 @@ GameObject:
- component: {fileID: 6048740021537676210}
- component: {fileID: 6912018896034183004}
- component: {fileID: 6585367215453362640}
- component: {fileID: 1242716222252539497}
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 &1242716222252539497
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: 7a766b6ab825c1445a3385079bb32cc5, type: 3}
m_Name:
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Abnormalities.AbnormalityManager
ShowTopMostFoldoutHeaderGroup: 1
characterStats: {fileID: 0}
networkController: {fileID: 0}
--- !u!1001 &7705728874586931617
PrefabInstance:
m_ObjectHideFlags: 0

View File

@@ -119,6 +119,41 @@ NavMeshSettings:
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1 &115810401
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 115810402}
m_Layer: 5
m_Name: QuickSlot
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &115810402
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 115810401}
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: 1162990049}
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: 0, y: -315}
m_SizeDelta: {x: 800, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &260528172
GameObject:
m_ObjectHideFlags: 0
@@ -214,6 +249,8 @@ RectTransform:
m_ConstrainProportionsScale: 0
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}
@@ -229,6 +266,18 @@ PrefabInstance:
serializedVersion: 3
m_TransformParent: {fileID: 1162990049}
m_Modifications:
- target: {fileID: 175175724983342716, guid: 99f359b6678b0064dbd20508482d6d64, type: 3}
propertyPath: m_AnchorMax.x
value: 0.7
objectReference: {fileID: 0}
- target: {fileID: 175175724983342716, guid: 99f359b6678b0064dbd20508482d6d64, type: 3}
propertyPath: m_AnchorMax.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 175175724983342716, guid: 99f359b6678b0064dbd20508482d6d64, type: 3}
propertyPath: m_AnchorMin.x
value: 0.7
objectReference: {fileID: 0}
- target: {fileID: 1384280946776679044, guid: 99f359b6678b0064dbd20508482d6d64, type: 3}
propertyPath: m_Pivot.x
value: 0.5
@@ -351,11 +400,11 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 5400690622487782688, guid: 99f359b6678b0064dbd20508482d6d64, type: 3}
propertyPath: m_AnchorMax.x
value: 0
value: 0.7
objectReference: {fileID: 0}
- target: {fileID: 5400690622487782688, guid: 99f359b6678b0064dbd20508482d6d64, type: 3}
propertyPath: m_AnchorMax.y
value: 0
value: 1
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
@@ -378,6 +427,415 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: b5c5d0fa667f83d4399abb45ffcaea31, type: 3}
m_Name:
m_EditorClassIdentifier: Colosseum.Game::Colosseum.UI.StatBar
--- !u!1001 &437791323
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 260528176}
m_Modifications:
- target: {fileID: 154243841272976527, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 154243841272976527, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 154243841272976527, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 154243841272976527, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 222507439395443271, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_Enabled
value: 0
objectReference: {fileID: 0}
- target: {fileID: 586372648083603388, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: debugMode
value: 1
objectReference: {fileID: 0}
- target: {fileID: 957626152331407387, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 957626152331407387, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 957626152331407387, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 957626152331407387, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1272571897642577178, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1272571897642577178, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1272571897642577178, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1272571897642577178, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1272571897642577178, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1272571897642577178, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1891729575772637703, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2357173840241603351, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_Enabled
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2383653489108562105, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2414817517628536287, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2414817517628536287, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2414817517628536287, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 2414817517628536287, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3299919758736932218, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3449630887236982659, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_Enabled
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3605634177138740298, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3605634177138740298, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3605634177138740298, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3605634177138740298, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3605634177138740298, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3605634177138740298, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3665211212153714218, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_Name
value: UI_Bar
objectReference: {fileID: 0}
- target: {fileID: 4422562543140382942, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4422562543140382942, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4422562543140382942, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4422562543140382942, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4422562543140382942, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4422562543140382942, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4759263938882641124, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4759263938882641124, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4759263938882641124, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4759263938882641124, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4759263938882641124, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4759263938882641124, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5020688963902780252, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5020688963902780252, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5020688963902780252, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5020688963902780252, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5292514280569519775, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5292514280569519775, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5292514280569519775, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5292514280569519775, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5324836091554642937, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5386836880661972576, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMax.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5386836880661972576, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5815230577690829753, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_Enabled
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6784599209343945149, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_Pivot.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_Pivot.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMax.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMin.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.x
value: 1000
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.y
value: 160
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.y
value: 40
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7290362850952805949, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7437893700502000836, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_Enabled
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7657599853370186409, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7775305708725639431, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_Enabled
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7895989214680908246, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMax.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7895989214680908246, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8225402012417639457, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8225402012417639457, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8225402012417639457, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8225402012417639457, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8468773744509512601, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8468773744509512601, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8468773744509512601, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8468773744509512601, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8468773744509512601, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8468773744509512601, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8744015103177123418, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8744015103177123418, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8744015103177123418, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8744015103177123418, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8744015103177123418, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8744015103177123418, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
--- !u!1001 &481770354
PrefabInstance:
m_ObjectHideFlags: 0
@@ -386,6 +844,18 @@ PrefabInstance:
serializedVersion: 3
m_TransformParent: {fileID: 1162990049}
m_Modifications:
- target: {fileID: 175175724983342716, guid: d8795051068c4f84e84c227a6618e587, type: 3}
propertyPath: m_AnchorMax.x
value: 0.7
objectReference: {fileID: 0}
- target: {fileID: 175175724983342716, guid: d8795051068c4f84e84c227a6618e587, type: 3}
propertyPath: m_AnchorMax.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 175175724983342716, guid: d8795051068c4f84e84c227a6618e587, type: 3}
propertyPath: m_AnchorMin.x
value: 0.7
objectReference: {fileID: 0}
- target: {fileID: 1384280946776679044, guid: d8795051068c4f84e84c227a6618e587, type: 3}
propertyPath: m_Pivot.x
value: 0.5
@@ -488,11 +958,11 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 5400690622487782688, guid: d8795051068c4f84e84c227a6618e587, type: 3}
propertyPath: m_AnchorMax.x
value: 0
value: 0.7
objectReference: {fileID: 0}
- target: {fileID: 5400690622487782688, guid: d8795051068c4f84e84c227a6618e587, type: 3}
propertyPath: m_AnchorMax.y
value: 0
value: 1
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects:
@@ -652,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
@@ -795,7 +1327,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!224 &1162990049
RectTransform:
m_ObjectHideFlags: 0
@@ -810,6 +1342,7 @@ RectTransform:
m_Children:
- {fileID: 281797460}
- {fileID: 481770355}
- {fileID: 115810402}
m_Father: {fileID: 260528176}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
@@ -858,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: 60d898ecea82b6c429850e04d2e95b7c, type: 3}
maxSlots: 10
autoFindPlayer: 1
--- !u!1 &1432187382
GameObject:
m_ObjectHideFlags: 0
@@ -1106,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
@@ -1243,6 +1920,11 @@ MonoBehaviour:
m_VarianceClampScale: 0.9
m_ContrastAdaptiveSharpening: 0
m_Version: 2
--- !u!224 &7078605117837265129 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 7078605118272955058, guid: 54087b4bd46db9e4fb7da13cf7a6cc69, type: 3}
m_PrefabInstance: {fileID: 437791323}
m_PrefabAsset: {fileID: 0}
--- !u!1660057539 &9223372036854775807
SceneRoots:
m_ObjectHideFlags: 0

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: bc6434195fb88a443939a5a0b2747f0a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View 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;
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: b08cc671f858a3b409170a5356e960a0

View 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);
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 7a766b6ab825c1445a3385079bb32cc5

View 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);
}
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: b90fb3ef8cb13be4383eb397857cfa2b

View 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;
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: bf750718c64c4bd48af905d2927351de

View File

@@ -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)");
}
}
}

View File

@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 32bab3b586da0d7469f63e03f18ee29f

View File

@@ -154,7 +154,8 @@ namespace Colosseum.Skills
overrideController[baseSkillClip] = clip;
animator.runtimeAnimatorController = overrideController;
// 같은 상태라도 처음부터 재생되도록 강제 리셋
// 애니메이터 완전 리셋 후 재생
animator.Rebind();
animator.Update(0f);
animator.Play(SKILL_STATE_NAME, 0, 0f);
}
@@ -174,7 +175,8 @@ namespace Colosseum.Skills
overrideController[baseSkillClip] = clip;
animator.runtimeAnimatorController = overrideController;
// 같은 상태라도 처음부터 재생되도록 강제 리셋
// 애니메이터 완전 리셋 후 재생
animator.Rebind();
animator.Update(0f);
animator.Play(SKILL_STATE_NAME, 0, 0f);
}

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 148d81d9974baed45b212857d96aed37
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,338 @@
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()
{
Debug.Log("[AbnormalityListUI] Start() called");
if (autoFindPlayer)
{
// 로컬 플레이어 찾기
FindLocalPlayer();
}
// 슬롯 풀 초기화
InitializeSlotPool();
Debug.Log($"[AbnormalityListUI] slotPrefab: {(slotPrefab != null ? slotPrefab.name : "NULL")}");
Debug.Log($"[AbnormalityListUI] buffContainer: {(buffContainer != null ? buffContainer.name : "NULL")}");
Debug.Log($"[AbnormalityListUI] debuffContainer: {(debuffContainer != null ? debuffContainer.name : "NULL")}");
}
private void OnDestroy()
{
// 이벤트 구독 해제
if (targetManager != null)
{
targetManager.OnAbnormalityAdded -= OnAbnormalityAdded;
targetManager.OnAbnormalityRemoved -= OnAbnormalityRemoved;
targetManager.OnAbnormalitiesChanged -= OnAbnormalitiesChanged;
}
}
private void Update()
{
// 타겟이 없으면 주기적으로 플레이어 찾기
if (targetManager == null && autoFindPlayer && Time.frameCount % 30 == 0)
{
FindLocalPlayer();
}
// 주기적으로 UI 갱신 (성능 최적화를 위해 매 프레임이 아닌 일정 간격으로)
if (Time.frameCount % 10 == 0) // 10프레임마다 한 번
{
RefreshUI();
}
}
/// <summary>
/// 로컬 플레이어 찾기
/// </summary>
private void FindLocalPlayer()
{
var playerObjects = FindObjectsByType<AbnormalityManager>(FindObjectsSortMode.None);
Debug.Log($"[AbnormalityListUI] Found {playerObjects.Length} AbnormalityManager(s)");
foreach (var manager in playerObjects)
{
// 네트워크 오브젝트인 경우 로컬 플레이어 확인
if (manager.TryGetComponent<Unity.Netcode.NetworkObject>(out var netObj))
{
Debug.Log($"[AbnormalityListUI] Checking {manager.gameObject.name}, IsOwner: {netObj.IsOwner}");
if (netObj.IsOwner)
{
Debug.Log($"[AbnormalityListUI] Setting target to local player: {manager.gameObject.name}");
SetTarget(manager);
return;
}
}
}
// 네트워크 오브젝트가 없거나 로컬 플레이어를 찾지 못한 경우
// 첫 번째 플레이어 사용 (싱글플레이어용)
if (playerObjects.Length > 0)
{
Debug.Log($"[AbnormalityListUI] No local player found, using first manager: {playerObjects[0].gameObject.name}");
SetTarget(playerObjects[0]);
}
else
{
Debug.LogWarning("[AbnormalityListUI] No AbnormalityManager found!");
}
}
/// <summary>
/// 추적 대상 설정
/// </summary>
/// <param name="manager">추적할 AbnormalityManager</param>
public void SetTarget(AbnormalityManager manager)
{
Debug.Log($"[AbnormalityListUI] SetTarget called with: {(manager != null ? manager.gameObject.name : "null")}");
// 기존 구독 해제
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;
Debug.Log("[AbnormalityListUI] Events subscribed successfully");
}
// 즉시 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)
{
Debug.Log($"[AbnormalityListUI] OnAbnormalityAdded event received: {abnormality.Data.abnormalityName}");
ForceRefreshUI();
}
/// <summary>
/// 이상 상태 제거 시 호출
/// </summary>
private void OnAbnormalityRemoved(ActiveAbnormality abnormality)
{
Debug.Log($"[AbnormalityListUI] OnAbnormalityRemoved event received: {abnormality.Data.abnormalityName}");
ForceRefreshUI();
}
/// <summary>
/// 이상 상태 변경 시 호출
/// </summary>
private void OnAbnormalitiesChanged()
{
Debug.Log("[AbnormalityListUI] OnAbnormalitiesChanged event received");
ForceRefreshUI();
}
/// <summary>
/// UI 강제 갱신
/// </summary>
public void ForceRefreshUI()
{
if (targetManager == null)
{
Debug.LogWarning("[AbnormalityListUI] ForceRefreshUI called but targetManager is null");
return;
}
// 모든 슬롯 반환
foreach (var slot in activeSlots.ToArray())
{
ReturnSlot(slot);
}
activeSlots.Clear();
// 활성화된 이상 상태 표시
var abnormalities = targetManager.ActiveAbnormalities;
Debug.Log($"[AbnormalityListUI] ForceRefreshUI: {abnormalities.Count} abnormalities found");
foreach (var abnormality in abnormalities)
{
var slot = GetSlot();
if (slot == null)
{
Debug.LogWarning("[AbnormalityListUI] Could not get slot from pool");
continue;
}
// 버프/디버프에 따라 적절한 컨테이너에 배치
Transform container = abnormality.Data.isDebuff ? debuffContainer : buffContainer;
if (container == null) container = transform;
Debug.Log($"[AbnormalityListUI] Adding slot for: {abnormality.Data.abnormalityName}, isDebuff: {abnormality.Data.isDebuff}, container: {container.name}");
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();
}
// 활성 슬롯들의 지속 시간 업데이트
UpdateSlotDurations();
}
/// <summary>
/// 모든 활성 슬롯의 지속 시간 업데이트
/// </summary>
private void UpdateSlotDurations()
{
foreach (var slot in activeSlots)
{
if (slot != null && slot.TrackedAbnormality != null)
{
var abnormality = slot.TrackedAbnormality;
slot.UpdateDisplay(abnormality.RemainingDuration, abnormality.Data.duration);
}
}
}
/// <summary>
/// 모든 슬롯 숨기기
/// </summary>
public void HideAll()
{
foreach (var slot in activeSlots.ToArray())
{
ReturnSlot(slot);
}
activeSlots.Clear();
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 15447f4a4d271354fb52bbdf1a526c6e

View File

@@ -0,0 +1,152 @@
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;
}
Debug.Log($"[AbnormalitySlotUI] Initialize: {abnormality.Data.abnormalityName}, icon: {abnormality.Data.icon?.name ?? "null"}");
Debug.Log($"[AbnormalitySlotUI] UI References - iconImage: {(iconImage != null ? "OK" : "NULL")}, durationFill: {(durationFill != null ? "OK" : "NULL")}, durationText: {(durationText != null ? "OK" : "NULL")}, backgroundImage: {(backgroundImage != null ? "OK" : "NULL")}");
// Cooltime 요소 활성화 (부모 게임오브젝트들이 비활성화되어 있을 수 있음)
EnableDurationElements();
// 아이콘 설정
if (iconImage != null)
{
iconImage.sprite = abnormality.Data.icon;
iconImage.enabled = abnormality.Data.icon != null;
}
// 이름 설정
if (effectNameText != null)
{
effectNameText.text = abnormality.Data.abnormalityName;
}
else
{
Debug.LogWarning("[AbnormalitySlotUI] effectNameText is null");
}
// 배경 색상 설정 (버프/디버프 구분)
if (backgroundImage != null)
{
backgroundImage.color = abnormality.Data.isDebuff ? debuffColor : buffColor;
}
// 초기 상태 업데이트
UpdateDisplay(abnormality.RemainingDuration, abnormality.Data.duration);
}
/// <summary>
/// UI 표시 업데이트
/// </summary>
/// <param name="remainingDuration">남은 지속 시간</param>
/// <param name="totalDuration">전체 지속 시간</param>
public void UpdateDisplay(float remainingDuration, float totalDuration)
{
// 지속 시간 채우기 이미지 업데이트 (시간이 지날수록 채워짐)
if (durationFill != null && totalDuration > 0)
{
durationFill.fillAmount = 1f - (remainingDuration / totalDuration);
}
// 남은 시간 텍스트 업데이트 (정수만 표시)
if (durationText != null)
{
if (remainingDuration > 60f)
{
durationText.text = $"{(int)(remainingDuration / 60f)}:{(int)(remainingDuration % 60f):D2}";
}
else if (remainingDuration > 0f)
{
durationText.text = $"{Mathf.CeilToInt(remainingDuration)}";
}
else
{
durationText.text = string.Empty;
}
}
}
/// <summary>
/// 지속 시간 관련 UI 요소들의 부모 게임오브젝트를 활성화합니다.
/// </summary>
private void EnableDurationElements()
{
// durationFill의 모든 부모 게임오브젝트 활성화
if (durationFill != null)
{
Transform parent = durationFill.transform.parent;
while (parent != null && parent != transform)
{
parent.gameObject.SetActive(true);
parent = parent.parent;
}
}
// durationText의 모든 부모 게임오브젝트 활성화
if (durationText != null)
{
Transform parent = durationText.transform.parent;
while (parent != null && parent != transform)
{
parent.gameObject.SetActive(true);
parent = parent.parent;
}
}
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 287a45a81e69cbf48845f88759cf7eb4

View 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);
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: a1b2c3d4e5f6a7b8c9a0d1e5e3

View File

@@ -0,0 +1,142 @@
using UnityEngine;
using Colosseum.Player;
using Colosseum.Skills;
namespace Colosseum.UI
{
/// <summary>
/// 스킬 퀵슬롯 UI 관리자.
/// PlayerSkillInput과 연동하여 쿨타임, 마나 등을 표시합니다.
/// </summary>
public class SkillQuickSlotUI : MonoBehaviour
{
[Header("Skill Slots")]
[Tooltip("6개의 스킬 슬롯 UI (인덱스 순서대로)")]
[SerializeField] private SkillSlotUI[] skillSlots = new SkillSlotUI[6];
[Header("Debug")]
[SerializeField] private bool debugMode = false;
[Header("Keybind Labels")]
[Tooltip("키바인딩 표시 텍스트 (기본: Q, W, E, R, A, S)")]
[SerializeField] private string[] keyLabels = { "Q", "W", "E", "R", "A", "S" };
private PlayerSkillInput playerSkillInput;
private PlayerNetworkController networkController;
private void Start()
{
// 로컬 플레이어 찾기
FindLocalPlayer();
}
private void FindLocalPlayer()
{
var players = FindObjectsByType<PlayerSkillInput>(FindObjectsSortMode.None);
if (players.Length == 0)
{
Debug.LogWarning("[SkillQuickSlotUI] No PlayerSkillInput found in scene");
return;
}
foreach (var player in players)
{
if (player.IsOwner)
{
playerSkillInput = player;
networkController = player.GetComponent<PlayerNetworkController>();
Debug.Log($"[SkillQuickSlotUI] Found local player: {player.name}");
InitializeSlots();
return;
}
}
Debug.LogWarning("[SkillQuickSlotUI] No local player found (IsOwner = false)");
}
private void InitializeSlots()
{
if (playerSkillInput == null) return;
int initializedCount = 0;
for (int i = 0; i < skillSlots.Length && i < keyLabels.Length; i++)
{
SkillData skill = playerSkillInput.GetSkill(i);
string keyLabel = i < keyLabels.Length ? keyLabels[i] : (i + 1).ToString();
if (skillSlots[i] != null)
{
skillSlots[i].Initialize(i, skill, keyLabel);
if (skill != null) initializedCount++;
}
else
{
Debug.LogWarning($"[SkillQuickSlotUI] Slot {i} is not assigned");
}
}
Debug.Log($"[SkillQuickSlotUI] Initialized {initializedCount} skill slots");
}
private void Update()
{
if (playerSkillInput == null)
{
// 플레이어가 아직 없으면 다시 찾기 시도
FindLocalPlayer();
return;
}
UpdateSlotStates();
}
private float debugLogTimer = 0f;
private void UpdateSlotStates()
{
bool shouldLog = debugMode && Time.time > debugLogTimer;
if (shouldLog) debugLogTimer = Time.time + 1f;
for (int i = 0; i < skillSlots.Length; i++)
{
if (skillSlots[i] == null) continue;
SkillData skill = playerSkillInput.GetSkill(i);
if (skill == null) continue;
float remainingCooldown = playerSkillInput.GetRemainingCooldown(i);
float totalCooldown = skill.Cooldown;
bool hasEnoughMana = networkController == null || networkController.Mana >= skill.ManaCost;
if (shouldLog && remainingCooldown > 0f)
{
Debug.Log($"[SkillQuickSlotUI] Slot {i}: {skill.SkillName}, CD: {remainingCooldown:F1}/{totalCooldown:F1}");
}
skillSlots[i].UpdateState(remainingCooldown, totalCooldown, hasEnoughMana);
}
}
/// <summary>
/// 플레이어 참조 수동 설정 (씬 전환 등에서 사용)
/// </summary>
public void SetPlayer(PlayerSkillInput player)
{
playerSkillInput = player;
networkController = player?.GetComponent<PlayerNetworkController>();
InitializeSlots();
}
/// <summary>
/// 특정 슬롯의 스킬 변경
/// </summary>
public void UpdateSkillSlot(int slotIndex, SkillData skill)
{
if (slotIndex < 0 || slotIndex >= skillSlots.Length) return;
string keyLabel = slotIndex < keyLabels.Length ? keyLabels[slotIndex] : (slotIndex + 1).ToString();
skillSlots[slotIndex].Initialize(slotIndex, skill, keyLabel);
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 637160b507db7634aba029b1624bc4a5

View File

@@ -0,0 +1,175 @@
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using Colosseum.Skills;
namespace Colosseum.UI
{
/// <summary>
/// 개별 스킬 슬롯 UI
/// </summary>
public class SkillSlotUI : MonoBehaviour
{
[Header("References")]
[SerializeField] private Image iconImage;
[SerializeField] private Image cooldownOverlay;
[SerializeField] private TMP_Text cooldownText;
[SerializeField] private TMP_Text keybindText;
[Header("Settings")]
[SerializeField] private Color availableColor = Color.white;
[SerializeField] private Color cooldownColor = new Color(0.2f, 0.2f, 0.2f, 0.9f);
[SerializeField] private Color noManaColor = new Color(0.5f, 0.2f, 0.2f, 0.8f);
private SkillData skill;
private int slotIndex;
private bool useIconForCooldown = false;
private Animator cooldownAnimator; // 쿨다운 오버레이를 제어하는 Animator
private GameObject cooldownContainer; // 쿨다운 오버레이의 부모 GameObject (Cooldown)
public int SlotIndex => slotIndex;
private void Awake()
{
if (cooldownOverlay == null)
{
useIconForCooldown = true;
}
else if (cooldownOverlay.type != Image.Type.Filled)
{
useIconForCooldown = true;
}
else
{
// 쿨다운 오버레이의 상위 GameObject에 있는 Animator 찾기
// 구조: CooldownItem (Animator) -> Cooldown -> SPR_Cooldown (Image)
cooldownAnimator = cooldownOverlay.GetComponentInParent<Animator>();
// Animator가 Cooldown GameObject를 제어하므로
// 쿨다운 표시를 위해 Animator를 비활성화하고 수동으로 제어
if (cooldownAnimator != null)
{
cooldownAnimator.enabled = false;
// Animator가 제어하던 Cooldown GameObject 찾기
// SPR_Cooldown의 부모가 Cooldown
cooldownContainer = cooldownOverlay.transform.parent?.gameObject;
}
// 쿨다운 오버레이 초기화
cooldownOverlay.fillAmount = 0f;
cooldownOverlay.enabled = false;
// Cooldown 컨테이너 비활성화
if (cooldownContainer != null)
{
cooldownContainer.SetActive(false);
}
}
}
public void Initialize(int index, SkillData skillData, string keyLabel)
{
slotIndex = index;
skill = skillData;
if (keybindText != null)
keybindText.text = keyLabel;
if (skill != null && iconImage != null)
{
iconImage.sprite = skill.Icon;
iconImage.enabled = true;
iconImage.color = availableColor;
}
else if (iconImage != null)
{
iconImage.enabled = false;
}
Debug.Log($"[SkillSlotUI] Init slot {index}: skill={skillData?.SkillName}, useIcon={useIconForCooldown}");
}
public void UpdateState(float cooldownRemaining, float cooldownTotal, bool hasEnoughMana)
{
if (skill == null)
{
if (cooldownContainer != null) cooldownContainer.SetActive(false);
if (cooldownOverlay != null) cooldownOverlay.enabled = false;
if (cooldownText != null) cooldownText.text = "";
return;
}
if (cooldownRemaining > 0f)
{
float ratio = cooldownRemaining / cooldownTotal;
if (useIconForCooldown && iconImage != null)
{
// 아이콘 색상으로 쿨다운 표시
float brightness = Mathf.Lerp(0.3f, 1f, 1f - ratio);
iconImage.color = new Color(brightness, brightness, brightness, 1f);
}
else if (cooldownOverlay != null)
{
// Cooldown 컨테이너 활성화
if (cooldownContainer != null && !cooldownContainer.activeSelf)
{
cooldownContainer.SetActive(true);
}
// Image 컴포넌트 활성화
cooldownOverlay.enabled = true;
cooldownOverlay.fillAmount = ratio;
}
if (cooldownText != null)
{
cooldownText.text = cooldownRemaining < 1f
? $"{cooldownRemaining:F1}"
: $"{Mathf.CeilToInt(cooldownRemaining)}";
}
}
else
{
// 쿨다운 완료
if (useIconForCooldown && iconImage != null)
{
iconImage.color = hasEnoughMana ? availableColor : noManaColor;
}
else if (cooldownOverlay != null)
{
// Image 컴포넌트 비활성화
cooldownOverlay.enabled = false;
// Cooldown 컨테이너 비활성화
if (cooldownContainer != null)
{
cooldownContainer.SetActive(false);
}
}
if (cooldownText != null)
{
cooldownText.text = "";
}
}
}
public void SetSkill(SkillData skillData)
{
skill = skillData;
if (skill != null && iconImage != null)
{
iconImage.sprite = skill.Icon;
iconImage.enabled = true;
iconImage.color = availableColor;
}
else if (iconImage != null)
{
iconImage.enabled = false;
}
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: bad7358e0082af244b16b0a515710fbc

View File

@@ -14,11 +14,11 @@ MonoBehaviour:
m_EditorClassIdentifier: Colosseum.Game::Colosseum.Skills.SkillData
skillName: "\uAD6C\uB974\uAE30"
description:
icon: {fileID: 0}
icon: {fileID: 21300000, guid: 2b3889a2bb9beb444adf6734821e1c02, type: 3}
skillClip: {fileID: -14460799136228694, guid: d6d51384d6dd17a419c1d8e2a1c0c875, type: 3}
endClip: {fileID: 0}
useRootMotion: 1
ignoreRootMotionY: 1
cooldown: 1
cooldown: 10
manaCost: 0
effects: []

View 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}

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 75bac55a016a0da46899806f58b76ce3
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View 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}

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 0e496b26a1dbf40488ce54cb4fe9c27b
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -23,3 +23,5 @@ MonoBehaviour:
manaCost: 5
effects:
- {fileID: 11400000, guid: e23fca57309ab2b4faa5c380118cd07e, type: 2}
- {fileID: 11400000, guid: 75bac55a016a0da46899806f58b76ce3, type: 2}
- {fileID: 11400000, guid: 0e496b26a1dbf40488ce54cb4fe9c27b, type: 2}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -83,7 +83,7 @@ PlayerSettings:
androidApplicationEntry: 2
defaultIsNativeResolution: 1
macRetinaSupport: 1
runInBackground: 0
runInBackground: 1
muteOtherAudioSources: 0
Prepare IOS For Recording: 0
Force IOS Speakers When Recording: 0

View File

@@ -4,62 +4,8 @@
QualitySettings:
m_ObjectHideFlags: 0
serializedVersion: 5
m_CurrentQuality: 1
m_CurrentQuality: 0
m_QualitySettings:
- serializedVersion: 5
name: Mobile
pixelLightCount: 2
shadows: 2
shadowResolution: 1
shadowProjection: 1
shadowCascades: 2
shadowDistance: 40
shadowNearPlaneOffset: 3
shadowCascade2Split: 0.33333334
shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
shadowmaskMode: 0
skinWeights: 2
globalTextureMipmapLimit: 0
textureMipmapLimitSettings: []
anisotropicTextures: 1
antiAliasing: 0
softParticles: 0
softVegetation: 1
realtimeReflectionProbes: 0
billboardsFaceCameraPosition: 1
useLegacyDetailDistribution: 1
adaptiveVsync: 0
vSyncCount: 0
realtimeGICPUUsage: 100
adaptiveVsyncExtraA: 0
adaptiveVsyncExtraB: 0
lodBias: 1
meshLodThreshold: 1
maximumLODLevel: 0
enableLODCrossFade: 1
streamingMipmapsActive: 0
streamingMipmapsAddAllCameras: 1
streamingMipmapsMemoryBudget: 512
streamingMipmapsRenderersPerFrame: 512
streamingMipmapsMaxLevelReduction: 2
streamingMipmapsMaxFileIORequests: 1024
particleRaycastBudget: 256
asyncUploadTimeSlice: 2
asyncUploadBufferSize: 16
asyncUploadPersistentBuffer: 1
resolutionScalingFixedDPIFactor: 1
customRenderPipeline: {fileID: 11400000, guid: 5e6cbd92db86f4b18aec3ed561671858, type: 2}
terrainQualityOverrides: 0
terrainPixelError: 1
terrainDetailDensityScale: 1
terrainBasemapDistance: 1000
terrainDetailDistance: 80
terrainTreeDistance: 5000
terrainBillboardStart: 50
terrainFadeLength: 5
terrainMaxTrees: 50
excludedTargetPlatforms:
- Standalone
- serializedVersion: 5
name: PC
pixelLightCount: 2
@@ -116,22 +62,4 @@ QualitySettings:
- Android
- iPhone
m_TextureMipmapLimitGroupNames: []
m_PerPlatformDefaultQuality:
Android: 0
AndroidXR: 0
GameCoreScarlett: 1
GameCoreXboxOne: 1
Lumin: 0
MetaQuest: 0
Nintendo Switch: 1
Nintendo Switch 2: 1
PS4: 1
PS5: 1
Server: 0
Stadia: 0
Standalone: 1
WebGL: 0
Windows Store Apps: 0
XboxOne: 0
iPhone: 0
tvOS: 0
m_PerPlatformDefaultQuality: {}

View File

@@ -4,7 +4,7 @@
UnityConnectSettings:
m_ObjectHideFlags: 0
serializedVersion: 1
m_Enabled: 0
m_Enabled: 1
m_TestMode: 0
m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events
m_EventUrl: https://cdp.cloud.unity3d.com/v1/events