一日分の備忘録

ゲーム制作におけるいろいろな実装の備忘録。基本的にはゲームエンジン中心。その中でもUE4がメイン。プログラマーなのでプログラム的な記事が多くなるかも

レベルに配置したActorのインスタンス変数の編集可否をフラグで管理する方法についての備忘録

BPではmetadataにアクセスできなさそうなのでC++クラスを作成。
下記コードを追加
Trueのときに編集可

UPROPERTY(Category = "test", EditAnywhere, BluePrintReadWrite, meta = (EditCondition = "EditTest"))
int hoge;
UPROPERTY(Category = "test", EditAnywhere, BluePrintReadWrite)
bool EditTest;

これだけ。後は作ったC++クラスを継承したアクターをレベルに配置するとこういう感じで表示されるので、チェックONOFFで編集状態が切り替わる。
f:id:oneday-memorandum:20170809165851p:plain

Falseのときに編集可にする場合は下記の通り

UPROPERTY(Category = "test", EditAnywhere, BluePrintReadWrite, meta = (EditCondition = "!EditTest"))
int hoge;
UPROPERTY(Category = "test", EditAnywhere, BluePrintReadWrite)
bool EditTest;


enumで編集可、不可の設定

UPROPERTY(Category = "enumtest", EditAnywhere, BluePrintReadWrite, meta = (EditCondition = "EnumValue==enable"))
int enableEdit;
UPROPERTY(Category = "enumtest", EditAnywhere, BluePrintReadWrite, meta = (EditCondition = "EnumValue==disenable"))
int disenableEdit;
UPROPERTY(Category = "enumtest", EditAnywhere, BlueprintReadWrite)
enumtest EnumValue;

としたいところだが、どうやらEditConditionは式を判別できない模様。
ということでこんな感じでまずはコードを書く。(今回はチェックのためにあえてbool型をEditAnywhereにしている。)

/*クラスの外にenumを宣言*/
UENUM()
enum class enumtest : uint8
{
	enable UMETA(DisplayName = "enable"),
	disenable UMETA(DisplayName = "disenable")
};

/*クラス内に変数を宣言*/
UPROPERTY(Category = "enumtest", EditAnywhere, BlueprintReadWrite)
bool enumBool;
UPROPERTY(Category = "enumtest", EditAnywhere, BluePrintReadWrite, meta = (EditCondition = "enumBool"))
int enableEdit;
UPROPERTY(Category = "enumtest", EditAnywhere, BluePrintReadWrite, meta = (EditCondition = "!enumBool"))
int disenableEdit;
UPROPERTY(Category = "enumtest", EditAnywhere, BlueprintReadWrite)
enumtest EnumValue;

書いたらこんな感じで公開される
f:id:oneday-memorandum:20170809165926p:plain
この段階であえて表示しているチェックをONOFFで編集可、不可が切り替わるが、enumを変更しても変わらない。
ここまでできたらコンストラクションスクリプト内でこのようにノードを組む。
f:id:oneday-memorandum:20170809170822p:plain
あとはコンパイルしてenumを切り替えると編集可、不可が切り替わる。できたら使わないbool変数は表示しないようにしておく。

forums.unrealengine.com
ここによるとCanEditChangeをオーバーライドすると式の評価ができるみたいだが、よくわからなかった。
誰か教えてください。