EditorGuiLayout.MaskField 问题与大枚举



我正在研究一个输入系统,该系统允许用户转换不同输入设备和操作系统之间的输入映射,并可能定义自己的输入映射。

我正在尝试为编辑器窗口创建一个 MaskField,用户可以在其中从 RuntimePlatform 列表中进行选择,但选择单个值会导致选择多个值。

主要用于调试,我将其设置为生成一个等效的枚举 RuntimePlatformFlags,它使用而不是 RuntimePlatform:

[System.Flags]
public enum RuntimePlatformFlags: long
{
OSXEditor=(0<<0),
OSXPlayer=(0<<1),
WindowsPlayer=(0<<2),
OSXWebPlayer=(0<<3),
OSXDashboardPlayer=(0<<4),
WindowsWebPlayer=(0<<5),
WindowsEditor=(0<<6),
IPhonePlayer=(0<<7),
PS3=(0<<8),
XBOX360=(0<<9),
Android=(0<<10),
NaCl=(0<<11),
LinuxPlayer=(0<<12),
FlashPlayer=(0<<13),
LinuxEditor=(0<<14),
WebGLPlayer=(0<<15),
WSAPlayerX86=(0<<16),
MetroPlayerX86=(0<<17),
MetroPlayerX64=(0<<18),
WSAPlayerX64=(0<<19),
MetroPlayerARM=(0<<20),
WSAPlayerARM=(0<<21),
WP8Player=(0<<22),
BB10Player=(0<<23),
BlackBerryPlayer=(0<<24),
TizenPlayer=(0<<25),
PSP2=(0<<26),
PS4=(0<<27),
PSM=(0<<28),
XboxOne=(0<<29),
SamsungTVPlayer=(0<<30),
WiiU=(0<<31),
tvOS=(0<<32),
Switch=(0<<33),
Lumin=(0<<34),
BJM=(0<<35),
}

在此链接的屏幕截图中,仅选择了前 4 个选项。"平台:"旁边的整数是掩码本身。

我不是一个很大的按位向导,但我的假设是发生这种情况是因为 EditorGUILayout.MaskField 返回一个 32 位 int 值,并且有超过 32 个枚举选项。是否有任何解决方法,或者还有其他原因导致问题?

我注意到的第一件事是该Enum中的所有值都是相同的,因为您将 0 位向左移动。您可以通过使用此脚本记录您的值来观察这一点。

// Shifts 0 bits to the left, printing "0" 36 times.
for(int i = 0; i < 36; i++){
Debug.Log(System.Convert.ToString((0 << i), 2));
}
// Shifts 1 bits to the left, printing values up to 2^35.
for(int i = 0; i < 36; i++){
Debug.Log(System.Convert.ToString((1 << i), 2));
}

long继承不能单独工作的原因是因为位移。看看我发现的关于这个问题的这个例子:

UInt32 x = ....;
UInt32 y = ....;
UInt64 result = (x << 32) + y;

程序员打算通过将"x"移动 32 位并添加最重要和最不重要的部分,从两个 32 位值形成一个 64 位值。但是,由于"x"在执行移位操作时是 32 位值,因此移位 32 位等效于移位 0 位,这将导致不正确的结果。


因此,您还应该投射移位。喜欢这个:

public enum RuntimePlatformFlags : long {
OSXEditor = (1 << 0),
OSXPlayer = (1 << 1),
WindowsPlayer = (1 << 2),
OSXWebPlayer = (1 << 3),
// With literals.
tvOS = (1L << 32),
Switch = (1L << 33),
// Or with casts.
Lumin = ((long)1 << 34),
BJM = ((long)1 << 35),
}

最新更新