Compare commits

...

21 Commits

Author SHA1 Message Date
7fc457a384 적 공격 애니메이션 타이밍 조정 및 무기 장착
기타 누락되었던 프리팹 수정 사항 모두 반영
2026-02-27 19:07:27 +09:00
8093cca251 전장의 안개가 비활성화 되어 있을 때 적이 보이지 않는 문제 수정 2026-02-27 14:34:29 +09:00
c34b9df4f7 팀 체력 UI 2026-02-27 14:19:07 +09:00
BoyongHwang
3aa43bfd20 Merge branch 'main' of http://59.18.227.134:30008/dal4segno/Northbound 2026-02-26 03:18:35 +09:00
BoyongHwang
5284ffc153 팀 정보 HUD 추가
- GameMain > UI > Canvas > TeamCardsRoot > Slot_1 ~ 4
- TeamCard_Large, Small prefab 추가
- https://www.notion.so/HUD-31294d45b1a38099bdcbc63cf9e5279e?source=copy_link
2026-02-26 03:18:28 +09:00
20167a8a52 입력 못받는 버그 추가 수정 및 입력 로직 강제 복구 로직 추가 2026-02-26 01:37:25 +09:00
9951aa98b2 입력 시스템 개선
각자의 입력 처리 로직을 갖지 않고 NetworkPlayerController로부터 받아서 쓰도록 함
2026-02-26 01:20:23 +09:00
600f35ae8f 기본 배치 건물이 시야를 제공하도록 변경 2026-02-26 00:37:38 +09:00
a4eae438de 클라이언트에서 캠프 처치 없이도 ResourcePickup이 보이는 문제 수정 2026-02-25 23:52:13 +09:00
72fe5e5b04 Merge branch 'main' of http://192.168.10.102:30008/dal4segno/Northbound 2026-02-25 23:35:25 +09:00
93d326e692 클라이언트에서 밝혀지지 않은 곳의 적이 보이는 문제 수정 2026-02-25 23:35:18 +09:00
BoyongHwang
863e98a53f Merge branch 'main' of http://59.18.227.134:30008/dal4segno/Northbound 2026-02-25 23:28:14 +09:00
BoyongHwang
a979013b73 260225 플레이 테스트 이후 밸런스 수정
- 타워 비용 증가
- 유닛 속도 감소
- 플레이어 캐퍼시티 감소
2026-02-25 23:28:03 +09:00
9c6a9910cb 클라이언트에서 건설모드를 진입할 수 없는 문제 수정 2026-02-25 22:23:59 +09:00
b3a9823f49 어그로 시스템 관련 오류 수정
순회 중 순회 대상을 수정해서 발생한 문제
순회와 수정을 분리함
2026-02-25 22:14:33 +09:00
0a2119a548 팀원들 모두가 시야를 공유하도록 함 2026-02-25 21:45:06 +09:00
23429ec096 클라이언트의 이동속도가 2배인 문제 수정
로컬 컨트롤러를 제거하고 네트워크 컨트롤러만 남겨둠
2026-02-25 21:40:50 +09:00
2f7eac05ce 클라이언트에게 시야 정보가 공유되지 않는 문제 수정 2026-02-25 21:26:11 +09:00
9a010524f2 Merge branch 'main' of http://192.168.10.102:30008/dal4segno/Northbound 2026-02-25 21:13:14 +09:00
34ab12a093 추격 포기로 인한 복귀 시, 복귀하는 동안 무적 상태 + 체력 전체 회복 2026-02-25 21:13:06 +09:00
d066290607 플레이어 체력 자연 회복 기능 추가
전투 상태 감지 기능
player stat으로 관리 가능
2026-02-25 21:09:19 +09:00
83 changed files with 5115 additions and 3932 deletions

View File

@@ -67,7 +67,6 @@
<Compile Include="Assets\Scripts\FogOfWarRenderer.cs" />
<Compile Include="Assets\Scripts\ResourcePickup.cs" />
<Compile Include="Assets\Scripts\PlayerVisionProvider.cs" />
<Compile Include="Assets\Scripts\PlayerController.cs" />
<Compile Include="Assets\FlatKit\Demos\Common\Scripts\Motion\OrbitMotion.cs" />
<Compile Include="Assets\Scripts\CreepCamp.cs" />
<Compile Include="Assets\Scripts\EnemyAIController.cs" />
@@ -83,6 +82,7 @@
<Compile Include="Assets\Scripts\Resource.cs" />
<Compile Include="Assets\Data\Scripts\DataClasses\UpgradeData.cs" />
<Compile Include="Assets\Scripts\UpgradeDatabase.cs" />
<Compile Include="Assets\Scripts\UI\TeamHealthUI.cs" />
<Compile Include="Assets\Scripts\AutoTargetSystem.cs" />
<Compile Include="Assets\Scripts\CreepDataComponent.cs" />
<Compile Include="Assets\Scripts\BuildingSlotButton.cs" />

View File

@@ -14,7 +14,7 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.CreepData
id: 1
memo: "\uAE30\uBCF81"
moveSpeed: 5
moveSpeed: 4
maxHp: 75
sight: 6
atkRange: 1
@@ -22,5 +22,5 @@ MonoBehaviour:
atkIntervalSec: 2
cost: 2
weight: 1
modelPath: Assets/Models/PlantWarrior.fbx
modelPath: Assets/Models/PlantWarrior_With_Spear.fbx
animationControllerPath: Assets/Animations/MonsterAnimationController.controller

View File

@@ -14,8 +14,8 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.CreepData
id: 2
memo: "\uAE30\uBCF82"
moveSpeed: 4.5
maxHp: 100
moveSpeed: 3.5
maxHp: 50
sight: 6
atkRange: 4
atkDamage: 15

View File

@@ -14,7 +14,7 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterData
id: 101
memo: "Grunt(\uAE30\uBCF8)"
moveSpeed: 6.7
moveSpeed: 4.5
maxHp: 75
sight: 6
atkRange: 1
@@ -22,7 +22,7 @@ MonoBehaviour:
atkIntervalSec: 1.2
cost: 3
weight: 1
modelPath: Assets/Models/Skeleton_Minion.fbx
modelPath: Assets/Models/Skeleton_Minion_With_Sword.fbx
animationControllerPath: Assets/Animations/MonsterAnimationController.controller
waveMin: 1
waveMax: 10

View File

@@ -14,7 +14,7 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterData
id: 102
memo: "Tank(\uB290\uB9BC/\uB2E8\uB2E8)"
moveSpeed: 3.3
moveSpeed: 2.5
maxHp: 125
sight: 6
atkRange: 1

View File

@@ -14,7 +14,7 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterData
id: 103
memo: "Ranged(\uC6D0\uAC70\uB9AC/\uC57D\uD568)"
moveSpeed: 5.3
moveSpeed: 3.5
maxHp: 65
sight: 6
atkRange: 5

View File

@@ -14,7 +14,7 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterData
id: 104
memo: "Fast(\uBE60\uB984/\uC57D\uD568)"
moveSpeed: 8.6
moveSpeed: 6
maxHp: 45
sight: 6
atkRange: 1

View File

@@ -14,7 +14,7 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterData
id: 105
memo: "Elite(\uC18C\uC218 \uC815\uC608)"
moveSpeed: 6.6
moveSpeed: 4.5
maxHp: 100
sight: 6
atkRange: 1

View File

@@ -18,8 +18,8 @@ MonoBehaviour:
level: 1
upgradeTo: 2
towerType: attack
mana: 100
manpower: 10
mana: 150
manpower: 50
sizeX: 4
sizeY: 10
sizeZ: 4

View File

@@ -19,11 +19,11 @@ MonoBehaviour:
upgradeTo: 0
towerType: defense
mana: 150
manpower: 20
manpower: 50
sizeX: 8
sizeY: 4
sizeZ: 3
maxHp: 30
maxHp: 110
sight: 1
atkRange: 0
atkDamage: 0

View File

@@ -18,8 +18,8 @@ MonoBehaviour:
level: 2
upgradeTo: 3
towerType: attack
mana: 200
manpower: 20
mana: 300
manpower: 60
sizeX: 4
sizeY: 10
sizeZ: 4

View File

@@ -18,8 +18,8 @@ MonoBehaviour:
level: 3
upgradeTo: 4
towerType: attack
mana: 300
manpower: 30
mana: 450
manpower: 70
sizeX: 4
sizeY: 10
sizeZ: 4

View File

@@ -18,8 +18,8 @@ MonoBehaviour:
level: 4
upgradeTo: 5
towerType: attack
mana: 400
manpower: 40
mana: 600
manpower: 80
sizeX: 4
sizeY: 10
sizeZ: 4

View File

@@ -18,8 +18,8 @@ MonoBehaviour:
level: 5
upgradeTo: 0
towerType: attack
mana: 600
manpower: 50
mana: 750
manpower: 100
sizeX: 4
sizeY: 10
sizeZ: 4

View File

@@ -19,11 +19,11 @@ MonoBehaviour:
upgradeTo: 8
towerType: defense
mana: 30
manpower: 10
manpower: 20
sizeX: 8
sizeY: 4
sizeZ: 3
maxHp: 30
maxHp: 50
sight: 1
atkRange: 0
atkDamage: 0

View File

@@ -19,11 +19,11 @@ MonoBehaviour:
upgradeTo: 9
towerType: defense
mana: 50
manpower: 20
manpower: 30
sizeX: 8
sizeY: 4
sizeZ: 3
maxHp: 30
maxHp: 60
sight: 1
atkRange: 0
atkDamage: 0

View File

@@ -19,11 +19,11 @@ MonoBehaviour:
upgradeTo: 10
towerType: defense
mana: 100
manpower: 20
manpower: 40
sizeX: 8
sizeY: 4
sizeZ: 3
maxHp: 30
maxHp: 80
sight: 1
atkRange: 0
atkDamage: 0

View File

@@ -38,7 +38,7 @@ namespace Northbound.Data
public int length => sizeZ; // Z축 (깊이)
public float height => sizeY; // Y축 (높이)
public int maxHealth => maxHp;
public float visionRange => atkRange;
public float visionRange => sight;
public float requiredWorkAmount => manpower;
public Vector3 GetSize(int rotation)

View File

@@ -73,9 +73,9 @@ Material:
- _OutlineWidth: 0
- _PerspectiveFilter: 0.875
- _Reflectivity: 10
- _ScaleRatioA: 0.9814815
- _ScaleRatioB: 0.7974537
- _ScaleRatioC: 0.7974537
- _ScaleRatioA: 0.75
- _ScaleRatioB: 0.609375
- _ScaleRatioC: 0.609375
- _ScaleX: 1
- _ScaleY: 1
- _ShaderFlags: 0

View File

@@ -0,0 +1,129 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1001 &2678598980648547258
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: -8679921383154817045, guid: 1b47a488ece83f249abea22b1b1877fb, type: 3}
propertyPath: m_LocalPosition.x
value: -14.918472
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 1b47a488ece83f249abea22b1b1877fb, type: 3}
propertyPath: m_LocalPosition.y
value: 1.0000176
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 1b47a488ece83f249abea22b1b1877fb, type: 3}
propertyPath: m_LocalPosition.z
value: 6.0022106
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 1b47a488ece83f249abea22b1b1877fb, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 1b47a488ece83f249abea22b1b1877fb, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 1b47a488ece83f249abea22b1b1877fb, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 1b47a488ece83f249abea22b1b1877fb, type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 1b47a488ece83f249abea22b1b1877fb, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 1b47a488ece83f249abea22b1b1877fb, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 1b47a488ece83f249abea22b1b1877fb, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 919132149155446097, guid: 1b47a488ece83f249abea22b1b1877fb, type: 3}
propertyPath: m_Name
value: PlantWarrior_With_Spear
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects:
- targetCorrespondingSourceObject: {fileID: -5515783359193845756, guid: 1b47a488ece83f249abea22b1b1877fb, type: 3}
insertIndex: -1
addedObject: {fileID: 7069067296122378839}
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 1b47a488ece83f249abea22b1b1877fb, type: 3}
--- !u!4 &1610120253448831934 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -5515783359193845756, guid: 1b47a488ece83f249abea22b1b1877fb, type: 3}
m_PrefabInstance: {fileID: 2678598980648547258}
m_PrefabAsset: {fileID: 0}
--- !u!1001 &7318602548037418428
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 1610120253448831934}
m_Modifications:
- target: {fileID: -8679921383154817045, guid: bec7726862777a042919c40fd38fce81, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: bec7726862777a042919c40fd38fce81, type: 3}
propertyPath: m_LocalPosition.y
value: 0.15
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: bec7726862777a042919c40fd38fce81, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: bec7726862777a042919c40fd38fce81, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: bec7726862777a042919c40fd38fce81, type: 3}
propertyPath: m_LocalRotation.x
value: 0.00000008146034
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: bec7726862777a042919c40fd38fce81, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: bec7726862777a042919c40fd38fce81, type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: bec7726862777a042919c40fd38fce81, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: bec7726862777a042919c40fd38fce81, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: bec7726862777a042919c40fd38fce81, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 919132149155446097, guid: bec7726862777a042919c40fd38fce81, type: 3}
propertyPath: m_Name
value: PlantWarrior_Spear
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: bec7726862777a042919c40fd38fce81, type: 3}
--- !u!4 &7069067296122378839 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: bec7726862777a042919c40fd38fce81, type: 3}
m_PrefabInstance: {fileID: 7318602548037418428}
m_PrefabAsset: {fileID: 0}

View File

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

View File

@@ -0,0 +1,129 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1001 &274662760238388128
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 8440547662176677020}
m_Modifications:
- target: {fileID: -8679921383154817045, guid: c85b70d5b9e5dda4d91f7d8ad5b574db, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: c85b70d5b9e5dda4d91f7d8ad5b574db, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: c85b70d5b9e5dda4d91f7d8ad5b574db, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: c85b70d5b9e5dda4d91f7d8ad5b574db, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: c85b70d5b9e5dda4d91f7d8ad5b574db, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: c85b70d5b9e5dda4d91f7d8ad5b574db, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: c85b70d5b9e5dda4d91f7d8ad5b574db, type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: c85b70d5b9e5dda4d91f7d8ad5b574db, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: c85b70d5b9e5dda4d91f7d8ad5b574db, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: c85b70d5b9e5dda4d91f7d8ad5b574db, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 919132149155446097, guid: c85b70d5b9e5dda4d91f7d8ad5b574db, type: 3}
propertyPath: m_Name
value: sword_1handed
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: c85b70d5b9e5dda4d91f7d8ad5b574db, type: 3}
--- !u!4 &307780991042516043 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: c85b70d5b9e5dda4d91f7d8ad5b574db, type: 3}
m_PrefabInstance: {fileID: 274662760238388128}
m_PrefabAsset: {fileID: 0}
--- !u!1001 &5068477173941542040
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: -8679921383154817045, guid: 134023580cb126541be31f65cf1db789, type: 3}
propertyPath: m_LocalPosition.x
value: -17.62028
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 134023580cb126541be31f65cf1db789, type: 3}
propertyPath: m_LocalPosition.y
value: 1.0000178
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 134023580cb126541be31f65cf1db789, type: 3}
propertyPath: m_LocalPosition.z
value: 7.511076
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 134023580cb126541be31f65cf1db789, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 134023580cb126541be31f65cf1db789, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 134023580cb126541be31f65cf1db789, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 134023580cb126541be31f65cf1db789, type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 134023580cb126541be31f65cf1db789, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 134023580cb126541be31f65cf1db789, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 134023580cb126541be31f65cf1db789, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 919132149155446097, guid: 134023580cb126541be31f65cf1db789, type: 3}
propertyPath: m_Name
value: Skeleton_Minion_With_Sword
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects:
- targetCorrespondingSourceObject: {fileID: -5515783359193845756, guid: 134023580cb126541be31f65cf1db789, type: 3}
insertIndex: -1
addedObject: {fileID: 307780991042516043}
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 134023580cb126541be31f65cf1db789, type: 3}
--- !u!4 &8440547662176677020 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -5515783359193845756, guid: 134023580cb126541be31f65cf1db789, type: 3}
m_PrefabInstance: {fileID: 5068477173941542040}
m_PrefabAsset: {fileID: 0}

