Unity3D Editor之快捷创建及摆放模型
最近学习了一下Unity Editor的一些基础知识,在学习的过程中实现了一个小功能,对其中部分知识的运用。
通过这两个脚本可以实现简单的在Scene窗口展现四种类型的按钮,选择一种按钮之后在场景的任何物体上点击鼠标右键会自动实例化刚刚选中的物体,下图就是实例化之后的物体
话不多说,上代码:
using UnityEngine;
//对象类型的枚举,根据枚举类型来改变功能函数中的创建类型
public enum ObjectType
{
cube,
capsule,
sphere,
cylinder
}
public class CreateCube : MonoBehaviour
{
public GameObject cube;
public GameObject capsule;
public GameObject sphere;
public GameObject cylinder;
public GameObject gameObject;
public Vector3 point;
/// <summary>
/// 模型的高度
/// </summary>
public float height;
public ObjectType objectType;
/// <summary>
/// 根据当前的状态选择对象
/// </summary>
public void CreateObj()
{
switch (objectType)
{
case ObjectType.capsule:
gameObject = capsule;
break;
case ObjectType.cube:
gameObject = cube;
break;
case ObjectType.cylinder:
gameObject = cylinder;
break;
case ObjectType.sphere:
gameObject = sphere;
break;
}
Instantiate(gameObject, point,Quaternion.identity);
}
}
编辑器脚本
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(CreateCube))]//关联要自定义的脚本,此处是CreateCube
public class CreateCubeEditor : Editor
{
CreateCube createCube;
public void OnEnable()
{
createCube = (CreateCube)target;
}
/// <summary>
/// 重绘检视图(函数内部为空时,检视面板的属性都隐藏)
/// </summary>
public override void OnInspectorGUI()
{
//恢复默认的检视图(当这一句代码在最后时,检视图上的修改以此部分的为准)
DrawDefaultInspector();
if(GUILayout.Button("创建方块"))
{
createCube.CreateObj();
}
}
/// <summary>
/// 在场景视图中绘制自定义UI的语句必须在这个函数执行
/// </summary>
private void OnSceneGUI()
{
Handles.BeginGUI();
GUILayout.BeginVertical();
if(GUILayout.Button("Cube"))
{
createCube.objectType = ObjectType.cube;
}
if(GUILayout.Button("capsule"))
{
createCube.objectType = ObjectType.capsule;
}
if(GUILayout.Button("sphere"))
{
createCube.objectType = ObjectType.sphere;
}
if(GUILayout.Button("cylinder"))
{
createCube.objectType = ObjectType.cylinder;
}
//Unity GUI事件类型为点击鼠标按键时
if(Event.current.button==1&&Event.current.type==EventType.MouseDown)
{
Ray ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);
RaycastHit hit;
CreateCube createCube = (CreateCube)target;
if (Physics.Raycast(ray,out hit))
{
createCube.point = hit.point+new Vector3(0,createCube.height/2,0);
createCube.CreateObj();
}
}
}
}