Files
Northbound/Assets/Scripts/Editor/FogOfWarVisibilitySetup.cs
2026-01-30 16:14:41 +09:00

171 lines
6.6 KiB
C#

using UnityEngine;
using UnityEditor;
namespace Northbound.Editor
{
/// <summary>
/// Editor utility to add FogOfWarVisibility to all obstacles and buildings
/// </summary>
public static class FogOfWarVisibilitySetup
{
[MenuItem("Tools/Fog of War/Add Visibility to All Obstacles")]
public static void AddVisibilityToObstacles()
{
string[] obstaclePaths = new string[]
{
"Assets/Prefabs/Obstacles/Rock1.prefab",
"Assets/Prefabs/Obstacles/Rock2.prefab",
"Assets/Prefabs/Obstacles/Rock3.prefab",
"Assets/Prefabs/Obstacles/Tree1.prefab",
"Assets/Prefabs/Obstacles/Tree2.prefab"
};
int count = 0;
foreach (string path in obstaclePaths)
{
GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(path);
if (prefab != null)
{
// Check if already has component
if (prefab.GetComponent<FogOfWarVisibility>() == null)
{
// Add component
var visibility = prefab.AddComponent<FogOfWarVisibility>();
visibility.showInExploredAreas = false; // Hide obstacles when not visible
visibility.updateInterval = 0.2f;
EditorUtility.SetDirty(prefab);
count++;
Debug.Log($"Added FogOfWarVisibility to {prefab.name}");
}
else
{
Debug.Log($"{prefab.name} already has FogOfWarVisibility");
}
}
else
{
Debug.LogWarning($"Could not find prefab at {path}");
}
}
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
Debug.Log($"<color=green>FogOfWarVisibility added to {count} obstacle prefabs!</color>");
}
[MenuItem("Tools/Fog of War/Add Visibility to All Buildings")]
public static void AddVisibilityToBuildings()
{
// Find all Building prefabs
string[] guids = AssetDatabase.FindAssets("t:Prefab", new[] { "Assets/Prefabs" });
int count = 0;
foreach (string guid in guids)
{
string path = AssetDatabase.GUIDToAssetPath(guid);
GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(path);
if (prefab != null && prefab.GetComponent<Building>() != null)
{
// Check if already has component
if (prefab.GetComponent<FogOfWarVisibility>() == null)
{
var visibility = prefab.AddComponent<FogOfWarVisibility>();
visibility.showInExploredAreas = true; // Show buildings in explored areas (greyed out)
visibility.updateInterval = 0.2f;
EditorUtility.SetDirty(prefab);
count++;
Debug.Log($"Added FogOfWarVisibility to building: {prefab.name}");
}
}
}
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
Debug.Log($"<color=green>FogOfWarVisibility added to {count} building prefabs!</color>");
}
[MenuItem("Tools/Fog of War/Add Visibility to Scene Obstacles")]
public static void AddVisibilityToSceneObstacles()
{
GameObject[] allObjects = GameObject.FindObjectsByType<GameObject>(FindObjectsSortMode.None);
int count = 0;
foreach (GameObject obj in allObjects)
{
// Skip if it's a prefab instance - those will be handled by prefab updates
if (PrefabUtility.IsPartOfPrefabInstance(obj))
continue;
// Check if it has renderers but no FogOfWarVisibility
if (obj.GetComponent<Renderer>() != null && obj.GetComponent<FogOfWarVisibility>() == null)
{
// Check if it's an obstacle (has MeshCollider and no other components)
if (obj.name.Contains("Rock") || obj.name.Contains("Tree") || obj.name.Contains("Obstacle"))
{
var visibility = obj.AddComponent<FogOfWarVisibility>();
visibility.showInExploredAreas = false;
visibility.updateInterval = 0.2f;
EditorUtility.SetDirty(obj);
count++;
Debug.Log($"Added FogOfWarVisibility to scene object: {obj.name}");
}
}
}
Debug.Log($"<color=green>FogOfWarVisibility added to {count} scene objects!</color>");
}
[MenuItem("Tools/Fog of War/Remove Visibility from All")]
public static void RemoveVisibilityFromAll()
{
if (!EditorUtility.DisplayDialog("Remove FogOfWarVisibility",
"This will remove FogOfWarVisibility from all prefabs and scene objects. Continue?",
"Yes", "Cancel"))
{
return;
}
// Remove from prefabs
string[] guids = AssetDatabase.FindAssets("t:Prefab", new[] { "Assets/Prefabs" });
int prefabCount = 0;
foreach (string guid in guids)
{
string path = AssetDatabase.GUIDToAssetPath(guid);
GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(path);
if (prefab != null)
{
var visibility = prefab.GetComponent<FogOfWarVisibility>();
if (visibility != null)
{
Object.DestroyImmediate(visibility, true);
EditorUtility.SetDirty(prefab);
prefabCount++;
}
}
}
// Remove from scene objects
FogOfWarVisibility[] sceneComponents = GameObject.FindObjectsByType<FogOfWarVisibility>(FindObjectsSortMode.None);
int sceneCount = sceneComponents.Length;
foreach (var comp in sceneComponents)
{
Object.DestroyImmediate(comp);
}
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
Debug.Log($"<color=yellow>Removed FogOfWarVisibility from {prefabCount} prefabs and {sceneCount} scene objects</color>");
}
}
}