Udon Variable Table
这部分内容与反编译关系不大, 但是对理解甚至修改地图有用.
使用 AssetRipper 解包地图后, 在场景或预制件中能找到一些 MonoBehaviourMonoBehaviour, 这些 MonoBehaviourMonoBehaviour 带有 serializedPublicVariablesBytesStringserializedPublicVariablesBytesString 字段. 这代表这是一个对象绑定的脚本的公共字段的初始值.
serializedPublicVariablesBytesStringserializedPublicVariablesBytesString 是一个 base64 编码字符串, 是 UdonVariableTableUdonVariableTable 的序列化结果. 该序列化过程同样使用了Udon Program 的反序列化一节中提到的 OdinSerializerOdinSerializer, 反序列化的方式也一样, 此处不再赘述.
基本上就是一个 Dictionary<string, IUdonVariable>Dictionary<string, IUdonVariable>. 重要接口如下
public IReadOnlyCollection<string> VariableSymbols;public bool TryAddVariable(IUdonVariable variable);public bool RemoveVariable(string symbolName);public bool TrySetVariableValue(string symbolName, object value);public bool TryGetVariableType(string symbolName, out Type type);public bool TryGetVariableValue(string symbolName, out object value);
public IReadOnlyCollection<string> VariableSymbols;public bool TryAddVariable(IUdonVariable variable);public bool RemoveVariable(string symbolName);public bool TrySetVariableValue(string symbolName, object value);public bool TryGetVariableType(string symbolName, out Type type);public bool TryGetVariableValue(string symbolName, out object value);
public interface IUdonVariable{ string SymbolName { get; } object Value { get; set; } Type DeclaredType { get; }}
public interface IUdonVariable{ string SymbolName { get; } object Value { get; set; } Type DeclaredType { get; }}
需要注意的是, UdonVariableTableUdonVariableTable 实例中可能含有一些引用, 因此在不完整的环境中将其反序列化后再次序列化会破坏其内容, 导致相关脚本无法正常运行.
因此, 在修改时要么使用更基础的 DataNodeDataNode 相关 API, 要么保证环境完整, 并正确设置 publicVariablesUnityEngineObjectspublicVariablesUnityEngineObjects.