View File

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

47
Assets/Prefabs/Core.asset Normal file
View File

@@ -0,0 +1,47 @@
%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: 8c40fef5ebc37b743a3f225c1ca57c32, type: 3}
m_Name: Core
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.TowerData
id: 0
memo:
buildingName:
level: 0
upgradeTo: 0
towerType:
mana: 0
manpower: 0
sizeX: 0
sizeY: 0
sizeZ: 0
maxHp: 0
sight: 100
atkRange: 0
atkDamage: 0
atkIntervalSec: 0
modelPath:
prefab: {fileID: 0}
icon: {fileID: 0}
placementOffset: {x: 0, y: 0, z: 0}
allowRotation: 1
isIndestructible: 0
autoRegenerate: 0
regenPerSecond: 1
providesVision: 1
constructionEquipment:
socketName: RightHand
equipmentPrefab: {fileID: 0}
attachOnStart: 1
detachOnEnd: 1
keepEquipped: 0
attachDelay: 0
detachDelay: 0

View File

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

View File

@@ -49,7 +49,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject
GlobalObjectIdHash: 3998537868
GlobalObjectIdHash: 615747208
InScenePlacedSourceGlobalObjectIdHash: 615747208
DeferredDespawnTick: 0
Ownership: 0
@@ -106,7 +106,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Building
ShowTopMostFoldoutHeaderGroup: 1
buildingData: {fileID: 0}
buildingData: {fileID: 11400000, guid: 8e9cb7f0c2209b543b171709534789aa, type: 2}
gridPosition: {x: 0, y: 0, z: 0}
rotation: 0
initialTeam: 1
@@ -152,10 +152,12 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 760137a2fd0da7f458ac4b0ee7f485d6, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.FogOfWarVisibility
alwaysVisible: 1
showInExploredAreas: 1
updateInterval: 0.2
renderers: []
enableDistantVisibility: 1
baseVisibilityRange: 50
heightVisibilityMultiplier: 2
minHeightForDistantVisibility: 3
useExploredMaterial: 0

File diff suppressed because it is too large Load Diff

View File

@@ -1641,8 +1641,10 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.EnemyUnit
ShowTopMostFoldoutHeaderGroup: 1
enableFogVisibility: 1
visibilityCheckInterval: 0.1
enemyTeam: 2
maxHealth: 100
maxHealth: 50
damageEffectPrefab: {fileID: 4021103657954561961, guid: 5c755f9bc5253ea418e919994537dcc7, type: 3}
destroyEffectPrefab: {fileID: 141433446842962269, guid: 9fe8f8b3288e45a44af36ff8aa04486e, type: 3}
showHealthBar: 1
@@ -1657,7 +1659,7 @@ NavMeshAgent:
m_Enabled: 1
m_AgentTypeID: 0
m_Radius: 0.5
m_Speed: 4.5
m_Speed: 3.5
m_Acceleration: 8
avoidancePriority: 50
m_AngularSpeed: 120
@@ -1696,9 +1698,16 @@ MonoBehaviour:
attackRange: 4
attackInterval: 4
attackDamage: 15
moveSpeed: 4.5
moveSpeed: 3.5
chaseSpeedMultiplier: 1
showDebugInfo: 1
creepCamp: {fileID: 0}
enableAggroSystem: 1
damageAggroMultiplier: 2
aggroDecayRate: 5
aggroSwitchThreshold: 20
targetReevaluateInterval: 1
distanceSwitchThreshold: 5
--- !u!95 &367892292455292432
Animator:
serializedVersion: 7

File diff suppressed because it is too large Load Diff

View File

@@ -1737,6 +1737,8 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.EnemyUnit
ShowTopMostFoldoutHeaderGroup: 1
enableFogVisibility: 1
visibilityCheckInterval: 0.1
enemyTeam: 3
maxHealth: 125
damageEffectPrefab: {fileID: 4021103657954561961, guid: 5c755f9bc5253ea418e919994537dcc7, type: 3}
@@ -1753,7 +1755,7 @@ NavMeshAgent:
m_Enabled: 1
m_AgentTypeID: 0
m_Radius: 0.5
m_Speed: 3.3
m_Speed: 2.5
m_Acceleration: 8
avoidancePriority: 50
m_AngularSpeed: 120
@@ -1792,9 +1794,16 @@ MonoBehaviour:
attackRange: 1
attackInterval: 1.5
attackDamage: 4
moveSpeed: 3.3
moveSpeed: 2.5
chaseSpeedMultiplier: 1
showDebugInfo: 1
creepCamp: {fileID: 0}
enableAggroSystem: 1
damageAggroMultiplier: 2
aggroDecayRate: 5
aggroSwitchThreshold: 20
targetReevaluateInterval: 1
distanceSwitchThreshold: 5
--- !u!114 &6540479212111277442
MonoBehaviour:
m_ObjectHideFlags: 0

View File

@@ -659,6 +659,8 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.EnemyUnit
ShowTopMostFoldoutHeaderGroup: 1
enableFogVisibility: 1
visibilityCheckInterval: 0.1
enemyTeam: 3
maxHealth: 65
damageEffectPrefab: {fileID: 4021103657954561961, guid: 5c755f9bc5253ea418e919994537dcc7, type: 3}
@@ -675,7 +677,7 @@ NavMeshAgent:
m_Enabled: 1
m_AgentTypeID: 0
m_Radius: 0.5
m_Speed: 5.3
m_Speed: 3.5
m_Acceleration: 8
avoidancePriority: 50
m_AngularSpeed: 120
@@ -714,9 +716,16 @@ MonoBehaviour:
attackRange: 5
attackInterval: 1.4
attackDamage: 2
moveSpeed: 5.3
moveSpeed: 3.5
chaseSpeedMultiplier: 1
showDebugInfo: 1
creepCamp: {fileID: 0}
enableAggroSystem: 1
damageAggroMultiplier: 2
aggroDecayRate: 5
aggroSwitchThreshold: 20
targetReevaluateInterval: 1
distanceSwitchThreshold: 5
--- !u!114 &8817410469440881478
MonoBehaviour:
m_ObjectHideFlags: 0

View File

@@ -1092,6 +1092,8 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.EnemyUnit
ShowTopMostFoldoutHeaderGroup: 1
enableFogVisibility: 1
visibilityCheckInterval: 0.1
enemyTeam: 3
maxHealth: 45
damageEffectPrefab: {fileID: 4021103657954561961, guid: 5c755f9bc5253ea418e919994537dcc7, type: 3}
@@ -1108,7 +1110,7 @@ NavMeshAgent:
m_Enabled: 1
m_AgentTypeID: 0
m_Radius: 0.5
m_Speed: 8.6
m_Speed: 6
m_Acceleration: 8
avoidancePriority: 50
m_AngularSpeed: 120
@@ -1147,9 +1149,16 @@ MonoBehaviour:
attackRange: 1
attackInterval: 1
attackDamage: 2
moveSpeed: 8.6
moveSpeed: 6
chaseSpeedMultiplier: 1
showDebugInfo: 1
creepCamp: {fileID: 0}
enableAggroSystem: 1
damageAggroMultiplier: 2
aggroDecayRate: 5
aggroSwitchThreshold: 20
targetReevaluateInterval: 1
distanceSwitchThreshold: 5
--- !u!114 &177302896207380593
MonoBehaviour:
m_ObjectHideFlags: 0

View File

@@ -1337,6 +1337,8 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.EnemyUnit
ShowTopMostFoldoutHeaderGroup: 1
enableFogVisibility: 1
visibilityCheckInterval: 0.1
enemyTeam: 3
maxHealth: 100
damageEffectPrefab: {fileID: 4021103657954561961, guid: 5c755f9bc5253ea418e919994537dcc7, type: 3}
@@ -1353,7 +1355,7 @@ NavMeshAgent:
m_Enabled: 1
m_AgentTypeID: 0
m_Radius: 0.5
m_Speed: 6.6
m_Speed: 4.5
m_Acceleration: 8
avoidancePriority: 50
m_AngularSpeed: 120
@@ -1392,9 +1394,16 @@ MonoBehaviour:
attackRange: 1
attackInterval: 1.3
attackDamage: 7
moveSpeed: 6.6
moveSpeed: 4.5
chaseSpeedMultiplier: 1
showDebugInfo: 1
creepCamp: {fileID: 0}
enableAggroSystem: 1
damageAggroMultiplier: 2
aggroDecayRate: 5
aggroSwitchThreshold: 20
targetReevaluateInterval: 1
distanceSwitchThreshold: 5
--- !u!114 &324484408599232274
MonoBehaviour:
m_ObjectHideFlags: 0

View File

@@ -93,7 +93,6 @@ MonoBehaviour:
deathEffectPrefab: {fileID: 5642766282230003982, guid: b5c8ca7ed10b61e499cce8ec3b6e2e4c, type: 3}
resourcePickupPrefab: {fileID: 1627676033990080135, guid: 8c45964a69bf8fa4ba461ed217bc052f, type: 3}
respawnDelay: 10
respawnPanelPrefab: {fileID: 5112555873318329611, guid: 9257920ba4a6256499ad89eeb7d7098a, type: 3}
showHealthBar: 1
healthBarPrefab: {fileID: 100000, guid: 8e7a5b12c9f8a4a5ba3c8d1f2e5a7b9c, type: 3}
--- !u!143 &3007098678582223509
@@ -418,11 +417,13 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.PlayerStats
baseMaxHp: 100
baseDamage: 10
baseCapacity: 100
baseCapacity: 50
baseManpower: 10
baseMoveSpeed: 5
baseMoveSpeed: 4
baseSight: 10
baseAttackRange: 2
baseAttackRange: 3
baseHpRegen: 1
baseHpRegenDelay: 5
--- !u!1 &1862223349553492570
GameObject:
m_ObjectHideFlags: 0

View File

@@ -319,10 +319,12 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 760137a2fd0da7f458ac4b0ee7f485d6, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.FogOfWarVisibility
alwaysVisible: 0
showInExploredAreas: 0
updateInterval: 0.2
renderers: []
enableDistantVisibility: 1
baseVisibilityRange: 10
heightVisibilityMultiplier: 2
minHeightForDistantVisibility: 3
useExploredMaterial: 0

View File

@@ -228,10 +228,12 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 760137a2fd0da7f458ac4b0ee7f485d6, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.FogOfWarVisibility
alwaysVisible: 0
showInExploredAreas: 0
updateInterval: 0.2
renderers: []
enableDistantVisibility: 1
baseVisibilityRange: 10
heightVisibilityMultiplier: 2
minHeightForDistantVisibility: 3
useExploredMaterial: 0

View File

@@ -138,10 +138,12 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 760137a2fd0da7f458ac4b0ee7f485d6, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.FogOfWarVisibility
alwaysVisible: 0
showInExploredAreas: 0
updateInterval: 0.2
renderers: []
enableDistantVisibility: 1
baseVisibilityRange: 10
heightVisibilityMultiplier: 2
minHeightForDistantVisibility: 3
useExploredMaterial: 0

View File

@@ -228,10 +228,12 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 760137a2fd0da7f458ac4b0ee7f485d6, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.FogOfWarVisibility
alwaysVisible: 0
showInExploredAreas: 0
updateInterval: 0.2
renderers: []
enableDistantVisibility: 1
baseVisibilityRange: 10
heightVisibilityMultiplier: 2
minHeightForDistantVisibility: 3
useExploredMaterial: 0

View File

@@ -228,10 +228,12 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 760137a2fd0da7f458ac4b0ee7f485d6, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.FogOfWarVisibility
alwaysVisible: 0
showInExploredAreas: 0
updateInterval: 0.2
renderers: []
enableDistantVisibility: 1
baseVisibilityRange: 10
heightVisibilityMultiplier: 2
minHeightForDistantVisibility: 3
useExploredMaterial: 0

View File

@@ -228,10 +228,12 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 760137a2fd0da7f458ac4b0ee7f485d6, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.FogOfWarVisibility
alwaysVisible: 0
showInExploredAreas: 0
updateInterval: 0.2
renderers: []
enableDistantVisibility: 1
baseVisibilityRange: 10
heightVisibilityMultiplier: 2
minHeightForDistantVisibility: 3
useExploredMaterial: 0

View File

@@ -319,10 +319,12 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 760137a2fd0da7f458ac4b0ee7f485d6, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.FogOfWarVisibility
alwaysVisible: 0
showInExploredAreas: 0
updateInterval: 0.2
renderers: []
enableDistantVisibility: 1
baseVisibilityRange: 10
heightVisibilityMultiplier: 2
minHeightForDistantVisibility: 3
useExploredMaterial: 0

View File

@@ -138,10 +138,12 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 760137a2fd0da7f458ac4b0ee7f485d6, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.FogOfWarVisibility
alwaysVisible: 0
showInExploredAreas: 0
updateInterval: 0.2
renderers: []
enableDistantVisibility: 1
baseVisibilityRange: 10
heightVisibilityMultiplier: 2
minHeightForDistantVisibility: 3
useExploredMaterial: 0

View File

@@ -228,10 +228,12 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 760137a2fd0da7f458ac4b0ee7f485d6, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.FogOfWarVisibility
alwaysVisible: 0
showInExploredAreas: 0
updateInterval: 0.2
renderers: []
enableDistantVisibility: 1
baseVisibilityRange: 10
heightVisibilityMultiplier: 2
minHeightForDistantVisibility: 3
useExploredMaterial: 0

View File

@@ -228,10 +228,12 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 760137a2fd0da7f458ac4b0ee7f485d6, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.FogOfWarVisibility
alwaysVisible: 0
showInExploredAreas: 0
updateInterval: 0.2
renderers: []
enableDistantVisibility: 1
baseVisibilityRange: 10
heightVisibilityMultiplier: 2
minHeightForDistantVisibility: 3
useExploredMaterial: 0

View File

@@ -138,10 +138,12 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 760137a2fd0da7f458ac4b0ee7f485d6, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.FogOfWarVisibility
alwaysVisible: 0
showInExploredAreas: 0
updateInterval: 0.2
renderers: []
enableDistantVisibility: 1
baseVisibilityRange: 10
heightVisibilityMultiplier: 2
minHeightForDistantVisibility: 3
useExploredMaterial: 0

View File

@@ -23,5 +23,5 @@ MonoBehaviour:
effectOpList:
- mul
effectValueList:
- 1.2
- 1.5
sortOrder: 13

View File

@@ -23,5 +23,5 @@ MonoBehaviour:
effectOpList:
- mul
effectValueList:
- 1.6
- 2
sortOrder: 14

