我在 il2cpp 游戏上有 melonloader,并尝试为它编写 mod。
我需要从
Joint.massScale
获取字段 il2cppSystem.Object
作为 ConfigurableJoint : Joint
对象。
该字段存在于
UnityExplorer
中:
.GetMember
和 .GetMembers
:它们只是不包含该字段/属性
MemberInfo member = anyObject.GetIl2CppType()
.GetMember(requested, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy)
.First();
递归
GetMember
:
static IEnumerable<MemberInfo> GetAllMembersRecursivly(Il2CppSystem.Type type) =>
type.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static)
.Concat(type.BaseType == Il2CppType.Of<Il2CppSystem.Object>() ? new MemberInfo[0] : GetAllMembersRecursivly(type.BaseType));
同样的结果
我发现的唯一解决方法是像这样硬编码该类型:
if (cj != null && requested == "massScale" && !path.Any())
{
return ((v) => cj.massScale = v.Unbox<float>(), Il2CppType.Of<float>());
}
但是……嗯
我做了一些调试并输出类型及其子类型的所有字段:
base type: UnityEngine.ConfigurableJoint
fields:
set_targetPosition
set_xDrive
set_yDrive
set_zDrive
set_targetRotation
set_rotationDriveMode
set_slerpDrive
set_targetPosition_Injected
set_xDrive_Injected
set_yDrive_Injected
set_zDrive_Injected
set_targetRotation_Injected
set_slerpDrive_Injected
targetPosition
xDrive
yDrive
zDrive
targetRotation
rotationDriveMode
slerpDrive
base type: UnityEngine.Joint
fields:
get_connectedBody
set_connectedBody
set_axis
get_anchor
set_anchor
get_connectedAnchor
set_connectedAnchor
set_autoConfigureConnectedAnchor
set_enableCollision
set_enablePreprocessing
set_axis_Injected
get_anchor_Injected
set_anchor_Injected
get_connectedAnchor_Injected
set_connectedAnchor_Injected
connectedBody
axis
anchor
connectedAnchor
autoConfigureConnectedAnchor
enableCollision
enablePreprocessing
标志:
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Declared
每个子类型
你需要展示你想要使用Reflection挖掘的类型的确切定义,但我可以告诉你导致成员信息丢失的最典型的错误以及克服它们的方法。
System.Type.GetMembers
而不是 System.Type.GetMember
,遍历所有成员的数组,并尝试找出缺少的内容。几乎在所有情况下,它都有助于解决您的问题。System.Type.GetMember
。问题是第一个参数是 string
,但是你怎么知道你提供了正确的名称并且你不是简单地犯了一个拼写错误?你的requested
从哪里来? (这里给你一个提示:nameof
)。如果您回答这个问题并且有兴趣了解如何在没有 System.Type.GetMember
和字符串的情况下进行操作,我很可能能够为您建议正确的技术。BindingFlags
值。首先,您需要使用我的第一个建议来了解您的会员的正确特征是什么。更清晰的方法是:从以下值开始:BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static
。就是这样,没有别的了。