本文由RoadLun原创,转载请声明
效果如下:设置生成数量,点击生成,在规定矩形区域内随机生成球体(在游戏未运行状态下)。
需求:编写一个窗口编辑器,实现在指定矩形区域内随机生成规定数值的游戏对象(在游戏未运行的状态下)。
面向工具开发:
面向工具开发是面向对象思想的一种延伸,旨在将功能封装成简单易懂的编辑器,来完成一些繁琐且冗余的工作,降低开发难度,缩短开发时间。
编辑器脚本不需要(无法)挂载对象,不需要运行游戏即可使用。
进入正题:
接下来进行脚本编写,大体思路如下:
1.创建一个编辑器脚本,注意:1.引入using UnityEditor命名空间;2.继承自EditorWindow;3.添加菜单栏及显示窗口函数(下图)
2.编写OnGUI函数,用GUILayout、EditorGUILayout等函数绘制编辑器窗口
3.编写按钮触发函数,当按下按钮时触发这个函数
4.随机生成的思路
确定矩形的思路:在一个2D平面内,确定对角两个点的位置就可以确定这个矩形,所以我获取两个点,以这两个点的z值,x值作为生成随机数的最大最、小值。然后生成一个随机Vector类型作为生成点。
源码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class RandomInstanceEdi : EditorWindow {
//编辑器脚本,用来随机生成一些GameObject,获取四个transform,在这四个transform里面生成
//n个gameobject物体(n是输入的一个整形)
GameObject insObj; //随机生成的对象
//下面两个点,在这两个点围成的矩形内随机生成
Transform leftDown; //左下
Transform rightUp; //右上
int insNum; //生成的数量
//利用构造函数来设置窗口名称
RandomInstanceEdi()
{
titleContent = new GUIContent("随机生成Edi");
}
//添加菜单栏用于打开窗口
[MenuItem("Tool/RandomInstance")]
static void ShowWindow()
{
EditorWindow.GetWindow(typeof(RandomInstanceEdi));
}
//开始绘制编辑器窗口
private void OnGUI()
{
//编辑器窗口的布局,整体上是自上而下的
GUILayout.BeginVertical();
//绘制一个拖动框,前面配以文字InstanceObj,用来设置生成什么对象
insObj = (GameObject)EditorGUILayout.ObjectField("生成物", insObj, typeof(GameObject), true);
//绘制生成数量输入框
insNum = EditorGUILayout.IntField("生成数",insNum);
//绘制两个生成点输入框
leftDown =(Transform)EditorGUILayout.ObjectField("左下点", leftDown, typeof(Transform), true);
rightUp = (Transform)EditorGUILayout.ObjectField("右上点", rightUp, typeof(Transform), true);
//绘制生成按钮并设置回掉函数
if (GUILayout.Button("生成"))
{
InsObj();
}
}
//按钮对应的函数
void InsObj()
{
//循环insNum次
for (int i = 1; i <=insNum ; i++)
{
//生成一个随机的Vector3作为生成点
float x = Random.Range(leftDown.position.x, rightUp.position.x);
float z = Random.Range(leftDown.position.z, rightUp.position.z);
float y = leftDown.position.y;
Vector3 insVec = new Vector3(x, y, z);
//生成
Instantiate(insObj, insVec, Quaternion.identity);
}
Debug.Log("生成完成");
}
}
这个脚本编写完成后unity选项栏出现一个Tool选项
点开Tool出现
RandomInstanceEdi,点开就是刚刚编写完成的编辑器就窗口。