View File

@@ -23,5 +23,5 @@ MonoBehaviour:
effectOpList:
- mul
effectValueList:
- 2
- 2.5
sortOrder: 15

File diff suppressed because it is too large Load Diff

View File

@@ -118,6 +118,12 @@ namespace Northbound
{
var damageable = targetObj.GetComponent<IDamageable>();
damageable?.TakeDamage(_playerStats?.GetDamage() ?? 10, attackerNetworkId);
// 공격자를 전투 상태로 기록 (체력 회복 방지)
if (_networkPlayerController != null)
{
_networkPlayerController.MarkInCombat();
}
}
}

View File

@@ -34,7 +34,6 @@ namespace Northbound
private int currentRotation = 0; // 0-3
private Material[] originalMaterials;
private Renderer[] previewRenderers;
private PlayerInputActions _inputActions;
// 드래그 건설 관련
private bool isDragging = false;
@@ -45,17 +44,43 @@ namespace Northbound
// UI 체크 캐싱 (Input System 콜백 내에서 IsPointerOverGameObject() 사용 불가)
private bool _isPointerOverUI = false;
// 플레이어 컨트롤러 참조 (로컬 플레이어 체크용)
private NetworkPlayerController _playerController;
private bool _isInitialized = false;
public override void OnNetworkSpawn()
{
if (!IsOwner) return;
_playerController = GetComponent<NetworkPlayerController>();
_inputActions = new PlayerInputActions();
_inputActions.Player.ToggleBuildMode.performed += OnToggleBuildMode;
_inputActions.Player.Rotate.performed += OnRotate;
_inputActions.Player.Build.performed += OnBuildPressed;
_inputActions.Player.Build.canceled += OnBuildReleased;
_inputActions.Player.Cancel.performed += OnCancel;
_inputActions.Enable();
if (_playerController != null)
{
_playerController.OnInputInitialized += TryInitializeInput;
}
// 이미 로컬 플레이어면 입력 초기화 시도
TryInitializeInput();
}
private void Start()
{
// Start에서 다시 한번 확인 (이벤트 타이밍 문제 해결)
TryInitializeInput();
}
private void TryInitializeInput()
{
if (_isInitialized) return; // 이미 초기화됨
if (_playerController == null || !_playerController.IsLocalPlayer) return;
if (_playerController.InputActions == null) return;
_isInitialized = true;
var inputActions = _playerController.InputActions;
inputActions.Player.ToggleBuildMode.performed += OnToggleBuildMode;
inputActions.Player.Rotate.performed += OnRotate;
inputActions.Player.Build.performed += OnBuildPressed;
inputActions.Player.Build.canceled += OnBuildReleased;
inputActions.Player.Cancel.performed += OnCancel;
// Create default materials if not assigned
if (validMaterial == null)
@@ -118,15 +143,19 @@ namespace Northbound
public override void OnNetworkDespawn()
{
if (IsOwner && _inputActions != null)
if (_playerController != null)
{
_inputActions.Player.ToggleBuildMode.performed -= OnToggleBuildMode;
_inputActions.Player.Rotate.performed -= OnRotate;
_inputActions.Player.Build.performed -= OnBuildPressed;
_inputActions.Player.Build.canceled -= OnBuildReleased;
_inputActions.Player.Cancel.performed -= OnCancel;
_inputActions.Disable();
_inputActions.Dispose();
_playerController.OnInputInitialized -= TryInitializeInput;
if (_isInitialized && _playerController.InputActions != null)
{
var inputActions = _playerController.InputActions;
inputActions.Player.ToggleBuildMode.performed -= OnToggleBuildMode;
inputActions.Player.Rotate.performed -= OnRotate;
inputActions.Player.Build.performed -= OnBuildPressed;
inputActions.Player.Build.canceled -= OnBuildReleased;
inputActions.Player.Cancel.performed -= OnCancel;
}
}
ClearDragPreviews();
@@ -134,7 +163,7 @@ namespace Northbound
private void Update()
{
if (!IsOwner) return;
if (!_isInitialized) return;
// UI 체크 캐싱 (Input System 콜백 내에서 사용하기 위해)
_isPointerOverUI = CheckPointerOverUI();

View File

@@ -6,8 +6,16 @@ namespace Northbound
/// <summary>
/// 블랙스미스 건물 - 업그레이드 구매 가능
/// </summary>
public class Blacksmith : MonoBehaviour, IInteractable
public class Blacksmith : NetworkBehaviour, IInteractable, IVisionProvider, ITeamMember
{
[Header("Vision Settings")]
[Tooltip("블랙스미스가 제공하는 시야 범위")]
public float visionRange = 10f;
[Header("Team")]
[Tooltip("건물의 팀")]
public TeamType initialTeam = TeamType.Player;
[Header("UI Reference")]
[SerializeField] private GameObject _upgradePopupPrefab;
@@ -55,9 +63,6 @@ namespace Northbound
return transform;
}
#endregion
private void OpenUpgradePopup(ulong playerId)
@@ -115,12 +120,63 @@ namespace Northbound
return null;
}
private void OnDestroy()
public override void OnDestroy()
{
if (_popupInstance != null)
{
Destroy(_popupInstance);
}
base.OnDestroy();
}
#region NetworkBehaviour Overrides
public override void OnNetworkSpawn()
{
if (IsServer)
{
// 시야 제공자로 등록
FogOfWarSystem.Instance?.RegisterVisionProvider(this);
}
}
public override void OnNetworkDespawn()
{
if (IsServer)
{
// 시야 제공자 등록 해제
FogOfWarSystem.Instance?.UnregisterVisionProvider(this);
}
}
#endregion
#region IVisionProvider Implementation
public ulong GetOwnerId() => 0; // 블랙스미스는 모든 플레이어에게 시야 제공
public float GetVisionRange() => visionRange;
Transform IVisionProvider.GetTransform() => transform;
public bool IsActive() => IsSpawned;
TeamType IVisionProvider.GetTeam() => initialTeam;
#endregion
#region ITeamMember Implementation
public TeamType GetTeam() => initialTeam;
public bool IsDead() => false; // 블랙스미스는 파괴되지 않음
public void SetTeam(TeamType team)
{
// 블랙스미스의 팀은 변경할 수 없음
Debug.LogWarning("[Blacksmith] 블랙스미스의 팀은 변경할 수 없습니다.");
}
#endregion
}
}

View File

@@ -7,12 +7,15 @@ namespace Northbound
/// <summary>
/// 플레이어가 자원을 건내받아 게임의 전역 자원으로 관리하는 중앙 허브
/// </summary>
public class Core : NetworkBehaviour, IInteractable, IDamageable, ITeamMember
public class Core : NetworkBehaviour, IInteractable, IDamageable, ITeamMember, IVisionProvider
{
[Header("Core Settings")]
public int maxStorageCapacity = 1000; // 코어의 최대 저장 용량
public bool unlimitedStorage = false; // 무제한 저장소
[Header("Vision")]
public float visionRange = 15f; // 코어가 제공하는 시야 범위
[Header("Health")]
public int maxHealth = 1000;
public GameObject damageEffectPrefab;
@@ -55,6 +58,9 @@ namespace Northbound
{
_totalResources.Value = 0;
_currentHealth.Value = maxHealth;
// 시야 제공자로 등록
FogOfWarSystem.Instance?.RegisterVisionProvider(this);
}
_currentHealth.OnValueChanged += OnHealthChanged;
@@ -62,6 +68,12 @@ namespace Northbound
public override void OnNetworkDespawn()
{
if (IsServer)
{
// 시야 제공자 등록 해제
FogOfWarSystem.Instance?.UnregisterVisionProvider(this);
}
_currentHealth.OnValueChanged -= OnHealthChanged;
}
@@ -372,5 +384,19 @@ namespace Northbound
}
#endregion
#region IVisionProvider Implementation
public ulong GetOwnerId() => 0; // 코어는 모든 플레이어에게 시야 제공
public float GetVisionRange() => visionRange;
Transform IVisionProvider.GetTransform() => transform;
public bool IsActive() => IsSpawned && !IsDead();
TeamType IVisionProvider.GetTeam() => TeamType.Player;
#endregion
}
}

View File

