Udon Decompiler 文档

Udon Variable Table

这部分内容与反编译关系不大, 但是对理解甚至修改地图有用.

资产

使用 AssetRipper 解包地图后, 在场景或预制件中能找到一些 MonoBehaviourMonoBehaviour, 这些 MonoBehaviourMonoBehaviour 带有 serializedPublicVariablesBytesStringserializedPublicVariablesBytesString 字段. 这代表这是一个对象绑定的脚本的公共字段的初始值.

serializedPublicVariablesBytesStringserializedPublicVariablesBytesString 是一个 base64 编码字符串, 是 UdonVariableTableUdonVariableTable 的序列化结果. 该序列化过程同样使用了Udon Program 的反序列化一节中提到的 OdinSerializerOdinSerializer, 反序列化的方式也一样, 此处不再赘述.

UdonVariableTableUdonVariableTable

基本上就是一个 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);

IUdonVariableIUdonVariable

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; }
}

修改 PublicVariablesPublicVariables

需要注意的是, UdonVariableTableUdonVariableTable 实例中可能含有一些引用, 因此在不完整的环境中将其反序列化后再次序列化会破坏其内容, 导致相关脚本无法正常运行.

因此, 在修改时要么使用更基础的 DataNodeDataNode 相关 API, 要么保证环境完整, 并正确设置 publicVariablesUnityEngineObjectspublicVariablesUnityEngineObjects.