데이터 파이프라인 추가 및 수정 + 크립 및 크립 캠프 배치 자동화

Hierachy > System > MapGenerator 에서 크립 관련 변수 설정 가능
Kaykit PlantWarrior 애셋 추가
This commit is contained in:
2026-02-02 19:50:30 +09:00
parent 106fe81c88
commit dc4d71d4b6
81 changed files with 4744 additions and 174 deletions

View File

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

View File

@@ -0,0 +1,25 @@
%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: f7bb664a82feb0e43b3c5f459ca775f7, type: 3}
m_Name: Creep1
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.CreepData
id: 1
memo: "\uAE30\uBCF81"
moveSpeed: 5
maxHp: 100
atkRange: 3
atkDamage: 20
atkIntervalSec: 1.5
cost: 1
weight: 1
modelPath: Assets/Models/PlantWarrior.fbx
animationControllerPath: Assets/Animations/MonsterAnimationController.controller

View File

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

View File

@@ -12,24 +12,32 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 8c40fef5ebc37b743a3f225c1ca57c32, type: 3}
m_Name: Tower1
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.TowerData
buildingName: "\uD0C0\uC6CC"
prefab: {fileID: 8512676738329978770, guid: 3f7838db2c2fc424d9bd9a0d243b43be, type: 3}
icon: {fileID: 0}
id: 1
memo: "\uD0C0\uC6CC"
buildingName:
mana: 25
manpower: 10
sizeX: 4
sizeY: 10
sizeZ: 4
placementOffset: {x: 0, y: 0, z: 0}
allowRotation: 1
manpower: 10
maxHp: 50
isIndestructible: 0
autoRegenerate: 0
regenPerSecond: 1
atkRange: 10
providesVision: 1
atkDamage: 5
atkIntervalSec: 2
modelPath: Assets/Models/building_tower_B_blue.fbx
prefab: {fileID: 8512676738329978770, guid: 3f7838db2c2fc424d9bd9a0d243b43be, type: 3}
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

@@ -12,24 +12,32 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 8c40fef5ebc37b743a3f225c1ca57c32, type: 3}
m_Name: Tower2
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.TowerData
buildingName: "\uBCBD"
prefab: {fileID: 3671057791414486316, guid: ae9a9b515e1792a45887f0d967b943d6, type: 3}
icon: {fileID: 0}
id: 2
memo: "\uBCBD"
buildingName:
mana: 5
manpower: 5
sizeX: 8
sizeY: 4
sizeZ: 3
placementOffset: {x: 0, y: 0, z: 0}
allowRotation: 1
manpower: 5
maxHp: 30
isIndestructible: 0
autoRegenerate: 0
regenPerSecond: 1
atkRange: 0
providesVision: 1
atkDamage: 0
atkIntervalSec: 0
modelPath: Assets/Models/wall_straight.fbx
prefab: {fileID: 3671057791414486316, guid: ae9a9b515e1792a45887f0d967b943d6, type: 3}
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,37 @@
// 이 파일은 자동 생성되었습니다. 직접 수정하지 마세요!
// 생성 스크립트: DataTools/generate_csharp_classes.py
using UnityEngine;
using System.Collections.Generic; // 리스트 지원을 위해 추가
namespace Northbound.Data
{
[CreateAssetMenu(fileName = "CreepData", menuName = "Northbound/Creep Data")]
public partial class CreepData : ScriptableObject
{
[Header("기본 정보")]
/// <summary>고유 ID</summary>
public int id;
/// <summary>기획 메모</summary>
public string memo;
/// <summary>이동 속도</summary>
public float moveSpeed;
/// <summary>체력</summary>
public int maxHp;
/// <summary>사정 거리</summary>
public int atkRange;
/// <summary>데미지</summary>
public int atkDamage;
/// <summary>공격 주기</summary>
public float atkIntervalSec;
/// <summary>몬스터 난이도 점수</summary>
public int cost;
/// <summary>등장 가중치</summary>
public float weight;
/// <summary>사용할 모델의 경로</summary>
public string modelPath;
/// <summary>사용할 애니메이션 컨트롤러의 경로</summary>
public string animationControllerPath;
}
}

View File

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

View File

