데이터파이프라인 타워 부분 개선
This commit is contained in:
128
Assets/Scripts/Editor/TowerPrefabSetup.cs
Normal file
128
Assets/Scripts/Editor/TowerPrefabSetup.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user