【Godot Engine】GDScriptメモ①:変数・定数と各データ型の取り扱い

GodotEngine

変数

GDScriptで変数を宣言する際は、var キーワードを使用して以下のように記述します。

#暗黙的な型指定の宣言
var a			#空の変数a(初期値:null)
var b = 10		#数値10で初期化された変数b

#データ型を指定した宣言
var c : Vector2		#「:」を使用してデータ型[Vector2]を指定した空の変数c
var d := Sprite2D.new()	#dは宣言と同時に初期化を行っているため、:後の型表記を省略

静的変数

static キーワードで静的な変数を宣言することも可能です。

static var id = 100

ここでの静的変数とは、定義されたクラスで固有(=そのクラスのインスタンスで共用)となる変数のことです。
→静的変数を共用的な変数で定義することで、すべてのインスタンスへ同じ変更が反映できます。

例)
クラスAに静的変数「static var x = 10」が宣言され、クラスAからインスタンスA01,A02が生成されているとします。
この状態でクラスAのxに+1加算する処理を行った場合、インスタンスA01,A02のもつxの値はどちらも「11」となります。

Godotではスクリプト内に静的変数がある場合、他の参照が残っていない場合でも自動でアンロード(メモリ解放)がされなくなってしまいます。(GDScriptクラスはリソースのため、保持される)
そのため、@static_unloadを使用して、すべての参照が失われた後に持続しないように設定します。(スクリプトがロードし直されると、静的変数はデフォルト値に戻ることに注意)

@static_unload		#スクリプトのアンロード設定。(スクリプト先頭行に記述)
class_name <クラス名>

定数

定数とは、ゲームの実行中に変更できない(一定のデータとして保持・利用したいものに使う)値です。
GDScriptで、定数は const キーワードを用いて以下のように宣言します。

const A = 100

列挙型

列挙型は定数のリストのようなもので、enumキーワードと{}を用いて以下のように宣言できます。
(列挙型のメンバは初期化も可能ですが、省略すれば自動的に0からの値が順に割り当てられます)

enum TestData{DATA_A, DATA_B, DATA_C}	#列挙型の宣言

print(TestData.DATA_A)		#列挙型へのアクセス(出力は0)
print(TestData.DATA_B)		#列挙型へのアクセス(出力は1)
print(TestData.DATA_C)		#列挙型へのアクセス(出力は2)
一言コメント
一言コメント

GDScriptのスタイルガイドより、定数はCONSTANT_CASE、列挙型はPascalCaseで命名しています。(列挙型のメンバは定数扱い)

データ型

変数や定数を宣言する際に指定できるデータ型として、一部を抜粋して以下にまとめます。

基本となるデータ型

データ型説明
null情報を持たない空のデータ型
bool論理型。true または false の値を保持
int整数型。
float浮動小数点型。少数を含む実数を保持
String文字列型。(Unicode形式)
StringName不変の文字列型。変更ができない代わりに比較等が高速であるため、検索や照合処理でString型より有利(文字列の”識別子”のようなイメージ)
NodePathノードまたはノード プロパティへのパス。
ColorRGBA 形式で表される色データ型。
RIDリソースの識別子(=ResourceID)データ型。
Objectエンジン内の全クラスが継承する、基本となる型。=Godotオブジェクトの基盤
SignalGodotにおける”シグナル”を格納するデータ型。
Callable関数を格納するデータ型。シグナルのコールバック処理等で有用。

ベクトル関連のデータ型

データ型説明
Vector2 , Vector2i2Dベクトル型。x , y のコンポーネントを持ち、配列としてアクセスることも可能。(Vector2i はコンポーネントが整数型のもの)
Rect22D矩形型。 position , size , end(position+size) というフィールドを持つ。
Vector3 , Vector3i3Dベクトル型。x , y , z のコンポーネントを持ち、配列としてアクセスることも可能。(Vector3i はコンポーネントが整数型のもの)
Transform2D2D 線形変換に使用される 2×3 行列 (2 行、3 列)型。
→平行移動、回転、スケーリングなどの変換の定義が可能。
Plane3D平面を表現するためのデータ型。法線ベクトルと距離で定義される。
Quaternion3D 回転を表現するためのデータ型。
AABB3Dオブジェクトや領域を囲むために使用される、平行な境界ボックスを表すデータ型。(AABB=Axis-Aligned Bounding Box)
Basis3D 回転とスケーリングに使用される 3×3 行列型。
Transform3D3D 線形変換に使用される 3×4 行列 (3 行、4 列)型。Basisに原点を加えたもの。

コンテナ系のデータ型

データ型説明
Array・配列型。
・宣言するときは、[]を使用。(例:var data = [10,20,30])
・要素は 0 から始まる数値インデックス(※)によってアクセス
 ※負数は末尾から数えた要素 (-1 は最後の要素、-2 は最後から 2 番目など)
 例) data[0]=10, data[1]=20 , data[2]=30 , data[-1]=30
PackedArray・単一のデータ型のみを受容する配列型。(大規模なデータ配列を扱うときに使用)
・各データ型ごとに専用のPacked<データ型>Arrayという型が存在(詳細は割愛)
・メモリの断片化に耐性が高い一方、速度は通常の配列より遅い傾向あり
Dictionary・辞書型。キーと値のペアを保持。
・宣言するときは、{}を使用し、”:”区切りでkey/valueを定義
 例)var data = {“key_A” : 10, “key_B” : 20, “key_C” : 30}
・アクセスする際は、キー値を指定
 例)data[“key_A”] = 10

