CN116954951A - 一种基于unity的撤销与重做的方法及系统 - Google Patents
一种基于unity的撤销与重做的方法及系统 Download PDFInfo
- Publication number
- CN116954951A CN116954951A CN202311198125.5A CN202311198125A CN116954951A CN 116954951 A CN116954951 A CN 116954951A CN 202311198125 A CN202311198125 A CN 202311198125A CN 116954951 A CN116954951 A CN 116954951A
- Authority
- CN
- China
- Prior art keywords
- redo
- control module
- function
- operation event
- event
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 22
- 238000012544 monitoring process Methods 0.000 claims description 10
- 238000005538 encapsulation Methods 0.000 claims description 3
- 230000006870 function Effects 0.000 abstract description 125
- 238000012423 maintenance Methods 0.000 abstract description 5
- 230000009471 action Effects 0.000 description 13
- 238000012217 deletion Methods 0.000 description 6
- 230000037430 deletion Effects 0.000 description 6
- 239000003795 chemical substances by application Substances 0.000 description 5
- 238000010586 diagram Methods 0.000 description 4
- 230000000694 effects Effects 0.000 description 4
- 238000012986 modification Methods 0.000 description 4
- 230000004048 modification Effects 0.000 description 4
- 230000003068 static effect Effects 0.000 description 3
- 230000004075 alteration Effects 0.000 description 2
- 230000007547 defect Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 239000003607 modifier Substances 0.000 description 1
- 230000008569 process Effects 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/542—Event management; Broadcasting; Multicasting; Notifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/546—Message passing systems or structures, e.g. queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/547—Remote procedure calls [RPC]; Web services
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Multimedia (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种基于unity的撤销与重做的方法及系统,涉及计算机技术领域,该方法包括:通过脚本获得控制模块;在控制模块外部定义一个包含预设函数的接口和多个代理对象,代理对象的参数类型与接口类型对应;在控制模块内部定义一个类并进行初始化;在控制模块内部定义一个用于存放操作事件的集合,集合中所有操作事件按照执行先后顺序进行排列;在控制模块内部定义并初始化第一成员变量,第一成员变量指向集合中新增操作事件的位置下标;创建一个用于继承所述接口的实体类,基于控制模块和实体类,实现对所述集合中操作事件的撤销与重做。本发明解决unity底层无法提供撤销重做的函数和接口的问题,同时还降低了开发者学习和维护成本。
Description
技术领域
本发明涉及计算机技术领域,具体地,涉及一种基于unity的撤销与重做的方法及系统。
背景技术
随着时代进步,人们越来越多的使用软件提供的功能来制作作品,在制作过程中可能会出现需要撤销步骤或重做步骤的情况。Unity作为游戏引擎虽然也提供了撤销与重做的功能,但只能在编辑器中使用,unity底层并没有给开发者提供撤销与重做的函数与接口,导致unity底层对于自定义操作无法进行撤销重做操作,而市面上基于unity的应用程序中提供的撤销与重做的功能都由开发者自主研发,不仅开发代价较大,缺陷较多,由于unity底层缺少撤销与重做的函数和接口,导致项目之间不能复用,程序开发和维护成本也较高。
发明内容
为解决unity底层无法提供撤销与重做的函数与接口的问题,本发明提供了一种基于unity的撤销与重做的方法,所述方法包括以下步骤:
步骤1:新建预设脚本,基于所述预设脚本,获得控制模块;
步骤2:在所述控制模块外部定义一个包含预设函数的接口和若干个代理对象,所述代理对象的参数类型与所述接口的类型对应;
步骤3:在所述控制模块内部定义一个类并对所述类进行初始化;
步骤4:在所述控制模块内部定义一个用于存放所有执行过的操作事件的集合,所述集合中所有操作事件按照执行先后顺序进行排列;
步骤5:在所述控制模块内部定义并初始化第一成员变量,所述第一成员变量指向所述集合中新增操作事件的位置下标;
步骤6:创建一个用于继承所述接口的实体类,基于所述控制模块和所述实体类,实现对所述集合中操作事件的撤销与重做。
本发明通过预设脚本获得控制模块,并在控制模块外部或内部定义并初始化接口、代理对象、类、集合和第一成员变量,通过集合和第一成员变量的方式来实现多次撤销与重做的功能,且操作顺序不会发生混乱,通过设置一个实体类来继承控制模块外部定义的接口,将撤销重做主要逻辑封装在实体类和控制模块,不仅为开发者提供了撤销重做的函数和接口,实现了unity底层可以对自定义操作进行撤销重做操作的效果,同时开发者只需要重点关注实体类中定义的撤销、重做和删除事件本身需要改变的内容,降低了学习和维护成本。
进一步地,所述步骤5包括:基于所述控制模块获得向外部提供添加操作事件的函数;当添加新的操作事件时,在所述添加操作事件的函数中判断所述集合中存储事件的个数是否达到上限,若是,对所述集合中第一个加入的操作事件进行移除,并将新的操作事件添加至所述集合中;若否,将新的操作事件添加至所述集合中。
其中,当需要添加新的操作事件时,需要判断集合中存储事件的数量是否达到上限,如果是,则需要将从第一个加入的事件开始移除,如需要添加3个新的操作事件,则需要移除3个最早加入集合的操作事件,如果否,则直接将新的操作事件添加至集合中。
进一步地,所述步骤5还包括:基于所述控制模块获得向外部提供撤销操作事件的函数;基于所述位置下标,利用所述撤销操作事件的函数获取需要撤销的操作事件,并对所述第一成员变量的值进行减一操作;遍历撤销操作事件的所有操作,分别调用执行撤销操作事件之前的代理消息、执行撤销操作事件和执行撤销操作事件之后的代理消息。
其中,通过位置下标获取需要撤销的事件,当该时间完成撤销操作后,对第一成员变量的值进行减一操作,将位置下标移动到撤销后的事件下方,完成撤销操作。而调用撤销操作前后的代理消息,则是为了实现多次撤销操作,且操作顺序不会发生混乱。
进一步地,所述步骤5还包括:基于所述控制模块获得向外部提供重做操作事件的函数;基于所述位置下标,利用所述重做操作事件的函数获取需要重做的操作事件,并对所述第一成员变量的值进行加一操作;遍历重做操作事件的所有操作,分别调用执行重做操作事件之前的代理消息、执行重做操作事件和执行重做操作事件之后的代理消息。
其中,通过位置下标获取需要重做的事件,当该事件完成重做操作后,对第一成员变量的值进行加一操作,将位置下标移动到重做后的事件下方,完成重做操作。而调用重做操作事件前后的代理消息,则是为了实现多次重做操作,且操作顺序不会发生混乱。
进一步地,所述创建一个用于继承所述接口的实体类包括:通过所述实体类实现所述接口中的预设函数,在所述实体类实现的添加函数中,调用在所述控制模块中定义的添加操作事件的函数作为所述添加函数;在所述实体类实现的撤销函数中,将判断参数的值修改为允许删除,并调用撤销回调函数,在所述控制模块调用实例化对象的删除事件时,所述判断参数用于判断是否能执行删除已记录的操作;在所述实体类实现的重做函数中,将判断参数的值修改为不允许删除,并调用重做回调函数;在所述实体类实现的删除函数中,对所述判断参数的值进行判断,当判断出所述判断参数的值为允许删除时,调用并执行删除回调函数,当所述删除回调函数执行完成后,销毁所述撤销回调函数、所述重做回调函数和所述删除回调函数,并修改所述判断参数的值为不允许删除。
其中,通过实体类实现接口中的预设函数,对于添加函数,调用在控制模块中定义的添加操作事件的函数,对于撤销和重做函数,则先需要修改判断参数的值,对于撤销操作而言,需要将判断参数修改为允许删除,然后再调用撤销回调函数,而对于重做操作而言,则需要将判断参数修改为不允许删除,再调用重做回调函数。当判断参数的值为允许删除时,才调用删除函数进行删除已记录的操作。且当删除函数执行完成后,销毁撤销回调函数、重做回调函数和删除回调函数,并将判断参数进行初始化,即将判断参数的值修改为不允许删除。将撤销重做的主要逻辑和函数封装在实体类中,开发者只需要重点关注从撤销重做的实体类中定义的撤销、重做和删除的事件本身需要改变的内容,降低了学习和维护成本。
进一步地,所述步骤6包括:在所述控制模块和所述实体类外部,判断对所述操作事件执行预设操作之前或者之后是否有其他操作,若是,在所述控制模块中注册添加、撤销、重做和删除四个代理消息回调的监听,所述预设操作为撤销或者重做操作。
其中,如需要针对执行撤销或重做操作之前、执行撤销或重做操作之后的其他操作时,需要在控制模块的注册添加、撤销、重做和删除四个代理回调的监听。当控制模块触发撤销或重做事件时,将会在执行撤销行为之前调用即将开始执行撤销代理事件、执行撤销行为之后调用已执行完成撤销代理事件,或者在执行重做行为之前调用即将开始执行重做代理事件、执行重做行为之后调用已执行完成重做代理事件。
进一步地,所述步骤6还包括:在所述控制模块和所述实体类外部,判断所述操作事件的所有操作是否都需要被撤销与重做,若是,在所述操作事件的操作类中实例化一个所述实体类的对象,基于所述实体类的对象,注册撤销、重做和删除的回调函数的监听事件;在注册完成的撤销、重做和删除的回调函数中,定义撤销、重做和删除的内容。
其中,如果需要针对任何操作做记录并允许撤销和重做的功能,就需要在操作类中实例化一个实体类的对象,利用该实例化对象,注册撤销、重做和删除的回调函数的监听事件,并在注册的撤销、重做和删除的回调函数中,定义需要撤销、重做和删除的内容。当控制模块获取到需要撤销、重做和删除的回调事件时,便可以直接调用上述在回调函数中定义的内容,完成对撤销和重做功能的使用。
进一步地,所述步骤5还包括:在所述控制模块内部定义并初始化第二成员变量,通过修改所述第二成员变量的值来控制所述集合中存放操作事件数量的上限。
其中,通过设置一个整型的第二成员变量,并通过修改第二成员变量的值来控制集合中存放操作事件数量的上限。
进一步地,当修改所述第二成员变量的值时,将所述集合中的所有事件执行所述接口中的删除函数,当所述集合中的所有事件均执行完所述删除函数后,清除所述集合中缓存的数据。
其中,当需要修改第二成员变量的值时,由于第二成员变量是用来控制集合中存放操作事件数量的上限,因此需要对以往集合中存储的事件通过执行删除函数进行删除,再清除集合中缓存的数据。
为解决unity底层无法提供撤销与重做的函数与接口的问题,本发明还提供了一种基于unity的撤销与重做的系统,所述系统包括:
脚本单元,用于新建预设脚本,基于所述脚本,获得控制模块;
第一定义单元,用于在所述控制模块外部定义一个包含预设函数的接口和若干个代理对象,所述代理对象的参数类型与所述接口的类型对应;
第二定义单元,用于在所述控制模块内部定义一个类并对所述类进行初始化;
第三定义单元,用于在所述控制模块内部定义一个用于存放所有执行过的操作事件的集合,所述集合中所有操作事件按照执行先后顺序进行排列;
第四定义单元,用于在所述控制模块内部定义并初始化第一成员变量,所述第一成员变量指向所述集合中新增操作事件的位置下标;
封装单元,用于创建一个用于继承所述接口的实体类,基于所述控制模块和所述实体类,实现对所述集合中操作事件的撤销与重做。
本发明提供的一个或多个技术方案,至少具有如下技术效果或优点:
本发明通过将撤销重做主要逻辑封装在控制模块和撤销重做的实体类中,为开发者提供了撤销重做的函数和接口,即unity底层可以对自定义的操作进行撤销或重做操作,且项目之间能够复用,同时开发者只需要重点关注撤销重做实体类中定义的撤销、重做和删除事件本身需要改变的内容,大大降低了学习和维护成本。
本发明可以支持连续的记录操作、撤销和重做,支持记录操作后多次连续撤销,支持撤销后多次连续重做,支持多次撤销和重做,记录操作的多样化组合,限制性较低,可实施性较高。
附图说明
此处所说明的附图用来提供对本发明实施例的进一步理解,构成本发明的一部分,并不构成对本发明实施例的限定;
图1是本发明中一种基于unity的撤销与重做的方法流程示意图;
图2是本发明中集合存放操作事件的操作示意图;
图3是本发明中实体类调用各类函数的流程示意图;
图4是本发明中一种基于unity的撤销与重做的系统组成示意图。
具体实施方式
为了能够更清楚地理解本发明的上述目的、特征和优点,下面结合附图和具体实施方式对本发明进行进一步的详细描述。需要说明的是,在相互不冲突的情况下,本发明的实施例及实施例中的特征可以相互组合。
在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是,本发明还可以采用其他不同于在此描述范围内的其他方式来实施,因此,本发明的保护范围并不受下面公开的具体实施例的限制。
实施例一;
请参考图1,图1为本发明中一种基于unity的撤销与重做的方法流程示意图,所述方法包括以下步骤:
步骤1:新建预设脚本,基于所述预设脚本,获得控制模块;
步骤2:在所述控制模块外部定义一个包含预设函数的接口和若干个代理对象,所述代理对象的参数类型与所述接口的类型对应;
步骤3:在所述控制模块内部定义一个类并对所述类进行初始化;
步骤4:在所述控制模块内部定义一个用于存放所有执行过的操作事件的集合,所述集合中所有操作事件按照执行先后顺序进行排列;
步骤5:在所述控制模块内部定义并初始化第一成员变量,所述第一成员变量指向所述集合中新增操作事件的位置下标;
步骤6:创建一个用于继承所述接口的实体类,基于所述控制模块和所述实体类,实现对所述集合中操作事件的撤销与重做。
其中,控制模块继承自MonoBehavior,同时声明了一个公有的静态属性,在控制中心外部可以利用该静态属性调用类内部非静态的公有函数或属性。
其中,接口包含的预设函数为添加、撤销、重做和删除函数。若干个代理对象优选为四个,四个代理对象的参数类型与接口相对应,代理对象充当客户端与实际对象之间的中介,使用代理可以在不改变原始代码的情况下,添加额外的功能。这四个代理的消息对象将分别在执行撤销行为之前调用即将开始执行撤销代理事件、执行撤销行为之后调用已执行完成撤销代理事件、执行重做行为之前调用即将开始执行重做代理事件、执行重做行为之后调用已执行完成重做代理事件。
其中,在所述控制模块内部定义一个类并对所述类进行初始化。在控制模块内部定义一个类,该类中声明并初始化一个在步骤2中创建的接口类型的集合和一个在步骤2中创建接口的参数的构造函数,利用该构造函数将参数增加至声明的集合中。
其中,在所述控制模块内部定义一个用于存放所有执行过的操作事件的集合,所述集合中所有操作事件按照执行先后顺序进行排列。定义并初始化一个存放操作事件的集合,该集合用于存放当前所有执行过的操作事件,集合中所有事件均按操作事件加入顺序进行排列,即新增的操作事件均添加至集合的末尾处。
其中,控制模块内部定义并初始化第一成员变量,所述第一成员变量指向所述集合中新增操作事件的位置下标。定义并初始化一个整型的第一成员变量,该变量指向集合中新增操作事件的位置下标,通过下标可以获取需要撤销或者重做的事件,同时当执行了撤销或者重做操作后,通过对第一成员变量的值进行加一和减一操作,可以对下标进行移动。
其中,在控制模块内部可以重写Unity生命周期函数的Update,具体地,在该函数中监听键盘事件,可以通过监听键盘事件判断程序运行时,是否通过键盘快捷键触发撤销或者重做事件。可以将撤销与重做的函数采用公有的修饰符,允许通过其他的类直接调用撤销或重做的函数。
请参考图2,图2为本发明中集合存放操作事件的操作示意图,所述步骤5包括:基于所述控制模块获得向外部提供添加操作事件的函数;当添加新的操作事件时,在所述添加操作事件的函数中判断所述集合中存储事件的个数是否达到上限,若是,对所述集合中第一个加入的操作事件进行移除,并将新的操作事件添加至所述集合中;若否,将新的操作事件添加至所述集合中。
当需要添加新的操作事件到集合中时,首先判断集合中存储事件的个数是否达到上限,如果达到上限,此时就需要将第一个加入集合的操作事件进行移除,并将新的操作事件加入到集合中,如果未达到上限,则直接将新的操作事件加入到集合中。
其中,所述步骤5还包括:基于所述控制模块获得向外部提供撤销操作事件的函数;基于所述位置下标,利用所述撤销操作事件的函数获取需要撤销的操作事件,并对所述第一成员变量的值进行减一操作;遍历撤销操作事件的所有操作,分别调用执行撤销操作事件之前的代理消息、执行撤销操作事件和执行撤销操作事件之后的代理消息。
当集合中未存储任何事件时,规定第一成员变量的值为-1,如集合中包含了事件1、事件2、事件3、事件4和事件5,此时下标指向事件5,第一成员变量的值为4。首先通过下标获取需要撤销的事件5,将第一成员变量的值进行减一操作,此时第一成员变量的值为3,且指向事件4,完成撤销操作。且通过遍历撤销操作事件的所有操作,分别调用执行撤销操作事件之前的代理消息、执行撤销操作事件和执行撤销操作事件之后的代理消息,可以实现多次撤销操作,且维持操作之间的顺序。
其中,所述步骤5还包括:基于所述控制模块获得向外部提供重做操作事件的函数;基于所述位置下标,利用所述重做操作事件的函数获取需要重做的操作事件,并对所述第一成员变量的值进行加一操作;遍历重做操作事件的所有操作,分别调用执行重做操作事件之前的代理消息、执行重做操作事件和执行重做操作事件之后的代理消息。
如集合中包含了事件1、事件2、事件3和事件4,此时事件4执行了两次撤销操作,第一成员变量的值由3变为1,且下标指向事件2,此时通过下标获取需要进行重做的事件2,将第一成员变量的值进行两次加一操作,此时第一成员变量的值由1变为3,且下标指向事件4,完成重做操作。且通过遍历重做操作事件的所有操作,分别调用执行重做操作事件之前的代理消息、执行重做操作事件和执行重做操作事件之后的代理消息,实现多次重做操作。
请参考图3,图3为本发明中实体类调用各类函数的流程示意图,所述创建一个用于继承所述接口的实体类包括:通过所述实体类实现所述接口中的预设函数,在所述实体类实现的添加函数中,调用在所述控制模块中定义的添加操作事件的函数作为所述添加函数;在所述实体类实现的撤销函数中,将判断参数的值修改为允许删除,并调用撤销回调函数,在所述控制模块调用实例化对象的删除事件时,所述判断参数用于判断是否能执行删除已记录的操作;在所述实体类实现的重做函数中,将判断参数的值修改为不允许删除,并调用重做回调函数;在所述实体类实现的删除函数中,对所述判断参数的值进行判断,当判断出所述判断参数的值为允许删除时,调用并执行删除回调函数,当所述删除回调函数执行完成后,销毁所述撤销回调函数、所述重做回调函数和所述删除回调函数,并修改所述判断参数的值为不允许删除。
创建一个撤销重做的实体类来继承在步骤2中创建的接口,该实体类作为控制模块集中管理的操作事件的实例化对象,将负责响应具体的撤销、重做和删除内容。该类除了需要实现接口中所有的函数外,将包含但不限于构造函数、判断参数、添加、撤销、重做和删除回调函数。其中,该类的构造函数可以根据操作事件的需要,定义不同的用处,本实施例使用无参数的构造函数,该构造函数亦可以不再在该类中生命,对于构造函数的选择,本发明不做具体限定。对于该类实现的添加函数,直接调用在控制模块中定义的添加操作事件的函数;而对于该类实现的撤销函数,则需要先修改判断参数的值为允许删除,让该类能实现撤销操作,意味着将会删除已记录的操作,同时调用撤销回调函数;对于该类实现的重做函数,则需要修改判断参数的值为不允许删除,意味着将无法删除已记录的操作,同时调用重做回调函数;该类实现的删除函数,则是基于判断参数的值来判断是否执行删除操作,仅当判断参数的值为允许删除时,才执行删除函数再调用删除回调函数,并修改判断参数的值为不允许删除,相当于将判断参数初始化。
其中,所述步骤6包括:在所述控制模块和所述实体类外部,判断对所述操作事件执行预设操作之前或者之后是否有其他操作,若是,在所述控制模块中注册添加、撤销、重做和删除四个代理消息回调的监听,所述预设操作为撤销或者重做操作。
如需要针对执行撤销或重做操作之前、执行撤销或重做操作之后的其他操作时,需要在控制模块的注册添加、撤销、重做和删除四个代理回调的监听。当控制模块触发撤销或重做事件时,将会在执行撤销行为之前调用即将开始执行撤销代理事件、执行撤销行为之后调用已执行完成撤销代理事件,或者在执行重做行为之前调用即将开始执行重做代理事件、执行重做行为之后调用已执行完成重做代理事件。
其中,所述步骤6还包括:在所述控制模块和所述实体类外部,判断所述操作事件的所有操作是否都需要被撤销与重做,若是,在所述操作事件的操作类中实例化一个所述实体类的对象,基于所述实体类的对象,注册撤销、重做和删除的回调函数的监听事件;在注册完成的撤销、重做和删除的回调函数中,定义撤销、重做和删除的内容。
如果需要针对任何操作做记录并允许撤销和重做的功能,就需要在操作类中实例化一个实体类的对象,利用该实例化对象,注册撤销、重做和删除的回调函数的监听事件,并在注册的撤销、重做和删除的回调函数中,定义需要撤销、重做和删除的内容。当控制模块获取到需要撤销、重做和删除的回调事件时,便可以直接调用上述在回调函数中定义的内容,完成对撤销和重做功能的使用。
其中,所述步骤5还包括:在所述控制模块内部定义并初始化第二成员变量,通过修改所述第二成员变量的值来控制所述集合中存放操作事件数量的上限。
通过设置一个整型的第二成员变量,并通过修改第二成员变量的值来控制集合中存放操作事件数量的上限。如设置第二成员变量的值为20,表示该集合中最多能够存储20个操作事件,当修改第二成员变量的值为30时,则表示此时集合中最多能够存储30个操作事件。
其中,当修改所述第二成员变量的值时,将所述集合中的所有事件执行所述接口中的删除函数,当所述集合中的所有事件均执行完所述删除函数后,清除所述集合中缓存的数据。
当需要修改第二成员变量的值时,由于第二成员变量是用来控制集合中存放操作事件数量的上限,因此需要对以往集合中存储的事件通过执行删除函数进行删除,再清除集合中缓存的数据。
在本发明实施例中,我们需要通过鼠标拖动一个正方体,在屏幕范围内移动,当拖动行为结束后,记录正方体当前所在位置的坐标点,理解为一次拖动的结束位置,通过多次移动,可形成一组拖动轨迹,在拖动的任意时刻允许用户撤销一次或多次移动,允许用户重做一次或多次移动。具体地:
新建一个脚本,将脚本名称定义为MovingTest,MovingTest被默认继承自MonoBehaviour,在MovingTest脚本的函数外部定义一个游戏物体对象,且允许该游戏对象被外部访问;
定义一个坐标位置的集合,集合用来存放每次拖动的结束位置;
定义一个整型的成员变量,该变量将作为坐标位置集合的下标,变量的初始化值为-1;
定义一个判断参数,该判断参数用于判断鼠标是否碰到3D正方体对象;
定义一个撤销与重做的实例化对象,初始化值为空或者无需初始化;
在场景中创建一个3D正方体对象作为被拖动的对象,在场景中创建一个空对象,挂载上述创建的MovingTest脚本,将3D正方体对象绑定到脚本的游戏对象上;
返回MovingTest脚本,在脚本中引入OnMouseEnter生命周期函数,在该函数中将判断参数的值改为产生碰撞;
在脚本中引OnMouseExit生命周期函数,在该函数中将鼠标在屏幕上的平面坐标转换为三位立体空间的世界坐标,再结合上述世界坐标和鼠标的坐标转换成屏幕的平面坐标,将最终转换成的屏幕坐标赋值给3D正方体,保证3D正方体所在屏幕的平面位置与鼠标所在位置一致,实现物理上的拖拽效果;
在脚本中实现撤销函数,当下标大于0时,说明已有移动操作,将下标执行减一后从坐标位置的集合中获取当前下标的坐标,将其赋值给3D正方体的坐标;
在脚本中实现重做函数,当下标不在集合末尾时,将下标执行加一后从坐标位置的集合中获取当前下标的坐标,将其赋值给3D正方体的坐标;
在脚本中实现删除函数,删除当前下标的后一位下标至坐标位置集合的末尾处的所有缓存的位置对象;
在脚本的Start生命周期函数中,初始化定义的撤销与重做的实例化对象为一个新的对象,利用该实体类的实例化对象调用其执行函数,并注册撤销、重做、删除的回调函数的监听事件,将监听事件的指针分别指向上述实现的撤销函数、重做函数和删除函数。
完成上述操作后,运行Unity编辑器后,可以在Game视图中将鼠标移动到3D正方体上方,按下鼠标左键的同时拖动3D正方体后弹起鼠标左键,在键盘上按下自定义的撤销和重做按键,反复多次试验多样化的拖动、撤销和重做的组合,可以实现其多次撤销与重做的效果。
实施例二;
请参考图4,图4为本发明中一种基于unity的撤销与重做的系统组成示意图,所述系统包括:
脚本单元,用于新建预设脚本,基于所述脚本,获得控制模块;
第一定义单元,用于在所述控制模块外部定义一个包含预设函数的接口和若干个代理对象,所述代理对象的参数类型与所述接口的类型对应;
第二定义单元,用于在所述控制模块内部定义一个类并对所述类进行初始化;
第三定义单元,用于在所述控制模块内部定义一个用于存放所有执行过的操作事件的集合,所述集合中所有操作事件按照执行先后顺序进行排列;
第四定义单元,用于在所述控制模块内部定义并初始化第一成员变量,所述第一成员变量指向所述集合中新增操作事件的位置下标;
封装单元,用于创建一个用于继承所述接口的实体类,基于所述控制模块和所述实体类,实现对所述集合中操作事件的撤销与重做。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
Claims (10)
1.一种基于unity的撤销与重做的方法,其特征在于,所述方法包括以下步骤:
步骤1:新建预设脚本,基于所述预设脚本,获得控制模块;
步骤2:在所述控制模块外部定义一个包含预设函数的接口和若干个代理对象,所述代理对象的参数类型与所述接口的类型对应;
步骤3:在所述控制模块内部定义一个类并对所述类进行初始化;
步骤4:在所述控制模块内部定义一个用于存放所有执行过的操作事件的集合,所述集合中所有操作事件按照执行先后顺序进行排列;
步骤5:在所述控制模块内部定义并初始化第一成员变量,所述第一成员变量指向所述集合中新增操作事件的位置下标;
步骤6:创建一个用于继承所述接口的实体类,基于所述控制模块和所述实体类,实现对所述集合中操作事件的撤销与重做。
2.根据权利要求1所述的一种基于unity的撤销与重做的方法,其特征在于,所述步骤5包括:基于所述控制模块获得向外部提供添加操作事件的函数;当添加新的操作事件时,在所述添加操作事件的函数中判断所述集合中存储事件的个数是否达到上限,若是,对所述集合中第一个加入的操作事件进行移除,并将新的操作事件添加至所述集合中;若否,将新的操作事件添加至所述集合中。
3.根据权利要求1所述的一种基于unity的撤销与重做的方法,其特征在于,所述步骤5还包括:基于所述控制模块获得向外部提供撤销操作事件的函数;基于所述位置下标,利用所述撤销操作事件的函数获取需要撤销的操作事件,并对所述第一成员变量的值进行减一操作;遍历撤销操作事件的所有操作,分别调用执行撤销操作事件之前、执行撤销操作事件和执行撤销操作事件之后对应的代理消息。
4.根据权利要求1所述的一种基于unity的撤销与重做的方法,其特征在于,所述步骤5还包括:基于所述控制模块获得向外部提供重做操作事件的函数;基于所述位置下标,利用所述重做操作事件的函数获取需要重做的操作事件,并对所述第一成员变量的值进行加一操作;遍历重做操作事件的所有操作,分别调用执行重做操作事件之前、执行重做操作事件和执行重做操作事件之后对应的代理消息。
5.根据权利要求1所述的一种基于unity的撤销与重做的方法,其特征在于,所述创建一个用于继承所述接口的实体类包括:通过实体类实现所述接口中的预设函数,在所述实体类实现的添加函数中,调用在所述控制模块中定义的添加操作事件的函数作为所述添加函数;在所述实体类实现的撤销函数中,将判断参数的值修改为允许删除,并调用撤销回调函数,在所述控制模块调用实例化对象的删除事件时,所述判断参数用于判断是否能执行删除已记录的操作;在所述实体类实现的重做函数中,将判断参数的值修改为不允许删除,并调用重做回调函数;在所述实体类实现的删除函数中,对所述判断参数的值进行判断,当判断出所述判断参数的值为允许删除时,调用并执行删除回调函数,当所述删除回调函数执行完成后,销毁所述撤销回调函数、所述重做回调函数和所述删除回调函数,并修改所述判断参数的值为不允许删除。
6.根据权利要求1所述的一种基于unity的撤销与重做的方法,其特征在于,所述步骤6包括:在所述控制模块和所述实体类外部,判断对所述操作事件执行预设操作之前或者之后是否有其他操作,若是,在所述控制模块中注册添加、撤销、重做和删除四个代理消息回调的监听,所述预设操作为撤销或者重做操作。
7.根据权利要求1所述的一种基于unity的撤销与重做的方法,其特征在于,所述步骤6还包括:在所述控制模块和所述实体类外部,判断所述操作事件的所有操作是否都需要被撤销与重做,若是,在所述操作事件的操作类中实例化一个所述实体类的对象,基于所述实体类的对象,注册撤销、重做和删除的回调函数的监听事件;在注册完成的撤销、重做和删除的回调函数中,定义撤销、重做和删除的内容。
8.根据权利要求1所述的一种基于unity的撤销与重做的方法,其特征在于,所述步骤5还包括:在所述控制模块内部定义并初始化第二成员变量,通过修改所述第二成员变量的值来控制所述集合中存放操作事件数量的上限。
9.根据权利要求8所述的一种基于unity的撤销与重做的方法,其特征在于,当修改所述第二成员变量的值时,将所述集合中的所有事件执行所述接口中的删除函数,当所述集合中的所有事件均执行完所述删除函数后,清除所述集合中缓存的数据。
10.一种基于unity的撤销与重做的系统,其特征在于,所述系统包括:
脚本单元,用于新建预设脚本,基于所述预设脚本,获得控制模块;
第一定义单元,用于在所述控制模块外部定义一个包含预设函数的接口和若干个代理对象,所述代理对象的参数类型与所述接口的类型对应;
第二定义单元,用于在所述控制模块内部定义一个类并对所述类进行初始化;
第三定义单元,用于在所述控制模块内部定义一个用于存放所有执行过的操作事件的集合,所述集合中所有操作事件按照执行先后顺序进行排列;
第四定义单元,用于在所述控制模块内部定义并初始化第一成员变量,所述第一成员变量指向所述集合中新增操作事件的位置下标;
封装单元,用于创建一个用于继承所述接口的实体类,基于所述控制模块和所述实体类,实现对所述集合中操作事件的撤销与重做。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311198125.5A CN116954951B (zh) | 2023-09-18 | 2023-09-18 | 一种基于unity的撤销与重做的方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311198125.5A CN116954951B (zh) | 2023-09-18 | 2023-09-18 | 一种基于unity的撤销与重做的方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116954951A true CN116954951A (zh) | 2023-10-27 |
CN116954951B CN116954951B (zh) | 2023-11-21 |
Family
ID=88460429
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311198125.5A Active CN116954951B (zh) | 2023-09-18 | 2023-09-18 | 一种基于unity的撤销与重做的方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116954951B (zh) |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108805990A (zh) * | 2018-05-28 | 2018-11-13 | 上海华筑信息科技有限公司 | 基于Unity引擎的三维图形编辑器模型管理系统 |
US20190179504A1 (en) * | 2000-04-03 | 2019-06-13 | Google Llc | Indicating Potential Focus in a User Interface |
CN111026365A (zh) * | 2019-11-11 | 2020-04-17 | 武汉同立方智能科技有限公司 | 一种基于Unity3D的App开发框架 |
CN112001984A (zh) * | 2020-06-30 | 2020-11-27 | 深圳点猫科技有限公司 | 一种基于地形编辑器的快照式历史记录操作方法及装置 |
US11275492B1 (en) * | 2018-04-13 | 2022-03-15 | InVisionApp Inc. | Persistence strategy for applications |
CN116149633A (zh) * | 2022-09-09 | 2023-05-23 | 北京优锘科技有限公司 | 针对3d对象编辑实现可撤销操作的方法、系统及设备 |
-
2023
- 2023-09-18 CN CN202311198125.5A patent/CN116954951B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20190179504A1 (en) * | 2000-04-03 | 2019-06-13 | Google Llc | Indicating Potential Focus in a User Interface |
US11275492B1 (en) * | 2018-04-13 | 2022-03-15 | InVisionApp Inc. | Persistence strategy for applications |
CN108805990A (zh) * | 2018-05-28 | 2018-11-13 | 上海华筑信息科技有限公司 | 基于Unity引擎的三维图形编辑器模型管理系统 |
CN111026365A (zh) * | 2019-11-11 | 2020-04-17 | 武汉同立方智能科技有限公司 | 一种基于Unity3D的App开发框架 |
CN112001984A (zh) * | 2020-06-30 | 2020-11-27 | 深圳点猫科技有限公司 | 一种基于地形编辑器的快照式历史记录操作方法及装置 |
CN116149633A (zh) * | 2022-09-09 | 2023-05-23 | 北京优锘科技有限公司 | 针对3d对象编辑实现可撤销操作的方法、系统及设备 |
Non-Patent Citations (2)
Title |
---|
A. MICHAIL: "Browsing and searching source code of applications written using a GUI framework", 《PROCEEDINGS OF THE 24TH INTERNATIONAL CONFERENCE ON SOFTWARE ENGINEERING. ICSE 2002》, pages 327 - 337 * |
管皓等: "基于Web的动态几何软件领域模型及其应用", 《计算机应用》, pages 1127 - 1132 * |
Also Published As
Publication number | Publication date |
---|---|
CN116954951B (zh) | 2023-11-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7281248B2 (en) | Virtualized and realized user interface controls | |
US8026910B2 (en) | Offline optimization pipeline for 3D content in embedded devices | |
CN102103497B (zh) | 有限状态机执行装置和方法、在应用中的建立和使用方法 | |
US20020129340A1 (en) | Reconfigurable isomorphic software representations | |
CN108446149B (zh) | 一种第三方动态库接口拦截方法及系统 | |
CN104991763A (zh) | 一种通用的游戏界面行为控制系统 | |
JPH0644339A (ja) | 図形オブジェクト操作システム及び方法 | |
JPH09502040A (ja) | オブジェクト指向コンストラクティブ・エリア・システム | |
JPH03231352A (ja) | オブジェクトクラス定義情報実装装置 | |
EP1979825A1 (en) | Xna relationship management | |
JP2000187594A (ja) | インタ―フェ―スのランタイム付加 | |
CN110275876A (zh) | 用于数据库横向扩展的方法及装置 | |
CN109960709B (zh) | 一种数据库驱动的处理方法、装置、设备及存储介质 | |
CN113689534B (zh) | 物理特效渲染方法、装置、计算机设备和存储介质 | |
JPH08503801A (ja) | オブジェクト指向図形ヒット・システム | |
CN116954951B (zh) | 一种基于unity的撤销与重做的方法及系统 | |
CA2341114C (en) | Data definition language | |
CN106126213A (zh) | 一种基于IFML的Android开发建模方法 | |
Dery et al. | Distributed access knowledge-based system: Reified interaction service for trace and control | |
CN114237583A (zh) | 一种跨平台可视化代码生成装置和方法 | |
US20060130009A1 (en) | Dynamically configurable model-to-model transformation engine | |
CN110347448B (zh) | 一种构造终端应用行为的运行时模型的方法 | |
Aguerreche et al. | A description of a dialog to enable interaction between interaction tools and 3D objects in collaborative virtual environments | |
CN105162816B (zh) | 面向通信网络业务的多场景业务信息自动共享平台及方法 | |
US9058339B2 (en) | Source control inheritance locking |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |