| |
| |
| |
| |
| using System; |
| using System.IO; |
| using System.Linq; |
|
|
| using UnityEngine; |
| using UnityEditor; |
| using UnityEditor.SceneManagement; |
| using UnityEngine.SceneManagement; |
|
|
| namespace Microsoft.Unity.VisualStudio.Editor |
| { |
| [Serializable] |
| internal class FileUsage |
| { |
| public string Path; |
| public string[] GameObjectPath; |
| } |
|
|
| internal static class UsageUtility |
| { |
| internal static void ShowUsage(string json) |
| { |
| try |
| { |
| var usage = JsonUtility.FromJson<FileUsage>(json); |
| ShowUsage(usage.Path, usage.GameObjectPath); |
| } |
| catch (Exception) |
| { |
| |
| } |
| } |
|
|
| internal static void ShowUsage(string path, string[] gameObjectPath) |
| { |
| path = FileUtility.MakeRelativeToProjectPath(path); |
| if (path == null) |
| return; |
|
|
| path = FileUtility.NormalizeWindowsToUnix(path); |
| var extension = Path.GetExtension(path).ToLower(); |
|
|
| EditorUtility.FocusProjectWindow(); |
|
|
| switch (extension) |
| { |
| case ".unity": |
| ShowSceneUsage(path, gameObjectPath); |
| break; |
| default: |
| var asset = AssetDatabase.LoadMainAssetAtPath(path); |
| Selection.activeObject = asset; |
| EditorGUIUtility.PingObject(asset); |
| break; |
| } |
| } |
|
|
| private static void ShowSceneUsage(string scenePath, string[] gameObjectPath) |
| { |
| var scene = SceneManager.GetSceneByPath(scenePath.Replace(Path.DirectorySeparatorChar, '/')); |
| if (!scene.isLoaded) |
| { |
| var result = EditorUtility.DisplayDialogComplex("Show Usage", |
| $"Do you want to open \"{Path.GetFileName(scenePath)}\"?", |
| "Open Scene", |
| "Cancel", |
| "Open Scene (additive)"); |
|
|
| switch (result) |
| { |
| case 0: |
| EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo(); |
| scene = EditorSceneManager.OpenScene(scenePath, OpenSceneMode.Single); |
| break; |
| case 1: |
| return; |
| case 2: |
| scene = EditorSceneManager.OpenScene(scenePath, OpenSceneMode.Additive); |
| break; |
| } |
| } |
|
|
| ShowSceneUsage(scene, gameObjectPath); |
| } |
|
|
| private static void ShowSceneUsage(Scene scene, string[] gameObjectPath) |
| { |
| if (gameObjectPath == null || gameObjectPath.Length == 0) |
| return; |
|
|
| var go = scene.GetRootGameObjects().FirstOrDefault(g => g.name == gameObjectPath[0]); |
| if (go == null) |
| return; |
|
|
| for (var ni = 1; ni < gameObjectPath.Length; ni++) |
| { |
| var transform = go.transform; |
| for (var i = 0; i < transform.childCount; i++) |
| { |
| var child = transform.GetChild(i); |
| var childgo = child.gameObject; |
| if (childgo.name == gameObjectPath[ni]) |
| { |
| go = childgo; |
| break; |
| } |
| } |
| } |
|
|
| Selection.activeObject = go; |
| EditorGUIUtility.PingObject(go); |
| } |
| } |
| } |
|
|