Jump to content
模组网
icedream

【Creation Kit 学习指南 35】持久化

Recommended Posts

概述

持久化是保证目标参照停留于游戏中且不被卸载的一种行为。它应用于游戏中包括角色参照在内的所有参照。由于它们持续停留,因此它们要消耗大量的系统资源并使位于相同区域的其它引用消失和卸载。

如何使目标持久化

想知道如何保留一个目标,请看以下内容:

函数

当一个函数运行在目标之上时,这个目标将停留直到函数退出。这同样适用于长期运行的隐藏函数。

范例

Function MyFunction()
; 我们进入此脚本中的一个函数 - 我们要链接的那个目标此时已持久化
Util.Wait(300) ; 我们需要等待300秒 - 目标依旧持久化!
; 现在当我们无需持久化时我们保留一个函数(除非存在持久化的必要)
EndFunction
属性

当一个脚本属性指向编辑器中的一个参照时,目标参照将会被标记为“永久持久化”。换句话说,如果在运行时刻不做任何事那么目标将被卸载。这意味着,如果有可能的话,你不应该直接用属性指向一个参照。如果可以的话,可以从事件或其它位置中拉取参照,从而避免它们永久停留。即使你在游戏运行时重新对属性分配值,原先的参照依旧会停留。

范例

; 此属性在编辑器中已被设定 - 当游戏运行时它被加载且永久停留!
ObjectReference Property OtherReference auto

Function MyFunction()
; 处理OtherReference并保证其持续运行
OtherReference.Activate(Game.GetPlayer())

; 然而,即使清除或重新分配属性,原先目标依旧会停留!
OtherReference = None ; Original object doesn't die!
EndFunction
变量

任何指向参照的变量被加载时,参照会临时持久化。它将持久化直到不再有变量指向它,然后它被卸载。(假设没有其它游戏系统使目标存活)这意味着你不应该在你要需要它们时试图使目标保持一个变量。你可以通过对其分配"None"来清除变量。

范例

ObjectReference myScriptVariable

Function MyFunction(ObjectReference myArg1, ObjectReference myArg2, ObjectReference myArg3)
; 只要函数运行,myArg1, myArg2, and myArg3 都会持久化
myArg1.Activate(myArg2)

; 如果对其中任何一个分配其它目标,那么原先的目标都会消失
myArg1 = None ; Original reference may die!

; 如果对其中任何一个分配一个脚本变量,目标将会停留!
myScriptVariable = myArg2 ; Will now stick around until myScriptVariable is cleared or re-assigned

; myArg3 将会停止持久化,如果我们不对其分配其它变量
EndFunction
注册事件

任何被注册接收不同事件的参照都会持久化,直到它取消注册事件。这应用于任何你明确注册的事件(包括但不限于)OnUpdate, OnLOS, OnSleep,和OnAnimationEvent

范例

; 这个链接的目标在取消注册前都会持久化
RegisterForUpdate(5.0)

; 我们链接的目标将不再持久化(假设没有任何必要使其存活)
UnregisterForUpdate()
总结

当要让其持久化时请记住以下内容:

  • 避免长时间运行的函数
  • 尽量避免参照属性
  • 参照变量应只指向一个参照
  • 只有注册表可以更新

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...