@@ -203,8 +203,8 @@ namespace Northbound
networkObj.SpawnWithOwnership(NetworkManager.Singleton.LocalClientId);
// 비활성화는 ServerRpc를 통해 처리
DisablePickupClientRpc();
// NetworkVariable을 통해 가시성 동기화 (기본적으로 숨김)
_resourcePickup.SetVisible(false);
}
private void HandleCreepDeath(EnemyUnit deadCreep)
@@ -225,7 +225,8 @@ namespace Northbound
// 모든 creep이 처치되었으면 ResourcePickup 활성화
if (_spawnedCreeps.Count == 0 && _resourcePickup != null)
{
EnableResourcePickupClientRpc();
// NetworkVariable이 자동으로 클라이언트에 동기화됨
_resourcePickup.SetVisible(true);
}
}
@@ -262,24 +263,6 @@ namespace Northbound
}
}
[Rpc(SendTo.ClientsAndHost)]
private void EnableResourcePickupClientRpc()
{
if (_resourcePickup != null)
{
_resourcePickup.gameObject.SetActive(true);
}
}
[Rpc(SendTo.ClientsAndHost)]
private void DisablePickupClientRpc()
{
if (_resourcePickup != null)
{
_resourcePickup.gameObject.SetActive(false);
}
}
private CreepData GetCreepDataFromPrefab(GameObject prefab)
{
if (prefab == null) return null;

View File

@@ -114,7 +114,7 @@ namespace Northbound
private bool _isAttacking = false;
private GameObject _pendingAttackTarget;
private float _attackStartTime;
private const float ATTACK_TIMEOUT = 1f; // 애니메이션 이벤트 미발생 시 타임아웃
private const float ATTACK_TIMEOUT = 2f; // 애니메이션 이벤트 미발생 시 타임아웃 (애니메이션 길이 고려)
// 어그로 시스템
private Dictionary<ulong, float> _aggroTable = new Dictionary<ulong, float>();
@@ -592,6 +592,9 @@ namespace Northbound
public void OnAttackHit()
{
PerformAttack();
// 공격 완료 후 상태 리셋 (타임아웃 방지)
_isAttacking = false;
_pendingAttackTarget = null;
}
/// <summary>
@@ -671,6 +674,7 @@ namespace Northbound
private void DecayAggro()
{
List<ulong> keysToRemove = new List<ulong>();
List<KeyValuePair<ulong, float>> updates = new List<KeyValuePair<ulong, float>>();
foreach (var kvp in _aggroTable)
{
@@ -681,10 +685,16 @@ namespace Northbound
}
else
{
_aggroTable[kvp.Key] = newAggro;
updates.Add(new KeyValuePair<ulong, float>(kvp.Key, newAggro));
}
}
// 순회 후 수정 적용
foreach (var update in updates)
{
_aggroTable[update.Key] = update.Value;
}
// 어그로가 0 이하인 항목 제거
foreach (var key in keysToRemove)
{
@@ -916,6 +926,16 @@ namespace Northbound
switch (state)
{
case EnemyAIState.Idle:
_agent.isStopped = true;
_agent.ResetPath();
// 즉시 정지를 위해 velocity 초기화
_agent.velocity = Vector3.zero;
// 복귀 완료 - 무적 해제
if (_enemyUnit != null)
{
_enemyUnit.SetInvulnerable(false);
}
break;
case EnemyAIState.Attack:
_agent.isStopped = true;
_agent.ResetPath();
@@ -940,6 +960,12 @@ namespace Northbound
_agent.isStopped = false;
_agent.speed = moveSpeed;
_agent.SetDestination(_originPosition);
// 복귀 시작 - 체력 회복 및 무적
if (_enemyUnit != null)
{
_enemyUnit.HealToFull();
_enemyUnit.SetInvulnerable(true);
}
break;
case EnemyAIState.Dead:
_agent.isStopped = true;

View File

@@ -9,6 +9,12 @@ namespace Northbound
[RequireComponent(typeof(Collider))]
public class EnemyUnit : NetworkBehaviour, IDamageable, ITeamMember, IHealthProvider
{
[Header("Fog of War Visibility")]
[Tooltip("전장의 안개에 의한 가시성 제어 활성화")]
public bool enableFogVisibility = true;
[Tooltip("가시성 체크 주기 (초)")]
public float visibilityCheckInterval = 0.1f;
[Header("Team Settings")]
[Tooltip("이 유닛의 팀 (Hostile = 적대세력, Monster = 몬스터)")]
public TeamType enemyTeam = TeamType.Hostile;
@@ -36,6 +42,12 @@ namespace Northbound
NetworkVariableWritePermission.Server
);
private NetworkVariable<bool> _isInvulnerable = new NetworkVariable<bool>(
false,
NetworkVariableReadPermission.Everyone,
NetworkVariableWritePermission.Server
);
/// <summary>
/// 사망 시 발생하는 이벤트 (매개변수: killerId)
/// </summary>
@@ -48,10 +60,20 @@ namespace Northbound
private UnitHealthBar _healthBar;
// 전장의 안개 가시성
private Renderer[] _renderers;
private float _visibilityTimer;
private bool _lastVisibleState = true;
private bool _initializedVisibility = false;
private ulong _localPlayerId = ulong.MaxValue;
public override void OnNetworkSpawn()
{
base.OnNetworkSpawn();
// 렌더러 캐시 (가시성 제어용)
_renderers = GetComponentsInChildren<Renderer>();
if (IsServer)
{
_currentHealth.Value = maxHealth;
@@ -66,6 +88,12 @@ namespace Northbound
{
CreateHealthBar();
}
// 클라이언트에서는 기본적으로 렌더러 비활성화
if (enableFogVisibility && IsClient)
{
SetRenderersEnabled(false);
}
}
public override void OnNetworkDespawn()
@@ -74,6 +102,146 @@ namespace Northbound
base.OnNetworkDespawn();
}
private void Update()
{
// 클라이언트에서만 가시성 체크 (호스트 포함)
if (enableFogVisibility && IsClient)
{
UpdateFogVisibility();
}
}
/// <summary>
/// 전장의 안개에 따른 가시성 업데이트 (클라이언트 전용)
/// </summary>
private void UpdateFogVisibility()
{
_visibilityTimer += Time.deltaTime;
if (_visibilityTimer < visibilityCheckInterval) return;
_visibilityTimer = 0f;
// 로컬 플레이어 ID 캐시
if (_localPlayerId == ulong.MaxValue)
{
_localPlayerId = GetLocalPlayerId();
if (_localPlayerId == ulong.MaxValue)
{
// 로컬 플레이어를 찾지 못함 - 기본적으로 숨김
if (_initializedVisibility) return;
_initializedVisibility = true;
SetRenderersEnabled(false);
return;
}
}
// FogOfWarSystem이 없으면 항상 보임
if (FogOfWarSystem.Instance == null)
{
if (_initializedVisibility) return;
_initializedVisibility = true;
SetRenderersEnabled(true); // FogOfWar가 없으면 항상 보임
return;
}
// FogOfWar가 비활성화되어 있으면 항상 보임
if (!FogOfWarSystem.Instance.gameObject.activeInHierarchy)
{
if (_initializedVisibility) return;
_initializedVisibility = true;
SetRenderersEnabled(true);
return;
}
// 현재 위치의 가시성 확인
FogOfWarState state = FogOfWarSystem.Instance.GetVisibilityState(_localPlayerId, transform.position);
bool shouldBeVisible = (state == FogOfWarState.Visible);
// 초기화되지 않은 경우 강제로 설정
if (!_initializedVisibility)
{
_initializedVisibility = true;
_lastVisibleState = shouldBeVisible;
SetRenderersEnabled(shouldBeVisible);
return;
}
// 상태가 변경된 경우에만 렌더러 업데이트
if (shouldBeVisible != _lastVisibleState)
{
_lastVisibleState = shouldBeVisible;
SetRenderersEnabled(shouldBeVisible);
}
}
/// <summary>
/// 로컬 플레이어의 실제 ID 가져오기
/// </summary>
private ulong GetLocalPlayerId()
{
if (NetworkManager.Singleton == null)
{
return ulong.MaxValue;
}
// 방법 1: SpawnManager에서 찾기
var localPlayer = NetworkManager.Singleton.SpawnManager.GetLocalPlayerObject();
// 방법 2: LocalClient에서 찾기
if (localPlayer == null && NetworkManager.Singleton.LocalClient != null)
{
localPlayer = NetworkManager.Singleton.LocalClient.PlayerObject;
}
// 방법 3: 직접 검색 (IsLocalPlayer인 플레이어 찾기)
if (localPlayer == null)
{
var allPlayers = FindObjectsByType<NetworkPlayerController>(FindObjectsSortMode.None);
foreach (var player in allPlayers)
{
if (player.IsLocalPlayer)
{
localPlayer = player.GetComponent<NetworkObject>();
break;
}
}
}
if (localPlayer == null)
{
return ulong.MaxValue;
}
var playerController = localPlayer.GetComponent<NetworkPlayerController>();
if (playerController == null)
{
return ulong.MaxValue;
}
return playerController.OwnerPlayerId;
}
/// <summary>
/// 모든 렌더러 활성화/비활성화
/// </summary>
private void SetRenderersEnabled(bool enabled)
{
if (_renderers == null) return;
foreach (var renderer in _renderers)
{
if (renderer != null)
{
renderer.enabled = enabled;
}
}
// 체력바도 함께 처리
if (_healthBar != null)
{
_healthBar.gameObject.SetActive(enabled);
}
}
private void OnHealthChanged(int previousValue, int newValue)
{
if (_healthBar != null)
@@ -106,6 +274,9 @@ namespace Northbound
if (!IsServer) return;
if (_currentHealth.Value <= 0) return;
// 무적 상태면 데미지 무시
if (_isInvulnerable.Value) return;
// 공격자의 팀 확인
if (NetworkManager.Singleton.SpawnManager.SpawnedObjects.TryGetValue(attackerId, out NetworkObject attackerObj))
{
@@ -207,6 +378,24 @@ namespace Northbound
#endregion
#region Invulnerability & Healing
public bool IsInvulnerable() => _isInvulnerable.Value;
public void SetInvulnerable(bool value)
{
if (!IsServer) return;
_isInvulnerable.Value = value;
}
public void HealToFull()
{
if (!IsServer) return;
_currentHealth.Value = maxHealth;
}
#endregion
private void OnDrawGizmosSelected()
{
#if UNITY_EDITOR

View File

@@ -31,7 +31,7 @@ namespace Northbound
private Color[] _colors;
private MeshRenderer _meshRenderer;
private float _updateTimer;
private ulong _localClientId;
private ulong _localPlayerId;
private bool _isInitialized;
private void Start()
@@ -49,14 +49,15 @@ namespace Northbound
{
if (_isInitialized) return;
_localClientId = NetworkManager.Singleton.LocalClientId;
var fogSystem = FogOfWarSystem.Instance;
if (fogSystem == null)
{
return;
}
// 로컬 플레이어의 실제 ID 가져오기 (없어도 텍스처는 생성)
_localPlayerId = GetLocalPlayerId();
// 텍스처 생성 (Bilinear filtering for smooth edges)
_fogTexture = new Texture2D(fogSystem.gridWidth, fogSystem.gridHeight)
{
@@ -105,11 +106,16 @@ namespace Northbound
if (!_isInitialized && NetworkManager.Singleton != null && NetworkManager.Singleton.IsClient)
{
Initialize();
return;
}
if (!_isInitialized) return;
// 로컬 플레이어 ID가 아직 없으면 다시 시도
if (_localPlayerId == ulong.MaxValue)
{
_localPlayerId = GetLocalPlayerId();
}
_updateTimer += Time.deltaTime;
if (_updateTimer >= updateInterval)
{
@@ -135,7 +141,12 @@ namespace Northbound
if (_meshRenderer != null)
_meshRenderer.enabled = true;
var fogData = fogSystem.GetPlayerFogData(_localClientId);
var fogData = fogSystem.GetPlayerFogData(_localPlayerId);
if (fogData == null)
{
// fogData가 null이면 아직 서버에서 데이터를 받지 못함
return;
}
for (int y = 0; y < fogSystem.gridHeight; y++)
{
@@ -164,6 +175,48 @@ namespace Northbound
_fogTexture.Apply();
}
/// <summary>
/// 로컬 플레이어의 실제 ID 가져오기
/// </summary>
private ulong GetLocalPlayerId()
{
if (NetworkManager.Singleton == null) return ulong.MaxValue;
// 방법 1: SpawnManager에서 찾기
NetworkObject localPlayer = null;
if (NetworkManager.Singleton.SpawnManager != null)
{
localPlayer = NetworkManager.Singleton.SpawnManager.GetLocalPlayerObject();
}
// 방법 2: LocalClient에서 찾기
if (localPlayer == null && NetworkManager.Singleton.LocalClient != null)
{
localPlayer = NetworkManager.Singleton.LocalClient.PlayerObject;
}
// 방법 3: 직접 검색 (IsLocalPlayer인 플레이어 찾기)
if (localPlayer == null)
{
var allPlayers = FindObjectsByType<NetworkPlayerController>(FindObjectsSortMode.None);
foreach (var player in allPlayers)
{
if (player.IsLocalPlayer)
{
localPlayer = player.GetComponent<NetworkObject>();
break;
}
}
}
if (localPlayer == null) return ulong.MaxValue;
var playerController = localPlayer.GetComponent<NetworkPlayerController>();
if (playerController == null) return ulong.MaxValue;
return playerController.OwnerPlayerId;
}
/// <summary>
/// Apply box blur smoothing to create smooth circular vision edges
/// </summary>

View File

@@ -219,7 +219,7 @@ namespace Northbound
[Header("Editor Settings")]
[Tooltip("Disable fog of war in Unity Editor for easier development")]
public bool disableInEditor = true;
public bool disableInEditor = false;
// 서버: 각 플레이어별 가시성 맵
private Dictionary<ulong, FogOfWarData> _serverFogData = new Dictionary<ulong, FogOfWarData>();
@@ -250,11 +250,18 @@ namespace Northbound
{
// Server: Register client connected callback to initialize fog data
NetworkManager.Singleton.OnClientConnectedCallback += OnClientConnected;
// 호스트 자신의 데이터도 초기화 (OnClientConnected가 호스트에게는 호출되지 않을 수 있음)
ulong hostClientId = NetworkManager.Singleton.LocalClientId;
if (!_serverFogData.ContainsKey(hostClientId))
{
_serverFogData[hostClientId] = new FogOfWarData(gridWidth, gridHeight);
}
}
if (IsClient && !IsServer)
// 클라이언트는 로컬 데이터 초기화 (호스트 포함)
if (IsClient)
{
// 클라이언트는 로컬 데이터 초기화
_localFogData = new FogOfWarData(gridWidth, gridHeight);
}
}
@@ -262,7 +269,7 @@ namespace Northbound
private void OnClientConnected(ulong clientId)
{
if (!IsServer) return;
// Ensure fog data exists for this client
if (!_serverFogData.ContainsKey(clientId))
{
@@ -300,7 +307,8 @@ namespace Northbound
if (!_visionProviders.Contains(provider))
{
_visionProviders.Add(provider);
// Debug.Log($"<color=cyan>[FogOfWar] Vision Provider 등록: {provider.GetTransform().name} (Owner: {provider.GetOwnerId()})</color>");
// 즉시 시야 업데이트 트리거
_updateTimer = updateInterval;
}
}
@@ -317,13 +325,18 @@ namespace Northbound
/// </summary>
public FogOfWarData GetPlayerFogData(ulong clientId)
{
// 클라이언트는 자신의 로컬 데이터 반환
if (IsClient && !IsServer)
// 클라이언트(호스트 포함)는 자신의 로컬 데이터 반환
// 서버에서 계산된 시야 데이터는 ClientRpc로 동기화됨
if (IsClient)
{
if (_localFogData == null)
{
_localFogData = new FogOfWarData(gridWidth, gridHeight);
}
return _localFogData;
}
// 서버는 해당 클라이언트의 데이터 반환
// 순수 서버(전용 서버)의 경우 서버 데이터 반환
if (!_serverFogData.ContainsKey(clientId))
{
_serverFogData[clientId] = new FogOfWarData(gridWidth, gridHeight);
@@ -342,12 +355,14 @@ namespace Northbound
fogData.ClearCurrentVision();
}
// 모든 시야 제공자의 시야 범위 계산
// 모든 시야 제공자의 시야 범위 계산 (팀 시야 공유)
foreach (var provider in _visionProviders)
{
if (provider == null || !provider.IsActive()) continue;
ulong ownerId = provider.GetOwnerId();
TeamType providerTeam = provider.GetTeam();
if (!_serverFogData.ContainsKey(ownerId))
{
_serverFogData[ownerId] = new FogOfWarData(gridWidth, gridHeight);
@@ -355,8 +370,9 @@ namespace Northbound
Vector3 position = provider.GetTransform().position;
float visionRange = provider.GetVisionRange();
RevealArea(ownerId, position, visionRange);
// 같은 팀의 모든 멤버에게 시야 공유
RevealAreaForTeam(providerTeam, position, visionRange);
}
// 각 클라이언트에게 시야 데이터 전송
@@ -365,11 +381,21 @@ namespace Northbound
ulong clientId = kvp.Key;
FogOfWarData fogData = kvp.Value;
// 해당 클라이언트가 여전히 연결되어 있는지 확인
// 호스트의 경우 ConnectedClients에 없을 수 있으므로 별도 체크
bool isHost = (clientId == NetworkManager.Singleton.LocalClientId);
bool isConnected = NetworkManager.Singleton.ConnectedClients.ContainsKey(clientId);
if (!isHost && !isConnected)
{
continue;
}
// 압축된 데이터로 전송
byte[] visibleData = fogData.GetVisibleData();
byte[] exploredData = fogData.GetExploredData();
SendFogDataToClientRpc(visibleData, exploredData,
SendFogDataToClientRpc(visibleData, exploredData,
new ClientRpcParams
{
Send = new ClientRpcSendParams
@@ -380,6 +406,47 @@ namespace Northbound
}
}
/// <summary>
/// 같은 팀의 모든 멤버에게 시야 공개
/// </summary>
private void RevealAreaForTeam(TeamType team, Vector3 worldPosition, float radius)
{
// 해당 팀의 모든 멤버 찾기
foreach (var kvp in _serverFogData)
{
ulong clientId = kvp.Key;
// 클라이언트의 팀 확인
if (GetClientTeam(clientId) == team)
{
RevealArea(clientId, worldPosition, radius);
}
}
}
/// <summary>
/// 클라이언트의 팀 가져오기
/// </summary>
private TeamType GetClientTeam(ulong clientId)
{
if (NetworkManager.Singleton == null) return TeamType.Neutral;
// 연결된 클라이언트에서 플레이어 오브젝트 찾기
if (NetworkManager.Singleton.SpawnManager.SpawnedObjects != null)
{
foreach (var netObj in NetworkManager.Singleton.SpawnManager.SpawnedObjects.Values)
{
var playerController = netObj.GetComponent<NetworkPlayerController>();
if (playerController != null && playerController.OwnerPlayerId == clientId)
{
return playerController.GetTeam();
}
}
}
return TeamType.Neutral;
}
/// <summary>
/// 클라이언트에게 안개 데이터 전송
/// </summary>

View File

@@ -10,6 +10,9 @@ namespace Northbound
public class FogOfWarVisibility : MonoBehaviour
{
[Header("Visibility Settings")]
[Tooltip("Always show this object regardless of fog state (for core, important structures)")]
public bool alwaysVisible = false;
[Tooltip("Show this object in explored areas (greyed out) or only when visible")]
public bool showInExploredAreas = false;
@@ -19,10 +22,13 @@ namespace Northbound
[Tooltip("Renderers to show/hide (auto-detected if empty)")]
public Renderer[] renderers;
[Header("Height-Based Distant Visibility")]
[Header("Extended Visibility")]
[Tooltip("Enable visibility from farther away based on object height")]
public bool enableDistantVisibility = true;
[Tooltip("Base visibility range (additional range beyond player vision)")]
public float baseVisibilityRange = 10f;
[Tooltip("Visibility range multiplier per unit of height (default: 2x vision per 1m height)")]
public float heightVisibilityMultiplier = 2.0f;
@@ -39,7 +45,7 @@ namespace Northbound
private Material[] _originalMaterials;
private bool _isVisible = false;
private float _updateTimer;
private ulong _localClientId;
private ulong _localPlayerId;
private bool _isInitialized = false;
private float _objectHeight = 0f;
@@ -76,8 +82,17 @@ namespace Northbound
// CRITICAL: Start hidden and stay hidden until fog system confirms visibility
// Force initial hide - don't use SetVisible because _isVisible defaults to false
// which would cause early return
_isVisible = true; // Set to true first so SetVisible(false) actually runs
SetVisible(false);
// 단, alwaysVisible이면 항상 보임
if (alwaysVisible)
{
_isVisible = false;
SetVisible(true);
}
else
{
_isVisible = true; // Set to true first so SetVisible(false) actually runs
SetVisible(false);
}
}
/// <summary>
@@ -130,7 +145,13 @@ namespace Northbound
{
if (NetworkManager.Singleton != null && NetworkManager.Singleton.IsClient)
{
_localClientId = NetworkManager.Singleton.LocalClientId;
_localPlayerId = GetLocalPlayerId();
if (_localPlayerId == ulong.MaxValue)
{
// Local player not found yet - stay hidden
SetVisible(false);
return;
}
_isInitialized = true;
// Force immediate visibility update on initialization
@@ -152,18 +173,67 @@ namespace Northbound
}
}
/// <summary>
/// 로컬 플레이어의 실제 ID 가져오기
/// </summary>
private ulong GetLocalPlayerId()
{
if (NetworkManager.Singleton == null) return ulong.MaxValue;
// 방법 1: SpawnManager에서 찾기
NetworkObject localPlayer = null;
if (NetworkManager.Singleton.SpawnManager != null)
{
localPlayer = NetworkManager.Singleton.SpawnManager.GetLocalPlayerObject();
}
// 방법 2: LocalClient에서 찾기
if (localPlayer == null && NetworkManager.Singleton.LocalClient != null)
{
localPlayer = NetworkManager.Singleton.LocalClient.PlayerObject;
}
// 방법 3: 직접 검색 (IsLocalPlayer인 플레이어 찾기)
if (localPlayer == null)
{
var allPlayers = FindObjectsByType<NetworkPlayerController>(FindObjectsSortMode.None);
foreach (var player in allPlayers)
{
if (player.IsLocalPlayer)
{
localPlayer = player.GetComponent<NetworkObject>();
break;
}
}
}
if (localPlayer == null) return ulong.MaxValue;
var playerController = localPlayer.GetComponent<NetworkPlayerController>();
if (playerController == null) return ulong.MaxValue;
return playerController.OwnerPlayerId;
}
private void UpdateVisibility()
{
var fogSystem = FogOfWarSystem.Instance;
if (fogSystem == null)
// 항상 보이는 객체는 fog 체크 안함
if (alwaysVisible)
{
// No fog system - stay hidden for safety
SetVisible(false);
SetVisible(true);
return;
}
var fogSystem = FogOfWarSystem.Instance;
if (fogSystem == null || !fogSystem.gameObject.activeInHierarchy)
{
// No fog system or disabled - always visible
SetVisible(true);
return;
}
// Wait for fog data to be initialized
var fogData = fogSystem.GetPlayerFogData(_localClientId);
var fogData = fogSystem.GetPlayerFogData(_localPlayerId);
if (fogData == null)
{
// Fog data not ready yet - stay hidden
@@ -171,7 +241,7 @@ namespace Northbound
return;
}
FogOfWarState fogState = fogSystem.GetVisibilityState(_localClientId, transform.position);
FogOfWarState fogState = fogSystem.GetVisibilityState(_localPlayerId, transform.position);
// Check for distant visibility based on height
bool isDistantVisible = false;
@@ -242,11 +312,14 @@ namespace Northbound
// Calculate extended visibility range based on height
// Taller objects can be seen from farther away
// Formula: Base range + (height - minHeight) * multiplier
float extendedRange = (_objectHeight - minHeightForDistantVisibility) * heightVisibilityMultiplier;
float extendedRange = 0f;
if (_objectHeight >= minHeightForDistantVisibility)
{
extendedRange = (_objectHeight - minHeightForDistantVisibility) * heightVisibilityMultiplier;
}
// Get player's vision range (assume average vision provider has ~15 unit range)
float baseVisionRange = 15f; // You can make this configurable
float totalRange = baseVisionRange + extendedRange;
// Total range = player vision + base visibility + height bonus
float totalRange = baseVisibilityRange + extendedRange;
return distanceToPlayer <= totalRange;
}

View File

@@ -26,5 +26,10 @@ namespace Northbound
/// 현재 활성화 상태인지
/// </summary>
bool IsActive();
/// <summary>
/// 소속 팀 (팀 시야 공유용)
/// </summary>
TeamType GetTeam();
}
}

View File

@@ -54,6 +54,10 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
private UnitHealthBar _healthBar;
private RespawnCountdownUI _respawnCountdownUI;
// 체력 자연 회복
private float _lastCombatTime;
private float _hpRegenAccumulator;
// 이 플레이어가 로컬 플레이어인지 확인
@@ -61,9 +65,15 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
public ulong OwnerPlayerId => _ownerPlayerId.Value;
// 중앙 집중식 입력 관리 - 다른 컴포넌트에서 참조
public PlayerInputActions InputActions => _inputActions;
// 소유자 변경 이벤트
public event Action<ulong> OnOwnerChanged;
// 입력 시스템 초기화 완료 이벤트
public event Action OnInputInitialized;
void Awake()
{
_controller = GetComponent<CharacterController>();
@@ -137,6 +147,9 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
_inputActions = new PlayerInputActions();
_inputActions.Enable();
// 입력 초기화 완료 이벤트 발생
OnInputInitialized?.Invoke();
}
/// <summary>
@@ -148,6 +161,28 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
_ownerPlayerId.Value = ownerPlayerId;
}
/// <summary>
/// 입력 강제 복구 (입력이 멈췄을 때 호출)
/// </summary>
public void ForceRecoverInput()
{
if (!IsLocalPlayer) return;
// InputActions가 없으면 초기화 시도
if (_inputActions == null)
{
TryInitializeLocalPlayer();
return;
}
// InputActions가 있지만 비활성화되어 있으면 활성화
if (!_inputActions.Player.enabled && _currentHealth.Value > 0)
{
_inputActions.Enable();
Debug.Log("[NetworkPlayerController] 입력 강제 복구 완료");
}
}
public override void OnNetworkDespawn()
{
_currentHealth.OnValueChanged -= OnHealthChanged;
@@ -161,13 +196,47 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
base.OnNetworkDespawn();
}
// 이동 동기화 설정
private float _moveSendInterval = 0.016f; // ~60Hz 전송
private float _moveSendTimer;
private Vector2 _lastSentMoveInput;
// 서버 측 이동 입력 저장
private Vector2 _serverMoveInput;
// 입력 복구 체크
private float _inputRecoveryCheckInterval = 1f; // 1초마다 체크
private float _inputRecoveryCheckTimer;
void Update()
{
// 서버에서 체력 자연 회복 처리
if (IsServer)
{
UpdateHealthRegeneration();
}
// 로컬 플레이어만 입력 처리
if (!IsLocalPlayer) return;
// 입력 시스템이 초기화되지 않았으면 스킵
if (_inputActions == null) return;
// 입력 시스템이 초기화되지 않았으면 초기화 시도
if (_inputActions == null)
{
TryInitializeLocalPlayer();
return;
}
// 주기적으로 입력 상태 확인 및 자동 복구 (살아있는데 입력이 비활성화된 경우)
_inputRecoveryCheckTimer += Time.deltaTime;
if (_inputRecoveryCheckTimer >= _inputRecoveryCheckInterval)
{
_inputRecoveryCheckTimer = 0f;
if (_currentHealth.Value > 0 && !_inputActions.Player.enabled)
{
Debug.LogWarning("[NetworkPlayerController] 입력이 비활성화되어 있음 - 자동 복구");
_inputActions.Enable();
}
}
// 죽었으면 이동 불가
if (_currentHealth.Value <= 0) return;
@@ -175,47 +244,65 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
// 액션/상호작용 중이면 이동 불가
var attackAction = GetComponent<AttackAction>();
var playerInteraction = GetComponent<PlayerInteraction>();
bool isActionBlocked = (attackAction != null && attackAction.IsAttacking) ||
(playerInteraction != null && playerInteraction.IsInteracting);
if (isActionBlocked)
if (isActionBlocked)
{
// 서버에 이동 중지 알림 (애니메이션 포함)
MoveServerRpc(Vector2.zero);
// 서버에 이동 중지 알림
if (_lastSentMoveInput != Vector2.zero)
{
_lastSentMoveInput = Vector2.zero;
MoveServerRpc(Vector2.zero);
}
return;
}
_moveInput = _inputActions.Player.Move.ReadValue<Vector2>();
// 서버에 이동 요청 전송 (애니메이션 포함)
MoveServerRpc(_moveInput);
// 일정 간격으로만 서버에 전송 (네트워크 부하 감소)
_moveSendTimer += Time.deltaTime;
if (_moveSendTimer >= _moveSendInterval || _moveInput != _lastSentMoveInput)
{
_moveSendTimer = 0f;
_lastSentMoveInput = _moveInput;
MoveServerRpc(_moveInput);
}
}
void FixedUpdate()
{
// 서버에서만 물리 이동 처리
if (!IsServer) return;
if (_currentHealth.Value <= 0) return;
Vector3 move = new Vector3(_serverMoveInput.x, 0, _serverMoveInput.y).normalized;
if (move.magnitude >= 0.1f)
{
Quaternion targetRotation = Quaternion.LookRotation(move);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotationSpeed * Time.fixedDeltaTime);
if (_controller != null)
{
float moveSpeed = _playerStats?.GetMoveSpeed() ?? 5f;
_controller.Move(move * moveSpeed * Time.fixedDeltaTime);
}
}
// 애니메이션 업데이트
if (_networkAnimator != null)
{
_networkAnimator.Animator.SetFloat("MoveSpeed", move.magnitude);
}
}
[Rpc(SendTo.Server)]
private void MoveServerRpc(Vector2 moveInput)
{
// 죽었으면 이동 불가
if (_currentHealth.Value <= 0) return;
Vector3 move = new Vector3(moveInput.x, 0, moveInput.y).normalized;
// NetworkAnimator로 애니메이션 동기화
if (_networkAnimator != null)
{
_networkAnimator.Animator.SetFloat("MoveSpeed", move.magnitude);
}
if (move.magnitude >= 0.1f)
{
Quaternion targetRotation = Quaternion.LookRotation(move);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);
if (_controller != null)
{
_controller.Move(move * (_playerStats?.GetMoveSpeed() ?? 5f) * Time.deltaTime);
}
}
// 서버에 입력만 저장, 실제 이동은 FixedUpdate에서 처리
_serverMoveInput = moveInput;
}
#region ITeamMember Implementation
@@ -257,6 +344,9 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
int actualDamage = Mathf.Min(damage, _currentHealth.Value);
_currentHealth.Value -= actualDamage;
// 전투 상태 기록 (회복 방지)
MarkInCombat();
// 데미지 이펙트
ShowDamageEffectClientRpc();
@@ -478,6 +568,62 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
public int GetCurrentHealth() => _currentHealth.Value;
/// <summary>
/// 전투 상태 기록 (데미지를 받거나 입힐 때 호출)
/// </summary>
public void MarkInCombat()
{
_lastCombatTime = Time.time;
}
/// <summary>
/// 현재 전투 중인지 확인 (회복 대기 시간이 지났는지)
/// </summary>
public bool IsInCombat()
{
if (_playerStats == null) return false;
float regenDelay = _playerStats.GetHpRegenDelay();
return (Time.time - _lastCombatTime) < regenDelay;
}
/// <summary>
/// 서버에서 체력 자연 회복 처리
/// </summary>
private void UpdateHealthRegeneration()
{
// 죽었으면 회복하지 않음
if (_currentHealth.Value <= 0) return;
// 이미 최대 체력이면 회복하지 않음
int maxHealth = GetMaxHealth();
if (_currentHealth.Value >= maxHealth)
{
_hpRegenAccumulator = 0f;
return;
}
// 전투 중이면 회복하지 않음
if (IsInCombat()) return;
// 회복량 계산
float hpRegen = _playerStats?.GetHpRegen() ?? 0f;
if (hpRegen <= 0f) return;
// 프레임당 회복량 누적
_hpRegenAccumulator += hpRegen * Time.deltaTime;
// 1 이상 누적되면 정수만큼 회복
if (_hpRegenAccumulator >= 1f)
{
int healAmount = Mathf.FloorToInt(_hpRegenAccumulator);
_hpRegenAccumulator -= healAmount;
// 실제 회복
int actualHeal = Mathf.Min(healAmount, maxHealth - _currentHealth.Value);
_currentHealth.Value += actualHeal;
}
}
public int GetMaxHealth() => _playerStats?.GetMaxHp() ?? 100;
public float GetHealthPercentage()

View File

@@ -17,11 +17,11 @@ namespace Northbound
[Header("Animation")]
public bool playAnimations = true;
private PlayerInputActions _inputActions;
private Dictionary<string, IAction> _actions = new Dictionary<string, IAction>();
private Animator _animator;
private NetworkAnimator _networkAnimator;
private NetworkPlayerController _networkPlayerController;
private bool _isInputInitialized = false;
// 로컬 플레이어인지 확인
private bool IsLocalPlayer => _networkPlayerController != null && _networkPlayerController.IsLocalPlayer;
@@ -49,12 +49,19 @@ namespace Northbound
if (_networkPlayerController != null)
{
_networkPlayerController.OnOwnerChanged += OnOwnerPlayerIdChanged;
_networkPlayerController.OnInputInitialized += TryInitializeInput;
}
// 이미 로컬 플레이어면 입력 초기화
TryInitializeInput();
}
private void Start()
{
// Start에서 다시 한번 확인 (이벤트 타이밍 문제 해결)
TryInitializeInput();
}
private void OnOwnerPlayerIdChanged(ulong newOwnerId)
{
TryInitializeInput();
@@ -63,11 +70,11 @@ namespace Northbound
private void TryInitializeInput()
{
if (!IsLocalPlayer) return;
if (_inputActions != null) return;
if (_isInputInitialized) return; // 이미 초기화됨
if (_networkPlayerController.InputActions == null) return; // 아직 InputActions가 없음
_inputActions = new PlayerInputActions();
_inputActions.Player.Attack.performed += OnAttack;
_inputActions.Enable();
_isInputInitialized = true;
_networkPlayerController.InputActions.Player.Attack.performed += OnAttack;
}
public override void OnNetworkDespawn()
@@ -75,13 +82,13 @@ namespace Northbound
if (_networkPlayerController != null)
{
_networkPlayerController.OnOwnerChanged -= OnOwnerPlayerIdChanged;
}
_networkPlayerController.OnInputInitialized -= TryInitializeInput;
if (_inputActions != null)
{
_inputActions.Player.Attack.performed -= OnAttack;
_inputActions.Disable();
_inputActions.Dispose();
// 입력 이벤트 해제
if (_networkPlayerController.InputActions != null)
{
_networkPlayerController.InputActions.Player.Attack.performed -= OnAttack;
}
}
}
@@ -126,11 +133,7 @@ namespace Northbound
override public void OnDestroy()
{
if (_inputActions != null)
{
_inputActions.Dispose();
}
// 입력 정리는 NetworkPlayerController에서 담당
base.OnDestroy();
}
}

View File

@@ -1,40 +0,0 @@
using Northbound;
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
public class PlayerController : MonoBehaviour
{
[Header("Movement Settings")]
[SerializeField] private float moveSpeed = 5f;
private Rigidbody rb;
private Vector3 moveDirection;
private PlayerInteraction playerInteraction;
void Start()
{
rb = GetComponent<Rigidbody>();
rb.constraints = RigidbodyConstraints.FreezeRotation;
playerInteraction = GetComponent<PlayerInteraction>();
}
void Update()
{
if (playerInteraction != null && playerInteraction.IsInteracting)
return;
float horizontal = Input.GetAxisRaw("Horizontal");
float vertical = Input.GetAxisRaw("Vertical");
moveDirection = new Vector3(horizontal, 0f, vertical).normalized;
}
void FixedUpdate()
{
rb.linearVelocity = new Vector3(
moveDirection.x * moveSpeed,
rb.linearVelocity.y,
moveDirection.z * moveSpeed
);
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 7a3e5b8c4d2f1a9e6b0c3d7e8f1a2b3c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -33,7 +33,6 @@ namespace Northbound
[Header("Worker")]
public Worker assignedWorker;
private PlayerInputActions _inputActions;
private IInteractable _currentInteractable;
private IInteractable _unavailableInteractable;
private Camera _mainCamera;
@@ -48,6 +47,7 @@ namespace Northbound
private NetworkPlayerController _networkPlayerController;
private PlayerStats _playerStats;
private bool _isInputInitialized = false;
public bool IsInteracting => _isInteracting;
public float WorkPower => _playerStats?.GetManpower() ?? 10f;
@@ -69,7 +69,7 @@ namespace Northbound
{
_animator = GetComponent<Animator>();
_equipmentSocket = GetComponent<EquipmentSocket>();
if (rayOrigin == null)
rayOrigin = transform;
@@ -77,12 +77,19 @@ namespace Northbound
if (_networkPlayerController != null)
{
_networkPlayerController.OnOwnerChanged += OnOwnerPlayerIdChanged;
_networkPlayerController.OnInputInitialized += TryInitializeInput;
}
// 이미 로컬 플레이어면 입력 초기화
TryInitializeInput();
}
private void Start()
{
// Start에서 다시 한번 확인 (이벤트 타이밍 문제 해결)
TryInitializeInput();
}
private void OnOwnerPlayerIdChanged(ulong newOwnerId)
{
TryInitializeInput();
@@ -91,12 +98,12 @@ namespace Northbound
private void TryInitializeInput()
{
if (!IsLocalPlayer) return;
if (_inputActions != null) return;
if (_isInputInitialized) return; // 이미 초기화됨
if (_networkPlayerController.InputActions == null) return; // 아직 InputActions가 없음
_isInputInitialized = true;
_mainCamera = Camera.main;
_inputActions = new PlayerInputActions();
_inputActions.Player.Interact.performed += OnInteract;
_inputActions.Enable();
_networkPlayerController.InputActions.Player.Interact.performed += OnInteract;
}
public override void OnNetworkDespawn()
@@ -104,13 +111,13 @@ namespace Northbound
if (_networkPlayerController != null)
{
_networkPlayerController.OnOwnerChanged -= OnOwnerPlayerIdChanged;
}
_networkPlayerController.OnInputInitialized -= TryInitializeInput;
if (_inputActions != null)
{
_inputActions.Player.Interact.performed -= OnInteract;
_inputActions.Disable();
_inputActions.Dispose();
// 입력 이벤트 해제
if (_networkPlayerController.InputActions != null)
{
_networkPlayerController.InputActions.Player.Interact.performed -= OnInteract;
}
}
}
@@ -402,10 +409,7 @@ namespace Northbound
public override void OnDestroy()
{
if (_inputActions != null)
{
_inputActions.Dispose();
}
// 입력 정리는 NetworkPlayerController에서 담당
}
}
}

View File

@@ -19,6 +19,12 @@ namespace Northbound
[SerializeField] private float baseSight = 10f;
[SerializeField] private float baseAttackRange = 2f;
[Header("Health Regeneration")]
[Tooltip("초당 체력 회복량")]
[SerializeField] private float baseHpRegen = 2f;
[Tooltip("전투 종료 후 회복 시작까지의 대기 시간 (초)")]
[SerializeField] private float baseHpRegenDelay = 5f;
private PlayerUpgradeManager _upgradeManager;
private void Awake()
@@ -129,6 +135,25 @@ namespace Northbound
return baseAttackRange + bonus;
}
/// <summary>
/// 초당 체력 회복량 반환
/// </summary>
public float GetHpRegen()
{
float bonus = CalculateStatBonus("player_hp_regen");
return baseHpRegen + bonus;
}
/// <summary>
/// 전투 종료 후 회복 시작 대기 시간 반환 (초)
/// </summary>
public float GetHpRegenDelay()
{
float bonus = CalculateStatBonus("player_hp_regen_delay");
// delay는 보통 줄어드는 것이 좋으므로 음수 bonus는 감소로 처리
return Mathf.Max(1f, baseHpRegenDelay + bonus);
}
#region Base Stat Setters (/)
public void SetBaseMaxHp(int value) => baseMaxHp = value;
@@ -138,6 +163,8 @@ namespace Northbound
public void SetBaseMoveSpeed(float value) => baseMoveSpeed = value;
public void SetBaseSight(float value) => baseSight = value;
public void SetBaseAttackRange(float value) => baseAttackRange = value;
public void SetBaseHpRegen(float value) => baseHpRegen = value;
public void SetBaseHpRegenDelay(float value) => baseHpRegenDelay = value;
#endregion
@@ -153,7 +180,9 @@ namespace Northbound
$" Manpower: {GetManpower()} (기본: {baseManpower})\n" +
$" Move Speed: {GetMoveSpeed()} (기본: {baseMoveSpeed})\n" +
$" Sight: {GetSight()} (기본: {baseSight})\n" +
$" Attack Range: {GetAttackRange()} (기본: {baseAttackRange})");
$" Attack Range: {GetAttackRange()} (기본: {baseAttackRange})\n" +
$" HP Regen: {GetHpRegen():F1}/s (기본: {baseHpRegen})\n" +
$" HP Regen Delay: {GetHpRegenDelay():F1}s (기본: {baseHpRegenDelay})");
if (_upgradeManager != null)
{

View File

@@ -9,10 +9,12 @@ namespace Northbound
public class PlayerVisionProvider : NetworkBehaviour, IVisionProvider
{
private PlayerStats _playerStats;
private NetworkPlayerController _playerController;
public override void OnNetworkSpawn()
{
_playerStats = GetComponent<PlayerStats>();
_playerController = GetComponent<NetworkPlayerController>();
if (IsServer)
{
FogOfWarSystem.Instance?.RegisterVisionProvider(this);
@@ -27,10 +29,13 @@ namespace Northbound
}
}
public ulong GetOwnerId() => OwnerClientId;
// NetworkPlayerController.OwnerPlayerId 사용 (실제 플레이어 ID)
// OwnerClientId는 서버 소유권이므로 잘못된 ID 반환
public ulong GetOwnerId() => _playerController?.OwnerPlayerId ?? OwnerClientId;
public float GetVisionRange() => _playerStats?.GetSight() ?? 10f;
public Transform GetTransform() => transform;
public bool IsActive() => IsSpawned;
public TeamType GetTeam() => _playerController?.GetTeam() ?? TeamType.Player;
private void OnDrawGizmosSelected()
{

View File

@@ -28,7 +28,74 @@ namespace Northbound
public GameObject pickupEffectPrefab;
public Transform effectSpawnPoint;
// 가시성 동기화 (기본적으로 숨김)
private NetworkVariable<bool> _isVisible = new NetworkVariable<bool>(
false,
NetworkVariableReadPermission.Everyone,
NetworkVariableWritePermission.Server
);
private bool _isCollected = false;
private Renderer[] _renderers;
private Collider[] _colliders;
public override void OnNetworkSpawn()
{
base.OnNetworkSpawn();
// 렌더러와 콜라이더 캐시
_renderers = GetComponentsInChildren<Renderer>();
_colliders = GetComponentsInChildren<Collider>();
// 초기 가시성 적용
UpdateVisibility(_isVisible.Value);
// 가시성 변경 이벤트 구독
_isVisible.OnValueChanged += OnVisibilityChanged;
}
public override void OnNetworkDespawn()
{
_isVisible.OnValueChanged -= OnVisibilityChanged;
base.OnNetworkDespawn();
}
private void OnVisibilityChanged(bool previousValue, bool newValue)
{
UpdateVisibility(newValue);
}
private void UpdateVisibility(bool visible)
{
if (_renderers != null)
{
foreach (var renderer in _renderers)
{
if (renderer != null)
renderer.enabled = visible;
}
}
if (_colliders != null)
{
foreach (var collider in _colliders)
{
if (collider != null)
collider.enabled = visible;
}
}
}
/// <summary>
/// 가시성 설정 (서버만 호출 가능)
/// </summary>
public void SetVisible(bool visible)
{
if (IsServer)
{
_isVisible.Value = visible;
}
}
public bool CanInteract(ulong playerId)
{

View File

@@ -0,0 +1,391 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using Unity.Netcode;
namespace Northbound
{
/// <summary>
/// 팀원 체력 UI 관리
/// Slot 1: 로컬 플레이어 (본인)
/// Slot 2~4: 다른 플레이어 (플레이어 ID 순)
/// </summary>
public class TeamHealthUI : MonoBehaviour
{
[Header("Slot References (자동 할당됨)")]
[SerializeField] private TeamCardSlot slot1; // 로컬 플레이어 (본인)
[SerializeField] private TeamCardSlot slot2; // 다른 플레이어 1
[SerializeField] private TeamCardSlot slot3; // 다른 플레이어 2
[SerializeField] private TeamCardSlot slot4; // 다른 플레이어 3
private Dictionary<ulong, NetworkPlayerController> _playerControllers = new Dictionary<ulong, NetworkPlayerController>();
private Dictionary<ulong, TeamCardSlot> _playerSlotMapping = new Dictionary<ulong, TeamCardSlot>();
private ulong _localPlayerId = ulong.MaxValue;
private void Awake()
{
// 슬롯 초기화
InitializeSlots();
}
private void Start()
{
// 네트워크 이벤트 구독
if (NetworkManager.Singleton != null)
{
NetworkManager.Singleton.OnClientConnectedCallback += OnClientConnected;
NetworkManager.Singleton.OnClientDisconnectCallback += OnClientDisconnect;
}
// 이미 연결된 플레이어들 처리
RefreshAllPlayers();
}
private void OnDestroy()
{
// 이벤트 구독 해제
if (NetworkManager.Singleton != null)
{
NetworkManager.Singleton.OnClientConnectedCallback -= OnClientConnected;
NetworkManager.Singleton.OnClientDisconnectCallback -= OnClientDisconnect;
}
// 모든 플레이어 체력 변경 이벤트 구독 해제
foreach (var kvp in _playerControllers)
{
if (kvp.Value != null)
{
kvp.Value.OnOwnerChanged -= OnPlayerOwnerChanged;
}
}
}
private void InitializeSlots()
{
// 슬롯 자동 할당 - 이름으로 찾기
if (slot1 == null) slot1 = FindSlotByName("Slot_1");
if (slot2 == null) slot2 = FindSlotByName("Slot_2");
if (slot3 == null) slot3 = FindSlotByName("Slot_3");
if (slot4 == null) slot4 = FindSlotByName("Slot_4");
// 모든 슬롯 초기화 (비어있음)
slot1?.Clear();
slot2?.Clear();
slot3?.Clear();
slot4?.Clear();
}
/// <summary>
/// 이름으로 슬롯 찾기 (자식의 자식 프리팹까지 검색)
/// </summary>
private TeamCardSlot FindSlotByName(string slotName)
{
// 직접 자식에서 찾기
Transform slotTransform = transform.Find(slotName);
if (slotTransform == null) return null;
// 자식 프리팹에서 TeamCardSlot 찾기 또는 생성
TeamCardSlot slot = slotTransform.GetComponentInChildren<TeamCardSlot>(true);
if (slot == null)
{
// TeamCardSlot 컴포넌트를 자식 프리팹의 루트에 추가
// 프리팹 인스턴스의 첫 번째 자식이 실제 카드 프리팹
if (slotTransform.childCount > 0)
{
GameObject cardObj = slotTransform.GetChild(0).gameObject;
slot = cardObj.AddComponent<TeamCardSlot>();
}
else
{
// 자식이 없으면 슬롯 자체에 추가
slot = slotTransform.gameObject.AddComponent<TeamCardSlot>();
}
}
return slot;
}
private void OnClientConnected(ulong clientId)
{
// 약간의 딜레이 후 플레이어 컨트롤러가 생성될 때까지 대기
Invoke(nameof(RefreshAllPlayers), 0.5f);
}
private void OnClientDisconnect(ulong clientId)
{
// 플레이어 제거
RemovePlayer(clientId);
}
private void RefreshAllPlayers()
{
// 로컬 플레이어 ID 확인
if (NetworkManager.Singleton != null)
{
_localPlayerId = NetworkManager.Singleton.LocalClientId;
}
// 모든 NetworkPlayerController 찾기
var allPlayers = FindObjectsByType<NetworkPlayerController>(FindObjectsSortMode.None);
// 기존 매핑 클리어
_playerControllers.Clear();
// 플레이어 등록
foreach (var player in allPlayers)
{
ulong playerId = player.OwnerPlayerId;
if (playerId != ulong.MaxValue)
{
_playerControllers[playerId] = player;
player.OnOwnerChanged -= OnPlayerOwnerChanged;
player.OnOwnerChanged += OnPlayerOwnerChanged;
}
}
// UI 업데이트
UpdateAllSlots();
}
private void OnPlayerOwnerChanged(ulong newOwnerId)
{
// 플레이어 소유자 변경 시 갱신
Invoke(nameof(RefreshAllPlayers), 0.1f);
}
private void UpdateAllSlots()
{
// 기존 매핑 클리어
_playerSlotMapping.Clear();
slot1?.Clear();
slot2?.Clear();
slot3?.Clear();
slot4?.Clear();
// 로컬 플레이어를 Slot 1에 배치
if (_playerControllers.TryGetValue(_localPlayerId, out var localPlayer))
{
slot1?.SetPlayer(localPlayer, true);
_playerSlotMapping[_localPlayerId] = slot1;
}
// 다른 플레이어들을 ID 순으로 Slot 2~4에 배치
var otherPlayers = new List<KeyValuePair<ulong, NetworkPlayerController>>();
foreach (var kvp in _playerControllers)
{
if (kvp.Key != _localPlayerId)
{
otherPlayers.Add(kvp);
}
}
// ID 순으로 정렬
otherPlayers.Sort((a, b) => a.Key.CompareTo(b.Key));
// 슬롯에 배치
var slots = new[] { slot2, slot3, slot4 };
for (int i = 0; i < otherPlayers.Count && i < slots.Length; i++)
{
var player = otherPlayers[i];
slots[i]?.SetPlayer(player.Value, false);
_playerSlotMapping[player.Key] = slots[i];
}
}
private void RemovePlayer(ulong playerId)
{
if (_playerControllers.TryGetValue(playerId, out var player))
{
player.OnOwnerChanged -= OnPlayerOwnerChanged;
_playerControllers.Remove(playerId);
}
if (_playerSlotMapping.TryGetValue(playerId, out var slot))
{
slot?.Clear();
_playerSlotMapping.Remove(playerId);
}
// 슬롯 재배치
UpdateAllSlots();
}
}
/// <summary>
/// 개별 팀 카드 슬롯
/// TeamCard_Large 또는 TeamCard_Small 프리팹에 붙여서 사용
/// </summary>
public class TeamCardSlot : MonoBehaviour
{
[Header("UI References (자동 할당됨)")]
[SerializeField] private TextMeshProUGUI _playerNameText;
[SerializeField] private Image _hpBarFill;
[SerializeField] private TextMeshProUGUI _hpText;
private NetworkPlayerController _player;
private bool _isLocalPlayer;
private int _lastHealth = -1;
private int _lastMaxHealth = -1;
private void Awake()
{
// 자동으로 UI 요소 찾기
FindUIElements();
}
private void FindUIElements()
{
// PlayerNameText 찾기 - 이름으로 정확히 찾기
if (_playerNameText == null)
{
Transform nameText = FindDeepChild(transform, "PlayerNameText");
if (nameText != null)
{
_playerNameText = nameText.GetComponent<TextMeshProUGUI>();
}
}
// HPBarFill 찾기
if (_hpBarFill == null)
{
Transform hpFill = FindDeepChild(transform, "HPBarFill");
if (hpFill != null)
{
_hpBarFill = hpFill.GetComponent<Image>();
}
}
// HPText 찾기
if (_hpText == null)
{
Transform hpText = FindDeepChild(transform, "HPText");
if (hpText != null)
{
_hpText = hpText.GetComponent<TextMeshProUGUI>();
}
}
}
/// <summary>
/// 깊이 우선 탐색으로 자식 찾기
/// </summary>
private Transform FindDeepChild(Transform parent, string name)
{
// 직접 자식에서 찾기
Transform found = parent.Find(name);
if (found != null) return found;
// 재귀적으로 자식의 자식에서 찾기
for (int i = 0; i < parent.childCount; i++)
{
found = FindDeepChild(parent.GetChild(i), name);
if (found != null) return found;
}
return null;
}
public void SetPlayer(NetworkPlayerController player, bool isLocalPlayer)
{
_player = player;
_isLocalPlayer = isLocalPlayer;
_lastHealth = -1; // 강제 업데이트를 위해 리셋
_lastMaxHealth = -1;
if (player == null)
{
Clear();
return;
}
// UI 요소가 없으면 다시 찾기
FindUIElements();
// 플레이어 이름 설정
if (_playerNameText != null)
{
string playerName = $"Player {player.OwnerPlayerId + 1}";
if (isLocalPlayer)
{
playerName += " (YOU)";
}
_playerNameText.text = playerName;
}
// 초기 체력 업데이트
UpdateHealth();
// 활성화
gameObject.SetActive(true);
}
public void Clear()
{
_player = null;
_lastHealth = -1;
_lastMaxHealth = -1;
if (_playerNameText != null)
{
_playerNameText.text = "Waiting...";
}
if (_hpBarFill != null)
{
_hpBarFill.fillAmount = 0f;
}
if (_hpText != null)
{
_hpText.text = "--- / ---";
}
}
private void LateUpdate()
{
// 체력 업데이트 (변경 시에만)
if (_player != null)
{
int currentHp = _player.GetCurrentHealth();
int maxHp = _player.GetMaxHealth();
// 체력이나 최대 체력이 변경된 경우에만 UI 업데이트
if (currentHp != _lastHealth || maxHp != _lastMaxHealth)
{
UpdateHealth();
_lastHealth = currentHp;
_lastMaxHealth = maxHp;
}
}
}
private void UpdateHealth()
{
if (_player == null) return;
int currentHp = _player.GetCurrentHealth();
int maxHp = _player.GetMaxHealth();
float hpPercent = maxHp > 0 ? (float)currentHp / maxHp : 0f;
if (_hpBarFill != null)
{
_hpBarFill.fillAmount = hpPercent;
}
if (_hpText != null)
{
_hpText.text = $"{currentHp} / {maxHp}";
}
}
/// <summary>
/// 에디터에서 UI 요소 자동 할당
/// </summary>
[ContextMenu("Auto Find UI Elements")]
private void AutoFindUIElements()
{
FindUIElements();
Debug.Log($"[TeamCardSlot] UI Elements Found - Name: {_playerNameText != null}, HPFill: {_hpBarFill != null}, HPText: {_hpText != null}");
}
}
}

View File

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

View File

@@ -3,8 +3,16 @@ using UnityEngine;
namespace Northbound
{
public class WorkerSpawner : NetworkBehaviour, IInteractable
public class WorkerSpawner : NetworkBehaviour, IInteractable, IVisionProvider, ITeamMember
{
[Header("Vision Settings")]
[Tooltip("워커 홀이 제공하는 시야 범위")]
public float visionRange = 10f;
[Header("Team")]
[Tooltip("건물의 팀")]
public TeamType initialTeam = TeamType.Player;
[Header("Spawner Settings")]
public GameObject workerPrefab;
public Transform spawnPoint;
@@ -34,11 +42,24 @@ namespace Northbound
{
base.OnNetworkSpawn();
_workerCount.OnValueChanged += OnWorkerCountChanged;
if (IsServer)
{
// 시야 제공자로 등록
FogOfWarSystem.Instance?.RegisterVisionProvider(this);
}
}
public override void OnNetworkDespawn()
{
_workerCount.OnValueChanged -= OnWorkerCountChanged;
if (IsServer)
{
// 시야 제공자 등록 해제
FogOfWarSystem.Instance?.UnregisterVisionProvider(this);
}
base.OnNetworkDespawn();
}
@@ -240,9 +261,37 @@ namespace Northbound
Vector3 spawnCenter = spawnPoint != null ? spawnPoint.position : transform.position;
Gizmos.DrawWireSphere(spawnCenter, spawnRadius);
UnityEditor.Handles.Label(spawnCenter + Vector3.up * 2f,
UnityEditor.Handles.Label(spawnCenter + Vector3.up * 2f,
$"Worker Spawner\nWorkers: {_workerCount.Value}/{maxWorkers}");
#endif
}
#region IVisionProvider Implementation
public ulong GetOwnerId() => 0; // 워커 홀은 모든 플레이어에게 시야 제공
public float GetVisionRange() => visionRange;
Transform IVisionProvider.GetTransform() => transform;
public bool IsActive() => IsSpawned;
TeamType IVisionProvider.GetTeam() => initialTeam;
#endregion
#region ITeamMember Implementation
public TeamType GetTeam() => initialTeam;
public bool IsDead() => false; // 워커 홀은 파괴되지 않음
public void SetTeam(TeamType team)
{
// 워커 홀의 팀은 변경할 수 없음
Debug.LogWarning("[WorkerSpawner] 워커 홀의 팀은 변경할 수 없습니다.");
}
#endregion
}
}

8
Assets/UI/TeamCard.meta Normal file
View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,143 @@
fileFormatVersion: 2
guid: 6c97158fbcfbbf242ae9b266c285261e
TextureImporter:
internalIDToNameTable:
- first:
213: 8957537473066040245
second: HPBar_green_0
externalObjects: {}
serializedVersion: 13
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
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
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
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: HPBar_green_0
rect:
serializedVersion: 2
x: 0
y: 0
width: 41
height: 41
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 5bbf9586fd09f4c70800000000000000
internalID: 8957537473066040245
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
HPBar_green_0: 8957537473066040245
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,990 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &900691420667464671
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3909561321110962711}
- component: {fileID: 4562475140131647601}
- component: {fileID: 3641503078295860797}
m_Layer: 5
m_Name: Background
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3909561321110962711
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 900691420667464671}
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: 1671567835747073886}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 450, y: 130}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4562475140131647601
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 900691420667464671}
m_CullTransparentMesh: 1
--- !u!114 &3641503078295860797
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 900691420667464671}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 0, g: 0, b: 0, a: 0.5254902}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
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!1 &1397827455277597976
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1909221061409215995}
- component: {fileID: 4115447053854238644}
m_Layer: 5
m_Name: Row_HP
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1909221061409215995
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1397827455277597976}
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: 3623982467735649376}
- {fileID: 6479671700234456601}
m_Father: {fileID: 1848615146409787736}
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: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &4115447053854238644
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1397827455277597976}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: -1
m_PreferredHeight: -1
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &1524661661008175776
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3623982467735649376}
m_Layer: 5
m_Name: HPBarRoot
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3623982467735649376
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1524661661008175776}
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: 4526962547313490101}
- {fileID: 6546054952217937965}
m_Father: {fileID: 1909221061409215995}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 320, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &1887481747058627097
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1671567835747073886}
m_Layer: 5
m_Name: TeamCard_Large
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1671567835747073886
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1887481747058627097}
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: 3909561321110962711}
- {fileID: 1511118888812183331}
- {fileID: 6493168435657054733}
m_Father: {fileID: 0}
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!1 &2263815619202694770
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8270131593793046794}
- component: {fileID: 6874510865284232069}
- component: {fileID: 5228251429256210363}
m_Layer: 5
m_Name: PlayerNameText
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8270131593793046794
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2263815619202694770}
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: 4715303447718307229}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6874510865284232069
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2263815619202694770}
m_CullTransparentMesh: 1
--- !u!114 &5228251429256210363
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2263815619202694770}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: Player 1 (YOU)
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: cac3ad1b064570d46abc7f664d02d23e, type: 2}
m_sharedMaterial: {fileID: -8208170789151758778, guid: cac3ad1b064570d46abc7f664d02d23e, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 36
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &2332988383367038871
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1511118888812183331}
- component: {fileID: 2760543776975673489}
m_Layer: 5
m_Name: Content
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1511118888812183331
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2332988383367038871}
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: 2795229366996019796}
- {fileID: 1848615146409787736}
m_Father: {fileID: 1671567835747073886}
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: 30, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &2760543776975673489
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2332988383367038871}
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: 10
m_Right: 10
m_Top: 10
m_Bottom: 10
m_ChildAlignment: 3
m_Spacing: 10
m_ChildForceExpandWidth: 0
m_ChildForceExpandHeight: 0
m_ChildControlWidth: 1
m_ChildControlHeight: 1
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!1 &4445285748216119847
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2795229366996019796}
- component: {fileID: 1593405979637777621}
- component: {fileID: 2612123753227482464}
- component: {fileID: 8985400032926287030}
m_Layer: 5
m_Name: PortraitFrame
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2795229366996019796
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4445285748216119847}
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: 1511118888812183331}
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: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1593405979637777621
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4445285748216119847}
m_CullTransparentMesh: 1
--- !u!114 &2612123753227482464
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4445285748216119847}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &8985400032926287030
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4445285748216119847}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: 100
m_MinHeight: 100
m_PreferredWidth: 100
m_PreferredHeight: 100
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &4855823295685342202
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4715303447718307229}
- component: {fileID: 1772785610992859156}
m_Layer: 5
m_Name: Row_Name
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4715303447718307229
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4855823295685342202}
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: 8270131593793046794}
m_Father: {fileID: 1848615146409787736}
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: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1772785610992859156
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4855823295685342202}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: 320
m_MinHeight: 50
m_PreferredWidth: 320
m_PreferredHeight: 50
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &5635920112903963799
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6546054952217937965}
- component: {fileID: 1411402556195867580}
- component: {fileID: 392033387581393578}
m_Layer: 5
m_Name: HPBarFill
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6546054952217937965
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5635920112903963799}
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: 3623982467735649376}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 320, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1411402556195867580
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5635920112903963799}
m_CullTransparentMesh: 1
--- !u!114 &392033387581393578
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5635920112903963799}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 8957537473066040245, guid: 6c97158fbcfbbf242ae9b266c285261e, type: 3}
m_Type: 3
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 0
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &6318370184295727766
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6479671700234456601}
- component: {fileID: 919834822258377369}
- component: {fileID: 157813252385139848}
m_Layer: 5
m_Name: HPText
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6479671700234456601
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6318370184295727766}
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: 1909221061409215995}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 320, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &919834822258377369
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6318370184295727766}
m_CullTransparentMesh: 1
--- !u!114 &157813252385139848
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6318370184295727766}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: 100 / 100
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 72491e21fef70124c9ebc25ff62fd3e9, type: 2}
m_sharedMaterial: {fileID: 9147849279665769802, guid: 72491e21fef70124c9ebc25ff62fd3e9, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 32
m_fontSizeBase: 32
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &6360479704059743584
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1848615146409787736}
- component: {fileID: 1704105055393465885}
m_Layer: 5
m_Name: InfoGroup
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1848615146409787736
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6360479704059743584}
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: 4715303447718307229}
- {fileID: 1909221061409215995}
m_Father: {fileID: 1511118888812183331}
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: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1704105055393465885
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6360479704059743584}
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: 10
m_Bottom: 40
m_ChildAlignment: 3
m_Spacing: 20
m_ChildForceExpandWidth: 1
m_ChildForceExpandHeight: 0
m_ChildControlWidth: 1
m_ChildControlHeight: 1
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!1 &6711787659623841782
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4526962547313490101}
- component: {fileID: 4986890417745144886}
- component: {fileID: 7857089966618426166}
m_Layer: 5
m_Name: HPBarBG
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4526962547313490101
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6711787659623841782}
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: 3623982467735649376}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 320, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4986890417745144886
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6711787659623841782}
m_CullTransparentMesh: 1
--- !u!114 &7857089966618426166
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6711787659623841782}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 0, g: 0, b: 0, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
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!1 &8992019966963279634
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6493168435657054733}
- component: {fileID: 1615791677248318544}
- component: {fileID: 89451014552905569}
m_Layer: 5
m_Name: StatusScreen
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6493168435657054733
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8992019966963279634}
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: 1671567835747073886}
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: 30, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1615791677248318544
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8992019966963279634}
m_CullTransparentMesh: 1
--- !u!114 &89451014552905569
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8992019966963279634}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 0.003921569, g: 0.003921569, b: 0.003921569, a: 0}
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: 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

