带有浮点值的Unity枚举下拉列表



在Unity/C#中,是否有更好的方法来执行以下操作,当前涉及和enum以及switch语句?

我希望能够选择";跳跃距离";从Unity检查器的下拉列表中选择,但我希望每个值都是float,而不是int。有更好的数据结构或不同的方法来实现这一点吗?

public enum JumpDistance
{
Short,
Medium,
Long
}
public class JumpTrigger : MonoBehaviour
{
[SerializeField] private JumpDistance jumpDistance = JumpDistance.Short;
private float jumpDistanceF;
private void Awake()
{
switch (jumpDistance)
{
case JumpDistance.Short:
jumpDistanceF = 1;
break;
case JumpDistance.Medium:
jumpDistanceF = 1.5f;
break;
case JumpDistance.Long:
jumpDistanceF = 2;
break;
default:
break;
}
Debug.Log("I need to jump:" + jumpDistanceF);
}
}

如前所述,使用类似的地图

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

并像一样访问它

var jumpDistanceF = JumpDistanceConverter.JumpDistanceToFloat[jumpDistance];

var jumpDistanceF = jumpDistance.ToFloat();

不是很优雅,但这里有一个解决方案:

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;

我喜欢认为你的方式是好的,但你必须抽象出"开关";所以它可以在任何地方使用。

因此,即使你使用@MrUnbelievable92的方式,它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;
}
}

但是,如果你喜欢@MrUnbelievable92的方式,你可以随时按照以下步骤对其进行一点抽象:

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

@Lotan:是的,你可能会有各种疯狂。最不可读的版本可能是这样的:

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

最新更新