找回密码
 立即注册
查看: 450|回复: 4

[笔记] 想便宜一个UnityIMGUI编纂器代码框架(一)

[复制链接]
发表于 2023-10-10 10:55 | 显示全部楼层 |阅读模式
比来写了不少编纂器代码,然后在想这个事情。
一般来说仿佛城市用Unity自带的IMGUI或者使用一些插件比如Odin(个人十分安利这个插件,因为确实太强大了),还有就是使用Unity新出的UIToolKit。老的IMGUI用起来很难受,但是这么多年也基本习惯了。UIToolKit的UIBuilder用起来倒是很强大,但是本身已经习惯了IMGUI,而且这种方式对于我来说,总感觉过于繁琐了,所以一直不习惯。用起来斗劲简洁简便的倒是OdinInspector,使用标签的方式开发,个人用起来很舒服。但是奈何它太大了而且还收费,不外仿佛出了免费版的有一些核心功能。但是不确定商用上是否有什么风险,所以个人决定测验考试把Unity的EditorGUI对象化,甚至组件化,让它开倡议来像使用UGUI一样开发。本人程度不怎么样,而且是个人心血来潮,三分钟热度的事情,很有可能会鸽,到时候请口下留情。
首先既然要对象化就得有一个所有UI组件的基类,我把它叫做XObject,因为名字没想好,就暂时以X来定名,不外也是我笔名的拼音首字母也挺契合。
我们来总结一下这个XObject都应该由什么构成,个人是这么设计的:
首先是id,每一个组件都需要独一的标识,所以id是必不成少的。
其次是实现绘制的虚方式,子类担任后重写该方式用来实现绘制。
还有该组件感化于的window。
public class XObject : ScriptableObject
{
    static int counter;
    /// <summary>
    /// 独一标识
    /// </summary>
    public readonly int id;


    protected XWindow m_Window;

    /// <summary>
    /// 感化于的界面
    /// </summary>
    public XWindow Windows => m_Window;

    public XObject(XWindow window)
    {
        id = counter++;
        m_Window = window;
    }

    /// <summary>
    /// 实现逻辑和绘制的方式
    /// </summary>
    public virtual void OnGUI()
    {

    }
}
上述代码中引用了XWindow,它是一个担任了EditorWindow的子类,使用它将会对EditorWindow进行一层封装。以下是简单的封装还未详细扩展。
public class XWindow : EditorWindow
{
    public List<XObject> objs;

    protected virtual void Awake()
    {
        objs = new List<XObject>();
    }

    private void OnGUI()
    {
        for (int i = 0; i < objs.Count; i++)
        {
            objs.OnGUI();
        }
    }

    protected virtual void OnDisable() { }
    protected virtual void OnEnable() { }
    protected virtual void OnSelectionChange() { }
    protected virtual void OnFocus() { }
    protected virtual void OnLostFocus() { }
    protected virtual void OnHierarchyChange() { }
    protected virtual void OnInspectorUpdate() { }
}
XWindow的OnGUI方式来调用各个组件的OnGUI来实现绘制。但是objs这个列表里就需要各个组件注册进来了,所以咱们需要在xobject构造的时候加这么一句。
    public XObject(XWindow window)
    {
        id = counter++;
        m_Window = window;
        window.objs.Add(this);
    }
两个基类就大致完成了。
<hr/>更新一下:由于XObject为C#原生类,所以在每次编译脚本的时候XWindow中列表存放的xobject城市被销毁,所以我暂时把它改为了担任 ScriptableObject 的子类。
发表于 2023-10-10 10:55 | 显示全部楼层
有空研究点别的吧,这玩意一没价值,二没前途;顺道你把XObject标记上[Serialize],应该是这个,System下的一个特性,然后就能被EditorWindow序列化了
发表于 2023-10-10 10:56 | 显示全部楼层
IMGUI主要是性能过不去,你还不如把UITooki改成UGUI化
发表于 2023-10-10 10:57 | 显示全部楼层
序列化之后脚本编译也是会被销毁的,你自己试试,毕竟是原生类。
发表于 2023-10-10 10:58 | 显示全部楼层
性能好不好无所谓,毕竟这东西又不会打包出去。而且IMGUI最少用了五年了,习惯已经难改掉了,让我用UItoolkit那套反而会难受的要死,最主要的那个感觉uxml太麻烦了,好用是好用但就是不习惯,只要imgui还支持一天我估计我就是一行一行敲也不会用那玩意儿。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-2 12:48 , Processed in 0.104632 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表