C# 带有浮点值的Unity枚举下拉列表
在Unity/C中,是否有更好的方法来执行以下操作,目前涉及and enum和switch语句 我希望能够从Unity inspector中的下拉列表中选择跳转距离,但我希望每个值都是浮点值,而不是int。是否有更好的数据结构或不同的方法来实现这一点 公共枚举跳距 { 短的 中等的 长的 } 公共类跳转触发器:单一行为 { [SerializeField]专用跳线距离跳线距离=跳线距离。短; 私人浮动跳转距离f; 私人空间觉醒 { 开关跳距 { 外壳跳线距离。短: 跳跃距离f=1; 打破 案例跳跃距离。中等: 跳线距离f=1.5f; 打破 案例跳跃距离。长: 跳跃距离f=2; 打破 违约: 打破 } Debug.LogI需要跳转:+jumpdistance f; } }C# 带有浮点值的Unity枚举下拉列表,c#,unity3d,C#,Unity3d,在Unity/C中,是否有更好的方法来执行以下操作,目前涉及and enum和switch语句 我希望能够从Unity inspector中的下拉列表中选择跳转距离,但我希望每个值都是浮点值,而不是int。是否有更好的数据结构或不同的方法来实现这一点 公共枚举跳距 { 短的 中等的 长的 } 公共类跳转触发器:单一行为 { [SerializeField]专用跳线距离跳线距离=跳线距离。短; 私人浮动跳转距离f; 私人空间觉醒 { 开关跳距 { 外壳跳线距离。短: 跳跃距离f=1; 打破 案例跳
不优雅,但这里有一个解决方案:
public enum JumpDistance
{
Short = 100,
Medium = 150,
Long = 200
}
public class JumpTrigger : MonoBehaviour
{
[SerializeField] private JumpDistance jumpDistance;
private float jumpDistanceF;
private void Awake()
{
jumpDistanceF = ((float)(int)jumpDistance) / 100f;
Debug.Log("I need to jump:" + jumpDistanceF);
}
}
。。。这很明显。但是由于隐式int到float提升,它可以进一步简化为
jumpDistanceF = (int)jumpDistance / 100f;
我喜欢认为你的方式是好的,但是你必须抽象出这个开关,这样它就可以在任何地方使用 因此,即使您使用@mruncifivable92方法,它100%工作,但如果某人不知道枚举值如何工作,则可能会犯一些错误,或者使用任何其他方法,您也应该抽象出处理此问题的方法,例如:
public enum JumpDistance
{
Short,
Medium,
Long
}
public float GetJumpDistanceFloatValue(JumpDistance jumpDistance)
{
switch (jumpDistance)
{
case JumpDistance.Short:
return 1;
case JumpDistance.Medium:
return 1.5f;
case JumpDistance.Long:
return 2;
default:
Debug.Log("Error: this JumpDistance enum value is invalid");
return 0;
}
}
但是,如果您喜欢@mruncifivable92的方式,您可以始终执行以下操作,以保持对其进行一点抽象:
public enum JumpDistance
{
Short = 100,
Medium = 150,
Long = 200
}
public float GetJumpDistanceFloatValue(JumpDistance jumpDistance)
{
return (int)jumpDistance / 100f;
}
在最后一节课中,您将使用它,如下所示:
public class JumpTrigger : MonoBehaviour
{
public enum JumpDistance
{
Short = 100,
Medium = 150,
Long = 200
}
public float GetJumpDistanceFloatValue(JumpDistance jumpDistance)
{
return (int)jumpDistance / 100f;
}
[SerializeField] private JumpDistance jumpDistance = JumpDistance.Short;
private void Awake()
{
Debug.Log("I need to jump:" + GetJumpDistanceFloatValue(jumpDistance));
}
}
有了这一点,您就可以始终使用静态类和扩展方法,实现以下功能:
public static class ExtensionMethods
{
public enum JumpDistance
{
Short = 100,
Medium = 150,
Long = 200
}
public float GetJumpDistanceFloatValue(this JumpDistance jumpDistance)
{
return (int)jumpDistance / 100f;
}
}
public class JumpTrigger : MonoBehaviour
{
[SerializeField] private JumpDistance jumpDistance = JumpDistance.Short;
private void Awake()
{
Debug.Log("I need to jump:" + jumpDistance.GetJumpDistanceFloatValue());
}
}
@洛坦:是的,你可能会疯掉的。最不可读的版本可能是:
public class JumpTrigger : MonoBehaviour
{
[SerializeField] private JumpDistance jumpDistance;
private float jumpDistanceF;
private void Awake()
{
jumpDistanceF = jumpDistance.ToFloat();
Debug.Log("I need to jump:" + jumpDistanceF);
}
}
public enum JumpDistance
{
// NOTE TO DEVELOPER : This will be divided by 100
Short = 100,
Medium = 150,
Long = 200
}
static class JumpDistanceExtensions
{
public const float JUMP_DISTANCE_FACTOR = 100f;
public static float ToFloat(this JumpDistance jumpDistance)
{
return (int)jumpDistance / JUMP_DISTANCE_FACTOR;
}
}
如前所述,使用地图,例如
public static class JumpDistanceConverter
{
public static readonly ReadOnlyDictionary<JumpDistance, float> JumpDistanceToFloat = new ReadOnlyDictionary<JumpDistance, float>(new Dictionary<JumpDistance, float>
{
{JumpDistance.Short, 1.0f},
{JumpDistance.Medium, 1.5f},
{JumpDistance.Long, 2.0f}
});
// And then an extension method makes actually sense without changing the values of the enum itself ;)
public static float ToFloat(this enum jumpDistance)
{
return JumpDistanceToFloat[jumpDistance];
}
}
或
在代码中的某个地方初始化ReadOnlyDictionary并在需要的地方使用它?哦,这很聪明!为什么我没想到。。。可能是因为这有点让人困惑。但绝对是个主意!可能是因为扩展方法和枚举似乎是一对非常奇怪的组合:/:DI类似于将开关重构为自己的方法,这是有意义的。您的代码有点粗糙,方法的返回类型错误,等号rhs上的字典需要类型,但这是一个好主意,谢谢@Ben yeah只在电话里打过,抱歉^^谢谢你指出,现在就修好了;
var jumpDistanceF = JumpDistanceConverter.JumpDistanceToFloat[jumpDistance];
var jumpDistanceF = jumpDistance.ToFloat();