unity有一个很强大的功能 就是我们自己可以创建窗口
像这样
对你没有看错 这个就是自己添加的 我们可以从Tools等选项中打开 然后很容易的同时修改很多不同物体之间的参数
其中的每个字 每句话 按钮等都可以由我们来编辑
比如在一个稍微大的一点的游戏中 我们可能设置好多敌人
每种敌人出来模型的不同 我们还可能设置不同的血量 行走速度 攻击速度等等参数
如果我们这时需要同时改变二三十种敌人的参数 是很麻烦的
这时可以用我们的窗口来快捷操作
当然这只是一个最最简单的使用
制作过程
我推荐大家可以看下我的上一篇博客 对这个会很有帮助
我的上一篇博客(https://blog.csdn.net/weixin_44302602/article/details/103655488)
上篇博客中介绍到了Selection类和关于undo注册操作记录的知识 这里就不多说了
然后呢 给大家把代码先弄出来
首先创建一个要改变的脚本(类)
public class Text : MonoBehaviour
{
public int hp ;
public int speed;
}
然后是创建窗体的脚本
注意:这个脚本要继承ScriptableWizard
public class Hp : ScriptableWizard
{
[MenuItem("Tools/CreateWizard")]//创建对话框
static void CreateWizard()
{
ScriptableWizard.DisplayWizard<Hp>("统一修改", "Change value","Change");
//三个参数分别是 标题名称 第一个按钮名称 第二个按钮名称
//第一个按钮点击后会关闭窗口 第二个不会
}
public int AddHp;
public int AddSpeed;
public GameObject set;
public Transform get;
private void OnEnable()
{
//当窗口被创建出来被调用的
AddHp = EditorPrefs.GetInt("AddHp");
AddSpeed = EditorPrefs.GetInt("AddSpeed");
//保存上次的数据 第一次打开会和开始初始化一样的
}
private void OnWizardCreate()
{
GameObject[] emenys = Selection.gameObjects;//返回数组
foreach (var go in emenys)//遍历选中的物体
{
Text tt = go.GetComponent<Text>();
Undo.RecordObject(tt, "record");//实现记录操作 撤销
tt.hp += AddHp;
tt.speed += AddSpeed;
}
ShowNotification(new GUIContent(Selection.gameObjects.Length + "个游戏物体被修改了"));
//提示输出 语句(出现然后消失)
}
//当字段被修改的时候调用
private void OnWizardUpdate()
{
errorString = null;//置空错误信息
helpString = null;//置空提示信息
if(Selection.gameObjects.Length > 0)
{
helpString = "您当前选择了" + Selection.gameObjects.Length + "个物体";
}
else
{
errorString = "请至少选择一个物体";
}
EditorPrefs.SetInt("AddHp", AddHp);
EditorPrefs.SetInt("AddSpeed", AddSpeed);
//相对于运行过程中的PlayerPrefs保存相同的用法
}
//当选择的物体发生改变的时候触发该方法
private void OnSelectionChange()
{
OnWizardUpdate();
}
//第二个按钮的点击事件
private void OnWizardOtherButton()
{
OnWizardCreate();
}
}
我的注释可以说写的非常细致了 大家自己认真看一下应该不难理解
我们可以测试一下 可以做到同时修改好多物体的参数(前提挂载Text脚本)