Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有浮点值的Unity枚举下拉列表_C#_Unity3d - Fatal编程技术网

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

C# 带有浮点值的Unity枚举下拉列表,c#,unity3d,C#,Unity3d,在Unity/C中,是否有更好的方法来执行以下操作,目前涉及and enum和switch语句 我希望能够从Unity inspector中的下拉列表中选择跳转距离,但我希望每个值都是浮点值,而不是int。是否有更好的数据结构或不同的方法来实现这一点 公共枚举跳距 { 短的 中等的 长的 } 公共类跳转触发器:单一行为 { [SerializeField]专用跳线距离跳线距离=跳线距离。短; 私人浮动跳转距离f; 私人空间觉醒 { 开关跳距 { 外壳跳线距离。短: 跳跃距离f=1; 打破 案例跳

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

我希望能够从Unity inspector中的下拉列表中选择跳转距离,但我希望每个值都是浮点值,而不是int。是否有更好的数据结构或不同的方法来实现这一点

公共枚举跳距 { 短的 中等的 长的 } 公共类跳转触发器:单一行为 { [SerializeField]专用跳线距离跳线距离=跳线距离。短; 私人浮动跳转距离f; 私人空间觉醒 { 开关跳距 { 外壳跳线距离。短: 跳跃距离f=1; 打破 案例跳跃距离。中等: 跳线距离f=1.5f; 打破 案例跳跃距离。长: 跳跃距离f=2; 打破 违约: 打破 } Debug.LogI需要跳转:+jumpdistance f; } }
不优雅,但这里有一个解决方案:

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