Boat Attack使用了Universal RP的许多新图形功能,可以用于探索 Universal RP 的使用方式和技巧。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

90 行
3.4 KiB

using System.IO;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;
using System.Linq;
namespace Unity.Scenes.Editor
{
class SubSceneContextMenu
{
public static void AddExtraGameObjectContextMenuItems(GenericMenu menu, GameObject target)
{
menu.AddSeparator("");
var addSubSceneContent = EditorGUIUtility.TrTextContent("New SubScene From Selection");
if (!EditorApplication.isPlaying && GetValidGameObjectForSubSceneCreation(target) != null)
menu.AddItem(addSubSceneContent, false, CreateSubSceneAndAddSelection, target);
else
menu.AddDisabledItem(addSubSceneContent);
}
static GameObject[] GetValidGameObjectForSubSceneCreation(GameObject target)
{
if (target == null)
return null;
if (!target.scene.IsValid())
return null;
if (string.IsNullOrEmpty(target.scene.path))
return null;
var selection = Selection.GetFiltered<GameObject>(SelectionMode.TopLevel);
if (selection.Any(x => EditorUtility.IsPersistent(x)))
return null;
if (!selection.Contains(target))
return null;
return selection;
}
static void CreateSubSceneAndAddSelection(object target)
{
GameObject gameObjectTarget = (GameObject)target;
var validSelection = GetValidGameObjectForSubSceneCreation(gameObjectTarget);
if (validSelection == null)
return;
CreateSubSceneAndMoveObjectInside(gameObjectTarget.scene, gameObjectTarget.transform.parent, validSelection, gameObjectTarget.name);
}
static void CreateSubSceneAndMoveObjectInside(Scene parentScene, Transform parent, GameObject[] objects, string name)
{
EditorSceneManager.MarkSceneDirty(parentScene);
var srcPath = parentScene.path;
var dstDirectory = Path.Combine(Path.GetDirectoryName(srcPath), Path.GetFileNameWithoutExtension(parentScene.path));
var dstPath = Path.Combine(dstDirectory, name + ".unity");
Directory.CreateDirectory(dstDirectory);
var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Additive);
scene.isSubScene = true;
foreach (var go in objects)
{
go.transform.SetParent(null, true);
SceneManager.MoveGameObjectToScene(go, scene);
}
EditorSceneManager.SaveScene(scene, dstPath);
var sceneAsset = AssetDatabase.LoadAssetAtPath<SceneAsset>(dstPath);
var gameObject = new GameObject(name, typeof(SubScene));
gameObject.SetActive(false);
var subScene = gameObject.GetComponent<SubScene>();
subScene.SceneAsset = sceneAsset;
if (parent)
gameObject.transform.parent = parent;
else
SceneManager.MoveGameObjectToScene(gameObject, parentScene);
EditorEntityScenes.WriteEntityScene(subScene);
gameObject.SetActive(true);
Selection.activeObject = gameObject;
}
}
}