데이터파이프라인 타워 부분 개선

This commit is contained in:
2026-02-01 11:31:50 +09:00
parent 9d870625ce
commit fe046611b0
43 changed files with 2181 additions and 45 deletions

View File

@@ -0,0 +1,128 @@
using Northbound.Data;
using UnityEditor;
using UnityEngine;
using UnityEngine.AI;
namespace Northbound.Editor
{
public class TowerPrefabSetup : IPrefabSetup
{
public string GetTemplateName()
{
return "TowerTemplate";
}
public void SetupPrefab(GameObject prefab, ScriptableObject data)
{
if (!(data is TowerData towerData))
{
Debug.LogWarning($"[TowerPrefabSetup] Expected TowerData, got {data.GetType().Name}");
return;
}
var towerDataComponent = prefab.GetComponent<TowerDataComponent>();
if (towerDataComponent == null)
{
towerDataComponent = prefab.AddComponent<TowerDataComponent>();
Debug.Log($"[TowerPrefabSetup] Added TowerDataComponent component");
}
if (towerDataComponent != null)
{
towerDataComponent.towerData = towerData;
}
// TowerData now extends BuildingData, so set prefab reference
towerData.prefab = prefab;
// Ensure TowerData fields are synced to BuildingData
towerData.EnsureSynced();
Transform modelTransform = null;
if (!string.IsNullOrEmpty(towerData.modelPath))
{
RemoveOldModel(prefab);
if (towerData.modelPath.ToLower().EndsWith(".fbx"))
{
GameObject fbxModel = AssetDatabase.LoadAssetAtPath<GameObject>(towerData.modelPath);
if (fbxModel != null)
{
GameObject fbxInstance = GameObject.Instantiate(fbxModel);
fbxInstance.name = "Model";
fbxInstance.transform.SetParent(prefab.transform, false);
fbxInstance.transform.localPosition = Vector3.zero;
fbxInstance.transform.localRotation = Quaternion.identity;
// Set model scale based on sizeX/sizeY/sizeZ
fbxInstance.transform.localScale = new Vector3(towerData.sizeX, towerData.sizeZ, towerData.sizeY);
modelTransform = fbxInstance.transform;
Debug.Log($"[TowerPrefabSetup] Applied FBX model: {towerData.modelPath} with scale {towerData.sizeX}x{towerData.sizeZ}x{towerData.sizeY}");
}
else
{
Debug.LogWarning($"[TowerPrefabSetup] Could not load FBX model: {towerData.modelPath}");
}
}
else
{
var meshFilter = prefab.GetComponent<MeshFilter>();
if (meshFilter == null)
{
meshFilter = prefab.AddComponent<MeshFilter>();
}
var renderer = prefab.GetComponent<MeshRenderer>();
if (renderer == null)
{
renderer = prefab.AddComponent<MeshRenderer>();
}
Mesh mesh = AssetDatabase.LoadAssetAtPath<Mesh>(towerData.modelPath);
if (mesh != null)
{
meshFilter.sharedMesh = mesh;
modelTransform = renderer.transform;
modelTransform.localScale = new Vector3(towerData.sizeX, towerData.sizeZ, towerData.sizeY);
Debug.Log($"[TowerPrefabSetup] Applied mesh: {towerData.modelPath} with scale {towerData.sizeX}x{towerData.sizeZ}x{towerData.sizeY}");
}
else
{
Debug.LogWarning($"[TowerPrefabSetup] Could not load mesh: {towerData.modelPath}");
}
}
}
var collider = prefab.GetComponent<BoxCollider>();
if (collider == null)
{
collider = prefab.AddComponent<BoxCollider>();
}
collider.size = new Vector3(towerData.sizeX, towerData.sizeZ, towerData.sizeY);
collider.center = new Vector3(0f, towerData.sizeZ / 2f, 0f);
var navObstacle = prefab.GetComponent<NavMeshObstacle>();
if (navObstacle == null)
{
navObstacle = prefab.AddComponent<NavMeshObstacle>();
navObstacle.shape = NavMeshObstacleShape.Box;
}
navObstacle.size = new Vector3(towerData.sizeX, towerData.sizeZ, towerData.sizeY);
navObstacle.center = new Vector3(0f, towerData.sizeZ / 2f, 0f);
}
private void RemoveOldModel(GameObject prefab)
{
Transform oldModel = prefab.transform.Find("Model");
if (oldModel != null)
{
GameObject.DestroyImmediate(oldModel.gameObject);
}
}
}
}