전장의 안개 기능 개선
미탐험 구역의 모든 오브젝트는 보이지 않음 적이 시야를 제공하는 문제 수정 높은 장애물은 더 먼 거리에서부터 보일 수 있음
This commit is contained in:
170
Assets/Scripts/Editor/FogOfWarVisibilitySetup.cs
Normal file
170
Assets/Scripts/Editor/FogOfWarVisibilitySetup.cs
Normal file
@@ -0,0 +1,170 @@
|
||||
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.FindObjectsOfType<GameObject>();
|
||||
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.FindObjectsOfType<FogOfWarVisibility>();
|
||||
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>");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user