【Godot】GDScript:asキーワードによる型キャストと is 演算子との違い

GodotEngine

as キーワード概要

Godot(GDScript) における as は、型キャスト(Type Casting) を行うためのキーワードです。

指定したオブジェクトが特定の型(クラス)に変換可能かをチェックし、
成功すればその型のオブジェクトとして扱えるようにします。(変換できない場合は null を返す

主に、ノードやリソースを安全にキャストしたいときに、以下のように使用します。

var node = get_node("<適当なノードのバス>")
var sprite = node as Sprite2D    # node を Sprite2D 型としてキャストしようと試みる。

# キャストに成功すれば sprite にそのSprite2Dオブジェクトが入り、失敗すればnullとなるため、nullチェック
if sprite != null:
    sprite.texture = preload("res://icon.png")    # キャスト成功時はSprite2Dの専用プロパティへアクセスが可能

キャストによって型を確定させることで、安全な取り扱いのほか、GDScriptエディタ記述時に補完が有効になったり、
キャスト自体の成否(nullチェック)によって型を判別するような挙動も可能になります。

is 演算子との違い

型の確認という点で、よく似た挙動を取る is 演算子 との違いについてもおさえておきましょう。

is は、型の判定を行う演算子で、以下のように使用します。
指定オブジェクトの型が指定した型、もしくはその派生型であればTrue、そうでなければFalseとなります。

# 例:変数obj の型がSprite2D (もしくはその派生型)であれば、テクスチャのロードを実行する
if obj is Sprite2D:
    obj.texture = preload("res://icon.png")

as キーワードとの違いは、「型のキャストを行うか、型の判定のみか」という点で、
まとめると、以下のようになります。

要素型の明示型のチェック
as キーワード
コード上で型が確定し、補完も使用可

検証としてはnullチェックが必要
is 演算子×
判定のみで、型の明示はしていない

True/Falseで簡潔に判定可能

is 演算子による型の判定と、 as キーワードを組み合わせることで、以下のようにより安全に肩を明示的にキャストする使い方も可能です。

if obj is Label:
    var label := obj as Label
    label.text = "Hello"

as の活用例

最後に、as キーワードによる型キャストの活用例について、いくつかまとめておきます。

ノード取得後の型を確定させる

get_node() は返り値が一般的に Node 型なので、具体的な型がわかっているなら as でキャストして扱いやすくできます。

var label = $Label as Label
if label:
label.text = "Hello"

複数ノードをまとめてキャスト・処理

複数ノードの繰り返し処理の中で、キャストの成否によって特定の型のみを対象に操作も可能です。

for child in get_children():
    var sprite = child as Sprite2D
    if sprite:    # 子ノードの中で Sprite2D だけを対象に操作
        sprite.modulate = Color(1, 0, 0) # 赤くする

型が不定のオブジェクト引数から、特定の種類のものだけ処理

以下のように、衝突したオブジェクトなど、不定のオブジェクト引数が、指定したクラスにキャストできた場合にのみ処理するような書き方も可能です。

func _on_area_entered(area):
    var enemy = area as Enemy
    if enemy:
        enemy.stun()

まとめ

  • as は指定したオブジェクトのデータ型へのキャストを試すためのキーワード。(is 演算子は型の判定のみ)
  • キャストに成功すればその型として安全に操作できる。
  • 失敗してもエラーにはならず null になるので、null チェックは必須
  • 主にノード取得後に肩を確定させたり、特定の型に変換可能なオブジェクトにアクセスしたいときに使う。

おすすめの本①
おすすめの本➁(Godot)
GodotEngine
ひらまめ(hiramame)をフォローする

コメント

タイトルとURLをコピーしました