View File

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

View File

@@ -0,0 +1,969 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &2074171136745008206
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5198198148521458082}
- component: {fileID: 1826486670657657610}
- component: {fileID: 8273750792848853139}
m_Layer: 5
m_Name: HPBarFill
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5198198148521458082
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2074171136745008206}
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: 3702526597436997994}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 260, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1826486670657657610
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2074171136745008206}
m_CullTransparentMesh: 1
--- !u!114 &8273750792848853139
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2074171136745008206}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 8957537473066040245, guid: 6c97158fbcfbbf242ae9b266c285261e, type: 3}
m_Type: 3
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 0
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &2253511433390990024
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1284898007502304109}
m_Layer: 5
m_Name: TeamCard_Small
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1284898007502304109
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2253511433390990024}
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: 7560997970798250675}
- {fileID: 8503868087006291890}
- {fileID: 4561880499055873524}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -15, y: 0}
m_SizeDelta: {x: 30, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &2900382378627822061
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4561880499055873524}
- component: {fileID: 8627558946663358117}
- component: {fileID: 8207203923599803865}
m_Layer: 5
m_Name: StatusScreen
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4561880499055873524
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2900382378627822061}
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: 1284898007502304109}
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 &8627558946663358117
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2900382378627822061}
m_CullTransparentMesh: 1
--- !u!114 &8207203923599803865
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2900382378627822061}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 0.003921569, g: 0.003921569, b: 0.003921569, a: 0.95686275}
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: 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!1 &2968470668028046660
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5917359228874704445}
- component: {fileID: 5042915766726483101}
m_Layer: 5
m_Name: InfoGroup
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5917359228874704445
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2968470668028046660}
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: 194619546641387405}
- {fileID: 291540299496549388}
m_Father: {fileID: 8503868087006291890}
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: 250, y: 80}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &5042915766726483101
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2968470668028046660}
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: 20
m_ChildAlignment: 3
m_Spacing: 10
m_ChildForceExpandWidth: 1
m_ChildForceExpandHeight: 0
m_ChildControlWidth: 1
m_ChildControlHeight: 1
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!1 &3640157395410386983
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7560997970798250675}
- component: {fileID: 2705099275371687515}
- component: {fileID: 8518698171192333884}
m_Layer: 5
m_Name: Background
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &7560997970798250675
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3640157395410386983}
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: 1284898007502304109}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 370, y: 90}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2705099275371687515
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3640157395410386983}
m_CullTransparentMesh: 1
--- !u!114 &8518698171192333884
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3640157395410386983}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 0, g: 0, b: 0, a: 0.5254902}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
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!1 &4102094337288095666
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 291540299496549388}
- component: {fileID: 4720487827404151422}
m_Layer: 5
m_Name: Row_HP
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &291540299496549388
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4102094337288095666}
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: 3702526597436997994}
- {fileID: 6245799478517062558}
m_Father: {fileID: 5917359228874704445}
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: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &4720487827404151422
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4102094337288095666}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: -1
m_PreferredHeight: -1
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &4343589651227387619
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8503868087006291890}
- component: {fileID: 4482117481812084865}
m_Layer: 5
m_Name: Content
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8503868087006291890
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4343589651227387619}
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: 2205644490763987176}
- {fileID: 5917359228874704445}
m_Father: {fileID: 1284898007502304109}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 370, y: 90}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &4482117481812084865
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4343589651227387619}
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: 10
m_Right: 10
m_Top: 10
m_Bottom: 10
m_ChildAlignment: 3
m_Spacing: 10
m_ChildForceExpandWidth: 0
m_ChildForceExpandHeight: 0
m_ChildControlWidth: 0
m_ChildControlHeight: 0
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!1 &5793376694639013665
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2205644490763987176}
- component: {fileID: 1577489590812274390}
- component: {fileID: 4030882051384975456}
m_Layer: 5
m_Name: PortraitFrame
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2205644490763987176
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5793376694639013665}
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: 8503868087006291890}
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: 80, y: 80}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1577489590812274390
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5793376694639013665}
m_CullTransparentMesh: 1
--- !u!114 &4030882051384975456
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5793376694639013665}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
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!1 &6414600283166031257
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6245799478517062558}
- component: {fileID: 5135884166251837940}
- component: {fileID: 1343573155229754827}
m_Layer: 5
m_Name: HPText
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6245799478517062558
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6414600283166031257}
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: 291540299496549388}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 250, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5135884166251837940
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6414600283166031257}
m_CullTransparentMesh: 1
--- !u!114 &1343573155229754827
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6414600283166031257}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: 100 / 100
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 72491e21fef70124c9ebc25ff62fd3e9, type: 2}
m_sharedMaterial: {fileID: 9147849279665769802, guid: 72491e21fef70124c9ebc25ff62fd3e9, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 28
m_fontSizeBase: 28
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &7834539181679316471
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3702526597436997994}
m_Layer: 5
m_Name: HPBarRoot
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3702526597436997994
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7834539181679316471}
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: 3802551536411645914}
- {fileID: 5198198148521458082}
m_Father: {fileID: 291540299496549388}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 260, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &8164887723793364555
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3802551536411645914}
- component: {fileID: 3656180201220190327}
- component: {fileID: 1104169946164349632}
m_Layer: 5
m_Name: HPBarBG
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3802551536411645914
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8164887723793364555}
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: 3702526597436997994}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 260, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3656180201220190327
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8164887723793364555}
m_CullTransparentMesh: 1
--- !u!114 &1104169946164349632
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8164887723793364555}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 0, g: 0, b: 0, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
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!1 &8988597135719243260
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 194619546641387405}
- component: {fileID: 6633126197091541793}
m_Layer: 5
m_Name: Row_Name
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &194619546641387405
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8988597135719243260}
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: 4888232951558913288}
m_Father: {fileID: 5917359228874704445}
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: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &6633126197091541793
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8988597135719243260}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: 320
m_MinHeight: 50
m_PreferredWidth: 320
m_PreferredHeight: 50
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &9132062344038458924
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4888232951558913288}
- component: {fileID: 6038280827777648504}
- component: {fileID: 4716558580110790481}
m_Layer: 5
m_Name: PlayerNameText
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4888232951558913288
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9132062344038458924}
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: 194619546641387405}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6038280827777648504
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9132062344038458924}
m_CullTransparentMesh: 1
--- !u!114 &4716558580110790481
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9132062344038458924}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: Player 4
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: cac3ad1b064570d46abc7f664d02d23e, type: 2}
m_sharedMaterial: {fileID: -8208170789151758778, guid: cac3ad1b064570d46abc7f664d02d23e, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 32
m_fontSizeBase: 32
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}

