♻️
GDScriptでのタイプガードに as が便利
Godot で開発していると、型付き変数やダウンキャストに関するコードを書く場面はよくあります。
特に「あるノードが特定の型かどうかをチェックして安全に扱いたい」ときにどう書けばよいか悩む人も多いはずです。
実は GDScript には as を使ったタイプガード という便利な書き方があります。
これを知っておくだけで、コードがシンプルかつ安全になるので紹介します。
(筆者は最近知りました...)
従来の書き方
例えば「Node を受け取って、それが Sprite2D なら処理をしたい」という場合です。
従来は次のように書いていました。
func process_node(node: Node) -> void:
if node is Sprite2D:
node.texture = preload("res://icon.png")
TypeScript などの言語では、この方法を使うと node が Sprite2D であると認識され、補完も効くのでそのままメンバや関数にアクセスできます。しかし Godot の場合は補完が効かず、Sprite2D のプロパティや関数に直接アクセスできない不便さがありました。
as をタイプガードとして使う
実は GDScript では、as を直接使うことで「型変換 + nullチェック」を同時にできます。
func process_node(node: Node) -> void:
var sprite := node as Sprite2D
if sprite:
sprite.texture = preload("res://icon.png")
as は無理やりキャストするわけではなく、型が合っていれば値が入り違っていれば null が入るようです。これで型がついて補間も効いて快適ですね(ただし null チェックは忘れずに!)。
まとめ
-
asは キャスト演算子 であると同時に タイプガード としても使えます -
var obj := something as Type→if obj:で自然に型判定できます - 冗長になりがちな is + as をまとめられるのでコードがすっきりします
Godot の GDScript は書きやすいですが、こうした小さな便利機能を知っているとさらに効率が上がります。
ぜひプロジェクトで試してみてください!
Discussion