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