@@ -7,7 +7,7 @@ using System.Collections.Generic; // 리스트 지원을 위해 추가
namespace Northbound.Data
{
[CreateAssetMenu(fileName = "DefaultSettingsData", menuName = "Northbound/DefaultSettings Data")]
public class DefaultSettingsData : ScriptableObject
public partial class DefaultSettingsData : ScriptableObject
{
[Header("기본 정보")]
/// <summary>고유 ID</summary>

View File

@@ -7,7 +7,7 @@ using System.Collections.Generic; // 리스트 지원을 위해 추가
namespace Northbound.Data
{
[CreateAssetMenu(fileName = "MonsterData", menuName = "Northbound/Monster Data")]
public class MonsterData : ScriptableObject
public partial class MonsterData : ScriptableObject
{
[Header("기본 정보")]
/// <summary>고유 ID</summary>

View File

@@ -7,7 +7,7 @@ using System.Collections.Generic; // 리스트 지원을 위해 추가
namespace Northbound.Data
{
[CreateAssetMenu(fileName = "PlayerData", menuName = "Northbound/Player Data")]
public class PlayerData : ScriptableObject
public partial class PlayerData : ScriptableObject
{
[Header("기본 정보")]
/// <summary>고유 ID</summary>

View File

@@ -1,83 +1,41 @@
// 이 파일은 자동 생성되었습니다. 직접 수정하지 마세요!
// 생성 스크립트: DataTools/generate_csharp_classes.py
using UnityEngine;
using System.Collections.Generic; // 리스트 지원을 위해 추가
namespace Northbound.Data
{
[CreateAssetMenu(fileName = "TowerData", menuName = "Northbound/Tower Data")]
public class TowerData : ScriptableObject
public partial class TowerData : ScriptableObject
{
[Header("Building Info")]
public string buildingName;
public GameObject prefab;
[Tooltip("UI에 표시될 건물 아이콘")]
public Sprite icon;
[Header("Basic Info")]
[Tooltip("고유 ID")]
[Header("기본 정보")]
/// <summary>고유 ID</summary>
public int id;
[Tooltip("기획 메모")]
/// <summary>기획 메모</summary>
public string memo;
[Tooltip("건설 비용")]
/// <summary>건물 이름</summary>
public string buildingName;
/// <summary>건설 비용 (mana=20) (mana=50; iron=10)</summary>
public int mana;
[Header("Grid Size")]
[Tooltip("X 그리드 차지 공간")]
public int sizeX = 1;
[Tooltip("Y 그리드 차지 공간")]
public int sizeY = 1;
[Tooltip("Z 차지 공간")]
public int sizeZ = 2;
[Header("Placement Settings")]
[Tooltip("Offset from grid position")]
public Vector3 placementOffset = Vector3.zero;
[Tooltip("Can rotate this building?")]
public bool allowRotation = true;
[Header("Construction Settings")]
[Tooltip("건설 완료에 필요한 총 작업량")]
public float manpower = 100f;
[Header("Health Settings")]
[Tooltip("체력")]
public int maxHp = 100;
[Tooltip("Can this building be damaged?")]
public bool isIndestructible = false;
[Tooltip("Auto-regenerate health over time")]
public bool autoRegenerate = false;
[Tooltip("Health regeneration per second")]
public int regenPerSecond = 1;
[Header("Vision Settings")]
[Tooltip("사정거리")]
public int atkRange = 15;
[Tooltip("Does this building provide vision?")]
public bool providesVision = true;
[Header("Attack Settings")]
[Tooltip("데미지")]
public int atkDamage = 10;
[Tooltip("공격 주기")]
public float atkIntervalSec = 1f;
[Header("Model Settings")]
[Tooltip("모델 경로")]
/// <summary>건설 노동량</summary>
public float manpower;
/// <summary>X 그리드 차지 공간</summary>
public int sizeX;
/// <summary>Y 그리드 차지 공간</summary>
public int sizeY;
/// <summary>Z 차지 공간</summary>
public int sizeZ;
/// <summary>체력</summary>
public int maxHp;
/// <summary>사정거리</summary>
public int atkRange;
/// <summary>데미지</summary>
public int atkDamage;
/// <summary>공격 주기</summary>
public float atkIntervalSec;
/// <summary>모델 경로</summary>
public string modelPath;
[Header("Properties for convenience")]
public int width => sizeX;
public int length => sizeY;
public float height => sizeY;
public int maxHealth => maxHp;
public float visionRange => atkRange;
public float requiredWorkAmount => manpower;
public Vector3 GetSize(int rotation)
{
// Rotation 0,180 = normal, 90,270 = swap width/length
bool isRotated = (rotation == 1 || rotation == 3);
float w = isRotated ? length : width;
float l = isRotated ? width : length;
return new Vector3(w, sizeY, l);
}
}
}
}

View File

@@ -0,0 +1,52 @@
using UnityEngine;
using Northbound;
namespace Northbound.Data
{
public partial class TowerData
{
[Header("Runtime References")]
[Tooltip("Prefab reference - set by data pipeline")]
public GameObject prefab;
[Tooltip("UI icon")]
public Sprite icon;
[Header("Placement Settings")]
[Tooltip("Offset from grid position")]
public Vector3 placementOffset = Vector3.zero;
[Tooltip("Can rotate this building?")]
public bool allowRotation = true;
[Header("Health Settings")]
[Tooltip("Can this building be damaged?")]
public bool isIndestructible = false;
[Tooltip("Auto-regenerate health over time")]
public bool autoRegenerate = false;
[Tooltip("Health regeneration per second")]
public int regenPerSecond = 1;
[Header("Vision Settings")]
[Tooltip("Does this building provide vision?")]
public bool providesVision = true;
[Header("Construction Settings")]
[Tooltip("건설 시 사용할 도구")]
public EquipmentData constructionEquipment;
[Header("Properties for convenience")]
public int width => sizeX;
public int length => sizeY;
public float height => sizeY;
public int maxHealth => maxHp;
public float visionRange => atkRange;
public float requiredWorkAmount => manpower;
public Vector3 GetSize(int rotation)
{
bool isRotated = (rotation == 1 || rotation == 3);
float w = isRotated ? length : width;
float l = isRotated ? width : length;
return new Vector3(w, sizeY, l);
}
}
}

View File

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

View File

@@ -0,0 +1,212 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &3810918154428190126
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 244366501961263783}
- component: {fileID: 6694091345637567571}
- component: {fileID: 876002834352819743}
- component: {fileID: 3376121002006894933}
- component: {fileID: 4485945348237935463}
- component: {fileID: 3318886927439461238}
- component: {fileID: 6023907831447366429}
- component: {fileID: 8728041163683826261}
- component: {fileID: 3928237758911375249}
m_Layer: 11
m_Name: CreepTemplate
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &244366501961263783
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3810918154428190126}
serializedVersion: 2
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: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!136 &6694091345637567571
CapsuleCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3810918154428190126}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 2
m_Radius: 0.5
m_Height: 2
m_Direction: 1
m_Center: {x: 0, y: 1, z: 0}
--- !u!114 &876002834352819743
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3810918154428190126}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject
GlobalObjectIdHash: 437508337
InScenePlacedSourceGlobalObjectIdHash: 0
DeferredDespawnTick: 0
Ownership: 1
AlwaysReplicateAsRoot: 0
SynchronizeTransform: 1
ActiveSceneSynchronization: 0
SceneMigrationSynchronization: 0
SpawnWithObservers: 1
DontDestroyWithOwner: 0
AutoObjectParentSync: 1
SyncOwnerTransformWhenParented: 1
AllowOwnerToParent: 0
--- !u!114 &3376121002006894933
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3810918154428190126}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 345fc6e7d4f06314f8b548129700eccb, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.EnemyUnit
ShowTopMostFoldoutHeaderGroup: 1
enemyTeam: 2
maxHealth: 100
damageEffectPrefab: {fileID: 0}
destroyEffectPrefab: {fileID: 0}
--- !u!195 &4485945348237935463
NavMeshAgent:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3810918154428190126}
m_Enabled: 1
m_AgentTypeID: 0
m_Radius: 0.5
m_Speed: 3.5
m_Acceleration: 8
avoidancePriority: 50
m_AngularSpeed: 120
m_StoppingDistance: 0
m_AutoTraverseOffMeshLink: 1
m_AutoBraking: 1
m_AutoRepath: 1
m_Height: 2
m_BaseOffset: 0
m_WalkableMask: 4294967295
m_ObstacleAvoidanceType: 4
--- !u!114 &3318886927439461238
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3810918154428190126}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 453e726e48d16214f84c6d5737edd7df, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.EnemyAIController
ShowTopMostFoldoutHeaderGroup: 1
aiType: 2
detectionRange: 15
detectionAngle: 120
playerLayer:
serializedVersion: 2
m_Bits: 640
obstacleLayer:
serializedVersion: 2
m_Bits: 1152
maxChaseDistance: 30
chaseGiveUpDistance: 25
attackRange: 2
attackInterval: 1.5
attackDamage: 10
moveSpeed: 3.5
chaseSpeedMultiplier: 1.5
showDebugInfo: 1
--- !u!95 &6023907831447366429
Animator:
serializedVersion: 7
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3810918154428190126}
m_Enabled: 1
m_Avatar: {fileID: 0}
m_Controller: {fileID: 9100000, guid: 0a6254dd97e2e8a47ab5cd5c1a629717, type: 2}
m_CullingMode: 0
m_UpdateMode: 0
m_ApplyRootMotion: 0
m_LinearVelocityBlending: 0
m_StabilizeFeet: 0
m_AnimatePhysics: 0
m_WarningMessage:
m_HasTransformHierarchy: 1
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0
--- !u!114 &8728041163683826261
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3810918154428190126}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2b2a547d86f65d64a93a7a3c415d1ce2, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.MonsterAnimationController
ShowTopMostFoldoutHeaderGroup: 1
speedParam: Speed
attackTriggerParam: Attack
isMovingParam: IsMoving
autoLoadFromMonsterData: 1
debugLogging: 0
--- !u!114 &3928237758911375249
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3810918154428190126}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 85e4c68e85ef1704b83cecb71de7d67a, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.CreepDataComponent
creepData: {fileID: 0}
autoApplyOnAwake: 1

View File

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