在Unity中,编辑器的相关操作,需要添加UnityEditor这个引用,里面是一些编辑器操作方式
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEditor;//编辑器需要添加的引用
using UnityEditor.SceneManagement;//编辑器中的场景管理
//通过编辑器工具类,来实现编辑器的工具修改场景内容
public class One_clickModification : EditorWindow
{
[MenuItem("Tools/添加组件")]//这个是将内容添加到tools里面
public static void Open()
{
/*第一个参数窗口类型,决定窗口操作逻辑
* 第二个参数确定是否为浮动窗口,选择false可有停靠效果
* 第三个参数 显示窗口的标题
* 第四个 目前不知道什么意思
*/
EditorWindow.GetWindow(typeof(One_clickModification), true);
}
//这个是静态变量,用于赋值使用
static string toInteractiveObject;
static string toInteractedObject;
static string toRayInspection;
//这里添加的是常规GUI方式,用来动态输入获取数值,并赋值给上面的静态变量
public GUIContent gUI = new GUIContent();
public GUIContent gUI1 = new GUIContent();
public GUIContent gUI2 = new GUIContent();
void OnGUI()
{
gUI.text = EditorGUILayout.TextField("交互物体",gUI.text, GUILayout.MinWidth(100));
gUI1.text = EditorGUILayout.TextField("被交互物体", gUI1.text, GUILayout.MinWidth(100));
gUI2.text = EditorGUILayout.TextField("射线检测", gUI2.text, GUILayout.MinWidth(100));
toInteractiveObject = gUI.text;
toInteractedObject = gUI1.text;
toRayInspection = gUI2.text;
if (GUILayout.Button("确认更换"))
{
Change();
}
}
public static void Change()
{
string[] Interactive = toInteractiveObject.Split('|');
string[] Interacted = toInteractedObject.Split('|');
string[] Ray = toRayInspection.Split('|');
//给交互物体修改内容
for (int i = 0; i < Interactive.Length; i++)
{
GameObject game = GameObject.Find(Interactive[i]);
if (game != null)
{
if (game.transform.GetComponent<MyGameObject>() == null)
{
game.AddComponent<MyGameObject>();
}
if (game.transform.GetComponent<BoxCollider>() == null)
{
game.AddComponent<BoxCollider>();
}
if (game.transform.GetComponent<Rigidbody>() == null)
{
game.AddComponent<Rigidbody>();
game.transform.GetComponent<Rigidbody>().useGravity = false;
game.transform.GetComponent<Rigidbody>().isKinematic = true;
}
if (game.transform.GetComponent<GrabableObject>() == null)
{
game.AddComponent<GrabableObject>();
}
}
}
for (int i = 0; i < Interacted.Length; i++)
{
GameObject game = GameObject.Find(Interacted[i]);
if (game != null)
{
if (game.transform.GetComponent<MyGameObject>() == null)
{
game.AddComponent<MyGameObject>();
}
if (game.transform.GetComponent<BoxCollider>() == null)
{
game.AddComponent<BoxCollider>();
game.transform.GetComponent<BoxCollider>().isTrigger = true;
}
}
}
for (int i = 0; i < Ray.Length; i++)
{
GameObject game = GameObject.Find(Ray[i]);
if(game!=null)
{
if (game.transform.GetComponent<MyGameObject>() == null)
{
game.AddComponent<MyGameObject>();
}
if (game.transform.GetComponent<BoxCollider>() == null)
{
game.AddComponent<BoxCollider>();
}
}
}
//这个和在编辑器模式下按ctrl+S是一个道理,即保存当前场景改动
EditorSceneManager.SaveScene(UnityEngine.SceneManagement.SceneManager.GetActiveScene());
}
}
这个是效果图