View File

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

View File

@@ -1,3 +1,3 @@
id,memo,move_speed,max_hp,sight,atk_range,atk_damage,atk_interval_sec,cost,weight,model_path,animation_controller_path
1,기본1,5,75,6,1,10,2,2,1,Assets/Models/PlantWarrior.fbx,Assets/Animations/MonsterAnimationController.controller
2,기본2,4.5,100,6,4,15,4,5,0.5,Assets/Models/Rogue.fbx,Assets/Animations/MonsterAnimationController.controller
1,기본1,4,75,6,1,10,2,2,1,Assets/Models/PlantWarrior_With_Spear.fbx,Assets/Animations/MonsterAnimationController.controller
2,기본2,3.5,50,6,4,15,4,5,0.5,Assets/Models/Rogue.fbx,Assets/Animations/MonsterAnimationController.controller
1 id memo move_speed max_hp sight atk_range atk_damage atk_interval_sec cost weight model_path animation_controller_path
2 1 기본1 5 4 75 6 1 10 2 2 1 Assets/Models/PlantWarrior.fbx Assets/Models/PlantWarrior_With_Spear.fbx Assets/Animations/MonsterAnimationController.controller
3 2 기본2 4.5 3.5 100 50 6 4 15 4 5 0.5 Assets/Models/Rogue.fbx Assets/Animations/MonsterAnimationController.controller

