unity编译器扩展功能(自定义窗口的添加)

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脚本)

发布了52 篇原创文章 · 获赞 47 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44302602/article/details/103668224