ゲーム制作をしていて、時々おやっ?と思うことがあります。そんな小ネタを時々挟んでみます。
※めちゃくちゃ速いぞ!今から買うならGen5だなー(要マザボ対応)
var is_press = is_trbox1 and is_trbox2 @export var is_trbox1: bool = true @export var is_trbox2: bool = true
この初期化の結果、is_press の値は false になります。ノードがインスタンス(実体化)する時にメンバ変数は初期化されますが、その初期化は上から順番に行われます。is_press の初期化タイミングでは、is_trbox1 も is_trbox2 もまだ初期化される前です。bool 型のデフォルトは false なので、false and false が実行されて false になります。パッと見ただけでは true になりそうなのでハマりポイントとなります。
そして、状況によってはさらに不可解な事が起きます。上から順番だからと宣言を入れ替えて、再度実行するとします。
@export var is_trbox1: bool = true @export var is_trbox2: bool = true var is_press = is_trbox1 and is_trbox2
この実行結果、どこからどう見ても is_press は true に見えますが、これでもまだ false なのです。原因は @export 指定です。これは外部定義指定なのですが、最初の起動で is_trbox1 も is_trbox2 も意図せず false で初期化されてしまったので、インスペクターの初期値として false が登録されてしまってて、起動のたびにインスペクター登録の値である false で初期化されてしまうのです。
これを解決する方法はいくつかありますが、まずはインスペクターから Is Trbox1 と Is Trbox2 を true に指定し直す必要があります。その上で確実に正しい値を取得するのであれば、is_press の記述方法を変更します。
var is_press: bool: get: return is_trbox1 and is_trbox2
これで is_press が参照されるたびに is_trbox1 and is_trbox2 が再計算されて、常に正しい結果が返るようになります。
キオクシア(KIOXIA)

コメント