Unity UI 带枚举的 Onclick 检查器
Unity UI Onclick inspector with Enumeration
我有一个问题。
这是我的检查员 Window。
如果是 On Click() window,我想设置 Enum 类型的参数。
不是字符串或整数。
换句话说,我想用
void GoToNext(DATA_TYPE 类型)。
但这并没有出现。
即使我将枚举设置为 [SerializedField],也不会在此 window 中显示。
我该怎么做?
您目前无法执行此操作,Unity 不支持它。但是,由于枚举基本上是整数,也许您可以将函数设置为接受一个整数并以某种方式将其转换为适当的枚举?
我用枚举在一些代码中尝试了这个小实验,它似乎工作正常:
public enum unitType {orc_warrior, archer, none};
int test2 = 0;
unitType test;
test = (unitType)test2;
Debug.Log(test);
test2 = 1;
test = (unitType)test2;
Debug.Log(test);
调试正确打印出来orc_warrior
然后archer
我从 this Unity forum 的用户 'TobiLaForge' 那里找到了一个很好的解决方案。至少这是对我来说最好的解决方案,我只需要处理几个枚举。
1) 在您的 class 之外声明您的 enum
您在其中使用它或在 MonoBehaviour
.
之外的任何其他地方创建它
2) 创建脚本,将其附加到您的按钮:
using UnityEngine;
public class GetEnum : MonoBehaviour{
public MyEnum state;
}
3 添加这个或更改您使用枚举的原始函数
public void GetEnumState(GetEnum g)
{ if(g.state == MyEnum.something)
DoSomething();
}
4) 在 OnClick()
函数槽 select 你的函数中,将 GetEnum
脚本拖到槽中。
对于您以这种方式使用的每个 enum
,这将需要一个新的 MonoBehaviour
脚本。这是我之后的检查员。
为了弄清楚 nipunasudha 所建议的它是如何工作的,这里是我如何使用它的完整代码示例。请注意“SerializeReference”而不是“SerializeField”的需要,否则你所有的按钮都会以相同的状态结束——这通常不是你想要实现的。
using UnityEngine;
public class MenuInvoker : MonoBehaviour
{
private enum State { Main, Settings };
[SerializeReference] private State state;
public void InvokeMenu(MenuInvoker currState)
{
switch (currState.state)
{
case State.Main:
Debug.Log("Main");
break;
case State.Settings:
Debug.Log("Settings");
break;
default:
Debug.Log("Default Menu");
break;
}
}
}
我有一个问题。
这是我的检查员 Window。
如果是 On Click() window,我想设置 Enum 类型的参数。 不是字符串或整数。
换句话说,我想用 void GoToNext(DATA_TYPE 类型)。 但这并没有出现。
即使我将枚举设置为 [SerializedField],也不会在此 window 中显示。
我该怎么做?
您目前无法执行此操作,Unity 不支持它。但是,由于枚举基本上是整数,也许您可以将函数设置为接受一个整数并以某种方式将其转换为适当的枚举?
我用枚举在一些代码中尝试了这个小实验,它似乎工作正常:
public enum unitType {orc_warrior, archer, none};
int test2 = 0;
unitType test;
test = (unitType)test2;
Debug.Log(test);
test2 = 1;
test = (unitType)test2;
Debug.Log(test);
调试正确打印出来orc_warrior
然后archer
我从 this Unity forum 的用户 'TobiLaForge' 那里找到了一个很好的解决方案。至少这是对我来说最好的解决方案,我只需要处理几个枚举。
1) 在您的 class 之外声明您的 enum
您在其中使用它或在 MonoBehaviour
.
2) 创建脚本,将其附加到您的按钮:
using UnityEngine;
public class GetEnum : MonoBehaviour{
public MyEnum state;
}
3 添加这个或更改您使用枚举的原始函数
public void GetEnumState(GetEnum g)
{ if(g.state == MyEnum.something)
DoSomething();
}
4) 在 OnClick()
函数槽 select 你的函数中,将 GetEnum
脚本拖到槽中。
对于您以这种方式使用的每个 enum
,这将需要一个新的 MonoBehaviour
脚本。这是我之后的检查员。
为了弄清楚 nipunasudha 所建议的它是如何工作的,这里是我如何使用它的完整代码示例。请注意“SerializeReference”而不是“SerializeField”的需要,否则你所有的按钮都会以相同的状态结束——这通常不是你想要实现的。
using UnityEngine;
public class MenuInvoker : MonoBehaviour
{
private enum State { Main, Settings };
[SerializeReference] private State state;
public void InvokeMenu(MenuInvoker currState)
{
switch (currState.state)
{
case State.Main:
Debug.Log("Main");
break;
case State.Settings:
Debug.Log("Settings");
break;
default:
Debug.Log("Default Menu");
break;
}
}
}