見出し画像

Godot 4.3移行で出たワーニング

Godotエンジン4.3のDev6が出ました。β前の最終バージョンみたいです。
早速プロジェクトを移行してみました。今まで出なかったワーニングが出るようになりました。これはその記録。



UNUSED_SIGNAL

The signal "wet_ratio_changed" is declared but never explicitly used in the class.

このワーニング項目自体は4.2から存在していました。
4.3 RC5では、シグナルの所有者がemitせず、第三者にsignalを取らせてemitしていると、このワーニングが出るようになりました。

signal wet_ratio_changed()

# 自分のシグナルをemitするとワーニングにならない
wet_ratio = next_wet_ratio
wet_ratio_changed.emit()

# 4.3ではこれはワーニング
var cell: Cell = area.get_cell(idx_x, idx_z)
cell.wet_ratio = next_wet_ratio
cell.wet_ratio_changed.emit()

型ヒントを使ってても、出ます。

そもそも、これは自分の書き方に問題があって、このCellクラスにある程度の主体を持たせているにも関わらず、外からsignalをemitするということをしています。
Cellクラスの他のsignal同様に、Cellの関数内でemitするのがいいように思います。これならワーニングは出ません。

# このクラスにこういう関数はすでにいくつもあった
func plant_tree() -> bool:
	if tree_growth_ratio_pct < 100:
		tree_growth_ratio_pct = 100
		plant_modified.emit()
		return true
	return false

# wet_ratioについても同じようにする
func set_wet_ratio(new_wet_ratio: float) -> void:
	if new_wet_ratio != wet_ratio:
		wet_ratio = new_wet_ratio
		wet_ratio_changed.emit()

ENUM_VARIABLE_WITHOUT_DEFAULT

The variable "soil_type" has an enum type and does not set an explicit default value. The default will be set to "0".

・enumにint値ゼロ相当の項目が存在せず
・そのenumを関数の引数に使っていて
・引数のデフォルト値を定義していない
ときに出るワーニングのようです。多分。

enum SoilType
{
	SAND = 4,
	DRY_SOIL = 8,
	GRASS_GROW = 16,
	BUSH_GROW = 18,
	TREE_GROW = 20,
	ROCK_FACE = 32,
}

# 引数にenumを使っている
# デフォルト値も無い
static func underground_tex_col(soil_type: Cell.SoilType) -> Geomancer.TexCol:

筆者はライブラリを作るでもない限り、引数のデフォルト値を指定しない方針にしてます。なので引数側ではなく、enum側に手を加えることでワーニングを消すことにしました。

ゼロ相当の項目が無いenumは、int値をわざわざ定義していたenumです。タブ区切りのテキストファイルでデータをやり取りするenumや、intにキャストして何かのインデックスにしたりするenumのときに、デザインした値を設定してます。そのときにゼロを欠番にしてる場合があるのです。

enum SoilType
{
	NONE = 0,
	SAND = 4,
	DRY_SOIL = 8,
	GRASS_GROW = 16,
	BUSH_GROW = 18,
	TREE_GROW = 20,
	ROCK_FACE = 32,
}

ひとまず、"NONE"でも"INVALID"でもいいので、=0の項目を追加しました。
ワーニングが無くなりました。

なんかそもそもenumに0相当の項目が無いこと自体がGDにとって都合が悪いのかもしれません。根拠ないけど。ひとまず今後は数値指定のあるenumは意識してゼロを追加するようにしていこうと思います。


以上です~~

この記事が気に入ったらサポートをしてみませんか?