using System; using System.Collections.Generic; using System.Linq; using Games.GlobeDefine; using GCGame.Table; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; public class AllServerObstacle : EditorWindow { [MenuItem("ProTool/ServerObstacle/Create For All")] public static void ShowWindow() { GetWindow(); } private void OnGUI() { GUILayout.Label("即将为所有SceneClass索引的场景创建服务器碰撞"); if (GUILayout.Button("确定")) { Close(); var sceneHash = new HashSet(); var sceneList = EditorTableManager.GetTable(); foreach (var scene in sceneList) { var sceneName = scene.ResName.Trim(); if (!string.IsNullOrEmpty(sceneName) && sceneName != GlobeVar.sceneRole && sceneName != GlobeVar.sceneLoading && sceneName != GlobeVar.sceneLogin) sceneHash.Add(sceneName); } var action = new AllServerObstacleAction(sceneHash.ToArray()); action.Start(); } if (GUILayout.Button("取消")) Close(); } private class AllServerObstacleAction : EditorPerFrameActionBase { private string[] _scenePaths; private int _currentIndex; // 打开场景后,跳过一帧 private bool _skip; public AllServerObstacleAction(string[] scenePaths) { _scenePaths = scenePaths; } protected override int GetCurrentIndex() { return _currentIndex; } protected override int GetTotalCount() { return _scenePaths.Length; } protected override void PerFrameAction() { if (_skip) { _skip = false; _currentIndex++; ServerObstacle.CreateObstacle(); } else { var sceneName = _scenePaths[_currentIndex]; var scenePath = SceneDisassembly.sceneRoot.Open(sceneName + SceneDisassembly.sceneExtension); var error = false; try { var scene = EditorSceneManager.OpenScene(scenePath, OpenSceneMode.Single); Debug.Log("加载场景 " + scene.name); if (scene.name == sceneName) { } else { Debug.LogError(string.Format("无法加载场景{0}于项目路径{1}!", sceneName, scenePath)); error = true; } } catch (Exception e) { Debug.LogError(e); error = true; } if (error) { _skip = false; _currentIndex++; Debug.LogWarning(string.Format("场景{0}保存为空白文件!", sceneName)); ServerObstacle.CreateEmptyObstacle(sceneName); } else _skip = true; } } } }