View File

@@ -1,6 +1,6 @@
id,memo,move_speed,max_hp,sight,atk_range,atk_damage,atk_interval_sec,cost,weight,model_path,animation_controller_path,wave_min,wave_max
101,Grunt(기본),6.7,75,6,1,3,1.2,3,1.0,Assets/Models/Skeleton_Minion.fbx,Assets/Animations/MonsterAnimationController.controller,1,10
102,Tank(느림/단단),3.3,125,6,1,4,1.5,5,0.5,Assets/Models/Druid.fbx,Assets/Animations/MonsterAnimationController.controller,3,15
103,Ranged(원거리/약함),5.3,65,6,5,2,1.4,3,0.2,Assets/Models/Skeleton_Warrior.fbx,Assets/Animations/MonsterAnimationController.controller,3,20
104,Fast(빠름/약함),8.6,45,6,1,2,1.0,3,0.333,Assets/Models/Skeleton_Rogue.fbx,Assets/Animations/MonsterAnimationController.controller,3,20
105,Elite(소수 정예),6.6,100,6,1,7,1.3,6,0.1,Assets/Models/Barbarian_Large.fbx,Assets/Animations/MonsterAnimationController.controller,5,20
101,Grunt(기본),4.5,75,6,1,3,1.2,3,1,Assets/Models/Skeleton_Minion_With_Sword.fbx,Assets/Animations/MonsterAnimationController.controller,1,10
102,Tank(느림/단단),2.5,125,6,1,4,1.5,5,0.5,Assets/Models/Druid.fbx,Assets/Animations/MonsterAnimationController.controller,3,15
103,Ranged(원거리/약함),3.5,65,6,5,2,1.4,3,0.2,Assets/Models/Skeleton_Warrior.fbx,Assets/Animations/MonsterAnimationController.controller,3,20
104,Fast(빠름/약함),6,45,6,1,2,1,3,0.333,Assets/Models/Skeleton_Rogue.fbx,Assets/Animations/MonsterAnimationController.controller,3,20
105,Elite(소수 정예),4.5,100,6,1,7,1.3,6,0.1,Assets/Models/Barbarian_Large.fbx,Assets/Animations/MonsterAnimationController.controller,5,20
1 id memo move_speed max_hp sight atk_range atk_damage atk_interval_sec cost weight model_path animation_controller_path wave_min wave_max
2 101 Grunt(기본) 6.7 4.5 75 6 1 3 1.2 3 1.0 1 Assets/Models/Skeleton_Minion.fbx Assets/Models/Skeleton_Minion_With_Sword.fbx Assets/Animations/MonsterAnimationController.controller 1 10
3 102 Tank(느림/단단) 3.3 2.5 125 6 1 4 1.5 5 0.5 Assets/Models/Druid.fbx Assets/Animations/MonsterAnimationController.controller 3 15
4 103 Ranged(원거리/약함) 5.3 3.5 65 6 5 2 1.4 3 0.2 Assets/Models/Skeleton_Warrior.fbx Assets/Animations/MonsterAnimationController.controller 3 20
5 104 Fast(빠름/약함) 8.6 6 45 6 1 2 1.0 1 3 0.333 Assets/Models/Skeleton_Rogue.fbx Assets/Animations/MonsterAnimationController.controller 3 20
6 105 Elite(소수 정예) 6.6 4.5 100 6 1 7 1.3 6 0.1 Assets/Models/Barbarian_Large.fbx Assets/Animations/MonsterAnimationController.controller 5 20

