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(); if (towerDataComponent == null) { towerDataComponent = prefab.AddComponent(); 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(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(); if (meshFilter == null) { meshFilter = prefab.AddComponent(); } var renderer = prefab.GetComponent(); if (renderer == null) { renderer = prefab.AddComponent(); } Mesh mesh = AssetDatabase.LoadAssetAtPath(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(); if (collider == null) { collider = prefab.AddComponent(); } collider.size = new Vector3(towerData.sizeX, towerData.sizeZ, towerData.sizeY); collider.center = new Vector3(0f, towerData.sizeZ / 2f, 0f); var navObstacle = prefab.GetComponent(); if (navObstacle == null) { navObstacle = prefab.AddComponent(); 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); } } } }