EditorGUILayout.EnumPopup在自定义编辑器中重置值

时间:2017-01-03 23:18:34

标签: c# unity3d

我有一个编辑器脚本,可以让我改变一个瓷砖的纹理(我正在制作一个游戏板)。它的工作原理是创建一个具有不同“图块类型”的下拉菜单,然后当我从菜单中选择一个新的图块类型时,它会将纹理更改为相应的类型。

[CustomEditor(typeof(Tile))]
public class TileEditor : Editor {

    enum Type {
        Blank,
        Portal
    }

    // Represents the type of tile this is
    Type type;

    public override void OnInspectorGUI() {
        Tile tile = (Tile)target;

        // Create a dropdown list of tile types
        type = (Type)EditorGUILayout.EnumPopup ("Type", type);

        switch (type) {
        case Type.Blank:
            tile.GetComponent<Renderer> ().material = Resources.Load ("Materials/Blank Tile", typeof(Material)) as Material;
            break;
        case Type.Portal:
            tile.GetComponent<Renderer> ().material = Resources.Load("Materials/Portal Tile", typeof(Material)) as Material;
            break;
        }
    }
}

如果我删除了设置材料的行,下拉菜单按预期工作,但是包含这些行,当我从下拉列表中选择Portal时,它会稍微改变纹理,然后两者都纹理和菜单会将自身重置回枚举(空白)中的第一项。

这里发生了什么,如何让我的选择继续存在?

修改

我已经略微缩小了这个问题。当我选择Portal类型时,它会执行Type.Portal案例,但随后type会立即更改回Type.Blank并执行Type.Blank案例。因此,在调用type之间似乎正在改变我的OnInspectorGUI()变量。

1 个答案:

答案 0 :(得分:2)

只有两个问题:

它立即重置为第一个枚举,当您保存场景并加载它时,当您选择附加GameObject Tile脚本时,它也会重置为第一个枚举。

解决方案1 ​​

Type type成为静态。只需将Type type;更改为static Type type;即可。 这应该解决我上面描述的问题。

但是,您将意识到当您保存并重新加载项目时,不会保存枚举。它重置为索引0(Type.Blank)。

解决方案2

我几乎不能使用编辑器脚本,但根据我的理解,type变量应该在Tile脚本而不是TileEditor脚本中声明。此外,您应该将 Type enum重新命名为其他内容。 TypeSystem命名空间中C#标准API的一部分。将其重命名为TileType,以便您将来不会让自己感到困惑。

Tile脚本中声明它可以解决您的所有问题。

Tile 脚本:

public class Tile : MonoBehaviour
{
    public TileType type;

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
}

TileEditor脚本:

[CustomEditor(typeof(Tile))]
public class TileEditor : Editor
{
    public override void OnInspectorGUI()
    {
        Tile tile = (Tile)target;

        // Create a dropdown list of tile types
        tile.type = (TileType)EditorGUILayout.EnumPopup("TileType", tile.type);

        Debug.Log("OnInspectorGUI");

        switch (tile.type)
        {
            case TileType.Blank:
                tile.GetComponent<Renderer>().material = Resources.Load("Materials/Blank Tile", typeof(Material)) as Material;
                Debug.Log("Blank");
                break;
            case TileType.Portal:
                tile.GetComponent<Renderer>().material = Resources.Load("Materials/Portal Tile", typeof(Material)) as Material;
                Debug.Log("Portal");
                break;
        }
    }
}

public enum TileType
{
    Blank,
    Portal
}

您还可以通过添加一个加载材料一次然后将它们存储在静态变量中的类来改进这一点。这将防止每次下拉列表更改时都必须加载它。您可以详细了解自定义检查器 here