U3D自定义Inspector项未触发保存事件的解决方案

1.问题描述与解决方案

1.1.说明

应该只有起步做U3D编辑器插件的部分同行需要了解本文。

该问题源于在做UI插件的时候,发现Inspector面板上手动修改值后,没有触发U3D编辑器本身的修改事件,导致这次操作无法保存且无法撤销。

修改事件被触发的具体表现为文件名最右边有星号‘*‘,现在大多数文本编辑器中内容改变也基本如此表现。

1.2.解决方案

这里我列出两种解决方案:

(下面都以待修改的对象为PlayerControl类型的obj变量)

public class PlayerControl : MonoBehaviour {
    public int intVal = 0;
    public List<int> listVal = new List<int>();
}

1.利用UnityEngine中的Undo类,比如修改obj中类型为int的成员变量intVal:

using UnityEditor;

public class test : Editor {

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        var obj = target as PlayerControl;
        Undo.RecordObject(obj,"obj change");
        obj.intVal = 1;
    }
}

但如果obj中的一个成员变量为引用类型,并且变动的时候引用未变,那么RecordObject就不会生效。比如List类型的变量增加了一个元素,这个变量起始内存地址没变,但是其大小增加了,这个时候应使用第二种方法,或者重新实例化对象:

using System.Collections.Generic;
using UnityEditor;

public class test : Editor {

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        var obj = target as PlayerControl;
        Undo.RecordObject(obj,"obj change");
        // obj.listVal.Add(1); // 这样无法触发Undo
        obj.listVal = new List<int>(obj.listVal);
        obj.listVal.Add(1);
    }
}

2.利用EditorUtility类中的SetDirty标记该对象已改动:

using UnityEditor;

public class test : Editor {

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        var obj = target as PlayerControl;
        obj.listVal.Add(1);
        EditorUtility.SetDirty(obj);
    }
}

不知道U3D本身的撤销系统具体是否是差量保存,也不好说上面两种方式各自的好坏。

2.总结

在使用别人的东西的时候(引擎、库),多看说明文档和接口,特别是帮助相关类的接口(类名包含Helper,Tool,Utility等词汇)。

时间: 2024-10-13 01:00:12

U3D自定义Inspector项未触发保存事件的解决方案的相关文章

vb.net WPF webbrowser window.close 关闭后不触发 WindowClosing 事件 WNDPROC解决方案

 #Region "WPF 当浏览器窗口关闭时触发 Quit事件 " #If OnSourceInitialized Then Protected Overrides Sub OnSourceInitialized(e As EventArgs) 'onload 等句柄创建后引用WSInitialized(Me, e) WSInitialized(Me, e) MyBase.OnSourceInitialized(e) End Sub #Else Private Sub LyWeb

针对部分iphone及小米手机不触发seek事件的解决方案

在做手机页面的时候碰到个需求,就是要求视频不能快进和后退.查到有个seeking和seeked函数应该在寻址的时候触发,但是经过测试发现,4s及小米2以上的浏览器无法触发这两个函数.而且同时无法检测到Media.seeking的状态,打印出来全部是false. 如果去掉controls,在大部分的android手机中都没有问题,不显示控制器.但是小米浏览器会自动全屏播放,控制器包括进度条都会显示出来.iphone也会自动全屏,退出全屏就无法播放视频.但是iphone5以上可以监听到seeking

element-ui 点击编辑弹出dialog组件中select组件绑定值改变,但是不触发change事件

代码结构如下: 现象视频如下: 现象原因:经过排查发现 此时点击操作不触发chang事件,后台响应数据中没有订单取消原因orderCanleRemark字段,此时导致不触发change事件, 解决方案:方案1,:让后台配合响应该字段,无论是否为空都响应该字段 方案2:在后台响应数据赋值给,this.form之前,手动添加该字段到后台响应数据中 代码如下: 原文地址:https://www.cnblogs.com/liujiazhu/p/8649810.html

金蝶VB插件,单据保存时总是触发GetFocus事件

在做金蝶插件时,在保存时,总是触发GetFocus事件,让人很伤心啊 Private Sub m_BillInterface_GotFocus(ByVal sKey As String, ByVal dctData As KFO.IDictionary, ByVal curDspValue As Variant, ByVal Col As Long, ByVal Row As Long, Cancel As Boolean) If (Row > 0 And r <> -110 And r

vue中触发键盘事件的两种方法和如何自定义键位事件,完整代码!

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" con

Unity3D导入外部任务模型无法触发鼠标事件解决方案

前几日 在做U3D测试的时候 导入了网上的一个人物模型 但是后来发现无论如何该模型都无法响应诸如:OnMouseDown 这些鼠标事件 又用U3D自带的水管工做了测试 发现不是我系统的问题= = 水管工对鼠标事件还是有反应的 遂百度之 查到的解决方法是 在Project窗口中选中导入FBX模型,在右边的Inspector中选中Generate Colliders 说是因为U3D默认导入的模型没有启动碰撞机Colliders 但是------ 我在确定模型的Generate Colliders被选

自定义Inspector检视面板

Unity中的Inspector面板可以显示的属性包括以下两类:(1)C#以及Unity提供的基础类型:(2)自定义类型,并使用[System.Serializable]关键字序列化,比如: [System.Serializable] public class TestClass { public Vector3 vec = Vector3.zero; public Color clr = Color.green; } 也可以使用[System.NonSerialized]标记不需要显示的属性,

每日学习心得:SharePoint 2013 自定义列表项添加Callout菜单项、文档关注、SharePoint服务端对象模型查询

前言: 前一段时间一直都比较忙,没有什么时间进行总结,刚好节前项目上线,同时趁着放假可以好好的对之前遇到的一些问题进行总结.主要内容有使用SharePoint服务端对象模型进行查询.为SharePoint 自定义列表项添加callout菜单.希望能够给大家带来一些帮助. 1.  在aspx页引用可视化Web部件 有时候会需要在页面中引用项目中创建的可视化Web部件,具体步骤有以下这几步: 1) 在aspx页面顶部注册该可视化Web部件 示例如下: <%@ Register Tagprefix=&qu

[038] 微信公众帐号开发教程第14篇-自定义菜单的创建及菜单事件响应

微信5.0发布 2013年8月5日,伴随着微信5.0 iPhone版的发布,公众平台也进行了重要的更新,主要包括: 1)运营主体为组织,可选择成为服务号或者订阅号: 2)服务号可以申请自定义菜单: 3)使用QQ登录的公众号,可以升级为邮箱登录: 4)使用邮箱登录的公众号,可以修改登录邮箱: 5)编辑图文消息可选填作者: 6)群发消息可以同步到腾讯微博. 其中,大家议论最多的当属前两条,就是关于帐号类型和自定义菜单的更新,我这里做几点补充说明: 1)目前公众号类型分为两种:服务号和订阅号,8月5日