循环通过相机模式的枚举

时间:2017-02-25 12:25:52

标签: c# unity3d enums

我有3种相机模式的简单enum值类型。我知道如何打印出每个值(例如Debug.Log(OrbitStyle.Smooth)Debug.Log(OrbitStyle.Smooth.ToString())),但为了将它们全部打印出来,我想我必须为它编写一个函数。

我的第一个问题是:这是唯一的方法,还是有一个循环enum的功能?

我的第二个问题是:为什么我的Unity3D程序在添加=以包含所有值时会崩溃,同时递增/递减?下面的程序打印出Smooth, Step然后Fade, Step,但我使用<=>=来包含最低和最高值,但它总是崩溃。我做错了什么?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class CameraOribit : MonoBehaviour
{
    enum OrbitStyle
    {
        Smooth,
        Step,
        Fade
    }


    void Start()
    {
        for ( OrbitStyle e1 = OrbitStyle.Smooth; e1 < OrbitStyle.Fade; e1 = IncrementEnum(e1) )
        {
            Debug.Log(e1);
        }

        for ( OrbitStyle e2 = OrbitStyle.Fade; e2 > OrbitStyle.Smooth; e2 = DecrementEnum(e2) )
        {
            Debug.Log(e2);
        }
    }


    static OrbitStyle IncrementEnum(OrbitStyle e)
    {
        if (e == OrbitStyle.Fade)
            return e;
        else
            return e + 1;
    }

    static OrbitStyle DecrementEnum(OrbitStyle e)
    {
        if (e == OrbitStyle.Smooth)
            return e;
        else
            return e - 1;
    }
}

1 个答案:

答案 0 :(得分:1)

关于第一个问题,您可以在此处看到答案:Can you loop through all enum values?

对于第二个问题,for循环的性质是:

for (OrbitStyle e1 = OrbitStyle.Smooth; e1 <= OrbitStyle.Fade; e1 = IncrementEnum(e1)) {
  Debug.Log(e1);
}

等于:

OrbitStyle e1 = OrbitStyle.Smooth;
while(e1 <= OrbitStyle.Fade){
    Debug.Log(e1);
    e1 = IncrementEnum(e1);
}

现在,正如您所看到的,在循环结束时(e1 == OrbitStyle.Fade时),条件返回true以便代码运行,最后再次调用IncrementEnum(e1)时, e1已经处于枚举的最大数量,并且尝试再次增加它会导致崩溃。