リテラルと文字列の取り扱い

GDScriptで利用可能なリテラルは以下の通りです。

リテラル概要
nullNull値
true / false ブール値
0x , 0b16進数(0x), 2進数(0b)
例) 10進で「26」= 16進:0x1a , 2進:0b11010
r””生の文字列(Raw Strings)。このリテラルで定義した文字列は、エスケープシーケンス(例: \n, \t, \\など)を処理せずに、文字列のまま扱うことが可能。
→正規表現やファイルパスなどを扱いたい場合に有用です。
&””StringName型での文字列定義
^””ノードパスの指定

文字列リテラル

文字列リテラル内容
\n改行(改行)
\t水平タブ文字
\rキャリッジリターン
\aアラート (ビープ音/ベル)
\bバックスペース
\fフォームフィード改ページ
\v垂直タブ文字
\"二重引用符
\'一重引用符
\\バックスラッシュ
\uXXXXUTF-16, Unicode コードポイント
\UXXXXXX
UTF-32 Unicode コードポイント

フォーマット文字列

GDScriptでは「フォーマット文字列」という、文字列に変数や式を埋め込む(=フォーマット)機能があります。ここでは、その基本的な使い方をまとめています

初めに、フォーマット文字列のポイントは大きく以下の内容になります。

フォーマット文字列のポイント
  • フォーマット文字列は、プレースホルダーを用いて文字列に変数や式を埋め込む機能
  • プレースホルダーは「%」から始まり、埋め込むデータ型によって種類がある
  • 埋め込みの基本は、<プレースホルダーを設定した文字列> % <埋め込みデータ>
    ※String.format() で指定も可能(辞書型や配列を扱いたい場合はこちらが便利)

基本的な使い方

以下は最も基本的な文字列(String : %s)型を埋め込む例です。

var base_string = "私の名前は「%s」です"	# %s でstring型のプレースホルダーを設定
print(base_string % "ひらまめ")		# % "<文字列>" で、文字列データを埋め込み

#複数の埋め込みがある場合
base_string = "私の名前は「%s」です(%s回目)"	# 複数のプレースホルダーを設定
print(base_string % ["ひらまめ","2"])		# 複数の埋め込みの際は[](配列)で指定


# ↑の各print文出力結果は以下のようになります
# 私の名前は「ひらまめ」です
# 私の名前は「ひらまめ」です(2回目)

文字列への埋め込み(フォーマット)は、String.format()メソッドでも可能で、
プレースホルダーに「キー値」を、formatメソッドの引数にキーに対応する値を指定します。

var base_string = "私の名前は「{name}」です"	# {name}でプレースホルダーを設定
print(base_string.format({"name":"ひらまめ"}))	# format()で文字列データを埋め込み

#複数の埋め込みがある場合
base_string = "私の名前は「{name}」です({count}回目)"	# 複数のプレースホルダーを設定
print(base_string.format({"name":"ひらまめ","count":"2"}))		# 複数の埋め込みの際は[](配列)で指定

# ↑の各print文出力結果は以下のようになります
# 私の名前は「ひらまめ」です
# 私の名前は「ひらまめ」です(2回目)
一言コメント
一言コメント

↑の指定方法はどちらでも動作は同じですが、データベースやセーブファイルの情報など、辞書や配列データに類するものを扱う場合は、String.format()のほうが有用です。

形式指定子とプレースホルダー修飾子

プレースホルダーの設定時、データ型の指定に使用可能な形式指定子は以下の通りです。

形式指定子対応するデータ型
%s文字列データ(String型)
%c1文字分の文字データ(c は characterから)
%d10進整数データ
%o8進整数データ
%x , %Xx : 小文字 , X : 大文字 を含む16進整数データ。
%f10進数の実数データ
%vベクトル型データ。(float または int でベクトルデータを指定)

また、プレースホルダーには以下の修飾子が利用できます(記述は% と形式指定子の間)

修飾子効果
+・数値指定子で付与すると、正の数値で「+」を出力する
例)print(“%+d” % 5) #+5
  print(“%+d” % 0) #+0
  print(“%+d” % -5) #-5
0 ~ 9 の整数・パディング(出力する桁数)を指定する。
・修飾子が0から始まる場合はfきスペースが「0」で埋められる
例)print(“%10d” % 12345) #「 12345」(10桁分のパディング)
  print(“%010d” % 12345) #「0000012345」(10桁分のパディング)
. + <0~9の整数>・小数点以下のパディング(出力する桁数)を指定する。
例)print(“%5.2f” % 12345.5555) #「 123.56」
・パディングの向きを右側に指定する。
例)print(“%-10d” % 12345) #「12345 」(10桁分のパディング)
*・動的パディング(パディングの値をフォーマット時に指定できる)設定
 →パディングのプレースホルダーのイメージ
例)print(“%*.*f” * [3,2,10.555]) #「 10.56」
一言コメント
一言コメント

フォーマットの指定方法は各修飾子やプレースホルダーの指定方法によって多岐にわたります。
公式ドキュメントでも用例がまとめられていますので、是非ご参照ください。(↓)

GDScript format strings
GDScript offers a feature called format strings, which allows reusing text templates to succinctly create different but similar strings. Format strings are just...

参考情報

この記事は、以下公式ドキュメント「GDScript」の内容を一部抜粋してまとめたものになります。
より詳細な内容は以下をご参照ください。

GDScript
GDScript reference, GDScript: An introduction to dynamic languages, GDScript exported properties, GDScript documentation comments, GDScript style guide, Static ...

コメント

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