property cc.Enum 枚举类型

  • Creator 版本:1.9.0

  • 目标平台: 所有

  • 编辑器操作系统 :Windows

    • 在代码里面使用枚举类型时,我们一般的操作都是直接用枚举枚举名称的,在枚举定义的时候,可以随意修改,颠倒枚举的位置。但是如果枚举类型在编辑器里用到了,就必须非常小心。比如说:
      • 保存之后,AnimalDog的动物类型应该序列化为0,AnimalFish为1. 假设(实际上也有这样的需求)Animal这个模块是个很通用的,任意人都可以在里面扩展自己的类型。如果有人在枚举值Dog前插入一条数据(比如说Duck),实际上也很难控制不这么做(颠倒枚举类型的顺序),就会导致以前所有用到Animal预设的地方都会在反序列化的时候类型错乱。如果我没理解错的话,这样使用枚举类型太危险了。
  • 我现在的针对这种很公用,需要用到枚举的解决办法是:方案一:每个类型去指定值(弊端:枚举的值就不能随意修改了)。方案二:还是使用枚举,但是不序列化枚举值,序列化枚举值的key(弊端:1,麻烦,要转换几次。2,枚举的key不能随意修改,否则反序列化找不到了,但使用枚举,修改枚举key,所有用到这个key 的地方也是都要做修改的。)


所以我想请教一下,在编辑器使用枚举这块,目前有没有好的方法,或者以后能否优化一下。或者不使用枚举,有其它方法达到同样的效果吗。

2赞

@panda @jare @wangzhe 大神,抽空帮忙看看啊。

方案一:每个类型去指定值(弊端:枚举的值就不能随意修改了)

很奇怪,既然用了枚举,为啥要关心枚举的值?不要改枚举的值不就行了。

序列化的时候,都是序列化的枚举值。所以要关心枚举值啊。
一个公用的枚举类型,很难保证不颠倒或中间插入枚举项啊。如果这样操作了,枚举值就变了啊。

其实只要支持 String 类型的枚举值就可以, 大家可以随便插了.

String 类型的枚举编辑器里没法选啊。:rage:

1赞

目前有什么好的解决办法吗?

2年后,求枚举支持string类型。:cry:
@jare

然鹅…

2年后,仍然不支持。。。

我也遇到过几次,定义了一个比较通用的枚举
枚举定义改了,顺序有变更之后
所有的映射关系都乱了

我现在是能不依赖编辑器就不依赖编辑器了

@property

    protected _test: string = "";

    @property({ type: cc.Enum(TestEnum)})

    public set test(v: TestEnum) {

        this._systemIndex = TestEnum[v];

    }

    public get test(): TestEnum {

        if (CC_EDITOR) {

            if (!this._test) {

                this._test = TestEnum[0];

            }

        }

        return TestEnum[this._systemIndex];

    }

这样子写就不用怕枚举值乱了

1赞