View File

@@ -1,2 +1,2 @@
id,memo,move_speed,capacity,manpower,max_hp,sight,atk_range,atk_damage,atk_interval_sec,prefab_path
1,,5,50,10,100,10,3,10,1,Assets/Prefabs/Player/Player
1,,4,50,10,100,10,3,10,1,Assets/Prefabs/Player/Player
1 id memo move_speed capacity manpower max_hp sight atk_range atk_damage atk_interval_sec prefab_path
2 1 5 4 50 10 100 10 3 10 1 Assets/Prefabs/Player/Player

View File

@@ -1,12 +1,12 @@
id,memo,building_name,level,upgrade_to,tower_type,mana,manpower,size_x,size_y,size_z,max_hp,sight,atk_range,atk_damage,atk_interval_sec,model_path
1,타워,Arrow Tower Lv.1,1,2,attack,100,10,4,10,4,100,15,10,15,2,Assets/Models/building_tower_B_blue.fbx
2,타워,Arrow Tower Lv.2,2,3,attack,200,20,4,10,4,150,15,15,20,2,Assets/Models/building_tower_B_blue.fbx
3,타워,Arrow Tower Lv.3,3,4,attack,300,30,4,10,4,200,20,15,30,2,Assets/Models/building_tower_B_blue.fbx
4,타워,Arrow Tower Lv.4,4,5,attack,400,40,4,10,4,250,25,20,40,2,Assets/Models/building_tower_B_blue.fbx
5,타워,Arrow Tower Lv.5,5,,attack,600,50,4,10,4,400,25,25,50,2,Assets/Models/building_tower_B_blue.fbx
1,타워,Arrow Tower Lv.1,1,2,attack,150,50,4,10,4,100,15,10,15,2,Assets/Models/building_tower_B_blue.fbx
2,타워,Arrow Tower Lv.2,2,3,attack,300,60,4,10,4,150,15,15,20,2,Assets/Models/building_tower_B_blue.fbx
3,타워,Arrow Tower Lv.3,3,4,attack,450,70,4,10,4,200,20,15,30,2,Assets/Models/building_tower_B_blue.fbx
4,타워,Arrow Tower Lv.4,4,5,attack,600,80,4,10,4,250,25,20,40,2,Assets/Models/building_tower_B_blue.fbx
5,타워,Arrow Tower Lv.5,5,,attack,750,100,4,10,4,400,25,25,50,2,Assets/Models/building_tower_B_blue.fbx
6,,Wall Lv.1,1,7,defense,10,10,8,4,3,30,1,0,0,0,Assets/Models/wall_straight.fbx
7,,Wall Lv.2,2,8,defense,30,10,8,4,3,30,1,0,0,0,Assets/Models/wall_straight.fbx
8,,Wall Lv.3,3,9,defense,50,20,8,4,3,30,1,0,0,0,Assets/Models/wall_straight.fbx
9,,Wall Lv.4,4,10,defense,100,20,8,4,3,30,1,0,0,0,Assets/Models/wall_straight.fbx
10,,Wall Lv.5,5,,defense,150,20,8,4,3,30,1,0,0,0,Assets/Models/wall_straight.fbx
7,,Wall Lv.2,2,8,defense,30,20,8,4,3,50,1,0,0,0,Assets/Models/wall_straight.fbx
8,,Wall Lv.3,3,9,defense,50,30,8,4,3,60,1,0,0,0,Assets/Models/wall_straight.fbx
9,,Wall Lv.4,4,10,defense,100,40,8,4,3,80,1,0,0,0,Assets/Models/wall_straight.fbx
10,,Wall Lv.5,5,,defense,150,50,8,4,3,110,1,0,0,0,Assets/Models/wall_straight.fbx
11,와드,Ward Lv.1,1,,sight,10,10,1,1,1,10,5,0,0,0,Assets/Models/torch.fbx
1 id memo building_name level upgrade_to tower_type mana manpower size_x size_y size_z max_hp sight atk_range atk_damage atk_interval_sec model_path
2 1 타워 Arrow Tower Lv.1 1 2 attack 100 150 10 50 4 10 4 100 15 10 15 2 Assets/Models/building_tower_B_blue.fbx
3 2 타워 Arrow Tower Lv.2 2 3 attack 200 300 20 60 4 10 4 150 15 15 20 2 Assets/Models/building_tower_B_blue.fbx
4 3 타워 Arrow Tower Lv.3 3 4 attack 300 450 30 70 4 10 4 200 20 15 30 2 Assets/Models/building_tower_B_blue.fbx
5 4 타워 Arrow Tower Lv.4 4 5 attack 400 600 40 80 4 10 4 250 25 20 40 2 Assets/Models/building_tower_B_blue.fbx
6 5 타워 Arrow Tower Lv.5 5 attack 600 750 50 100 4 10 4 400 25 25 50 2 Assets/Models/building_tower_B_blue.fbx
7 6 Wall Lv.1 1 7 defense 10 10 8 4 3 30 1 0 0 0 Assets/Models/wall_straight.fbx
8 7 Wall Lv.2 2 8 defense 30 10 20 8 4 3 30 50 1 0 0 0 Assets/Models/wall_straight.fbx
9 8 Wall Lv.3 3 9 defense 50 20 30 8 4 3 30 60 1 0 0 0 Assets/Models/wall_straight.fbx
10 9 Wall Lv.4 4 10 defense 100 20 40 8 4 3 30 80 1 0 0 0 Assets/Models/wall_straight.fbx
11 10 Wall Lv.5 5 defense 150 20 50 8 4 3 30 110 1 0 0 0 Assets/Models/wall_straight.fbx
12 11 와드 Ward Lv.1 1 sight 10 10 1 1 1 10 5 0 0 0 Assets/Models/torch.fbx

View File

@@ -11,6 +11,6 @@
10,노동력 증가 Lv.1,harvest,person,200,,player_manpower,add,5,10
11,노동력 증가 Lv.2,harvest,person,300,10,player_manpower,add,10,11
12,노동력 증가 Lv.3,harvest,person,400,7; 10,player_manpower,add,20,12
13,이동속도 증가 Lv.1,scout,person,200,,player_move_speed,mul,1.2,13
14,이동속도 증가 Lv.2,scout,person,300,13,player_move_speed,mul,1.6,14
15,이동속도 증가 Lv.3,scout,person,400,14,player_move_speed,mul,2,15
13,이동속도 증가 Lv.1,scout,person,200,,player_move_speed,mul,1.5,13
14,이동속도 증가 Lv.2,scout,person,300,13,player_move_speed,mul,2,14
15,이동속도 증가 Lv.3,scout,person,400,14,player_move_speed,mul,2.5,15
1 id memo upgrade_category upgrade_target mana require_upgrade_id effect_stat_list effect_op_list effect_value_list sort_order
11 10 노동력 증가 Lv.1 harvest person 200 player_manpower add 5 10
12 11 노동력 증가 Lv.2 harvest person 300 10 player_manpower add 10 11
13 12 노동력 증가 Lv.3 harvest person 400 7; 10 player_manpower add 20 12
14 13 이동속도 증가 Lv.1 scout person 200 player_move_speed mul 1.2 1.5 13
15 14 이동속도 증가 Lv.2 scout person 300 13 player_move_speed mul 1.6 2 14
16 15 이동속도 증가 Lv.3 scout person 400 14 player_move_speed mul 2 2.5 15