【Godot Engine】GDScriptメモ➁:基本的な演算子と処理構文(分岐/ループ処理)

GodotEngine

演算子

GDScriptで使用可能な演算子から、汎用的に使用するものを抜粋したものが以下になります。

演算子説明
( )演算の優先度定義
await「await <シグナル>」で、指定シグナルが発生するまで待機
is「<変数> is <データ型>」で、データ型のチェック
+, -, *, / , %加算(+),減算(-),乗算(*),除算(/),剰余算(%)
※+, – は正負の値を表記するのにも使用します
**累乗。 (例:2**5 = 2の5乗 = 32)
==, !=一致(==),不一致(!=)の比較
>, >=, <, <=大なり(>),以上(>=),小なり(<),以下(<=)の比較
>> , <<ビットシフト
~ , & , | ,^ビット単位での、NOT(~),AND(&),OR(|),XOR(^)
in包含チェック。(例:a in b = aがbに含まれていればTrue)
※for文での挙動は少し異なるため注意
not, and, orブール値のnot,and,or (!,&&,|| での記述も可能)
一言コメント
一言コメント

↑の一覧では他の関数処理とセットで使用するものや使用頻度の低いものは割愛しています。
完全な一覧は公式ドキュメント「GDScriptリファレンス」をご参照ください

条件分岐 (if文, match文)

GDScriptで条件分岐を行う際は、if文かmatch文を使用します。

if文 (if, elif, else)

if 文は最も基本的な条件分岐処理で、条件式の結果(True/False)によって処理を分岐させます。

if <条件式> :
	<ifの条件式がTrueの時の処理>
elif <条件式> :
	<ifの条件式がFalseで、elifの条件式がTrueの時の処理>
else :
	<else以前の全条件式がFalseの時の処理>

三項演算子を用いて、if文の結果から変数へ値を代入することも可能です。

var <変数名> = <式がTrueの時代入する値> if <条件式> else <式がFalseの時代入する値>

match文

match文は複数の値によって多重分岐を行う処理構文です。(他プログラム言語のswitch文に相当)
「指定の比較値と値が同値であるか」が分岐条件で、どれとも一致しない場合は「_」で定義します。

match <比較値> :
	<値01> :
		<変数が値01と同値である場合の処理>
	<値02> :
		<変数が値02と同値である場合の処理>
	_ :
		<変数が定義されている度の値とも同値でない場合の処理>

データ型による分岐:typeof()と組み込み定数のTYPE_XXを使用します

match typeof(x):	#typeof()によって変数xのデータ型を取得
	TYPE_FLOAT:		#xがfloat型の場合
		print("float")
	TYPE_STRING:		#xがstring型の場合
		print("string")

複数の一致条件(OR):「,」区切りで複数パターンのいずれかに一致した場合の判定が可能

match x:
	1, 2:
		print("xは1か2です")
	_ :
		print("xは1か2ではありません")

変数への代入:matchで変数への代入を行うことも可能です。(判定としては「_」と同様)

match x:
	1:
		print("xは1です。")
	var x_value:		#xが1ではない時、x_valueへxの値を代入
		print("xは1ではなく、", x_value,"です。")

配列の分岐:
 配列を判定する場合はサイズを含めた完全一致が基本で、そこに「_」や「..」 を加えて記述

match x:
	[]:
		print("空の配列です")
	[1, 2, 3]:
		print("[1,2,3]の配列です")
	[_, 10]:
		print("要素数が2つで、末尾が10の配列です")
	[10, 20, ..]:
		print("先頭から要素が[10],[20]の配列です")

辞書型の分岐
 辞書型も配列とほぼ同様ですが、「Key/Value」毎に判定が可能です。(配列と同じ記法は割愛)

match x:
	{"A": 10, "B":20}:
		print("{A: 10, B:20} の辞書型です" )
	{"A": 10, "B"}:
		print("{A:10}と、キー値 B を持つ辞書型です")	#BのValue値は不問
	{"A", "B"}:
		print(":要素数が2で、キー値がA,B を持つ辞書型")	#各Value値は不問

条件式の組み合わせ(パターンガード)
 whenを使うことで、変数への代入などと組み合わせた分岐条件の指定も可能です。

match x:
	[var a, var b] when a > b:
		print("aはbよりも大きい値です。: (%s, %s)" % [a, b])
	[var a, var b] when a < b:
		print("aはbよりも小さい値です。: (%s, %s)" % [a, b])
	[var a, var b]:
		print("aとbの値は一致しています。: (%s, %s)" % [a, b])

繰り返し処理 (while文, for文)

繰り返し処理を作る際は、while文かfor文を使用します。どちらでも同じような処理を行うことは可能ですが、リストデータを処理する場合はfor文の方がより簡単に記述ができます。

while文

while文は基本となる繰り返し処理で、指定した条件式がTrueとなる間、繰り返し処理を行います。

while <条件式>:
	<条件式がTrueの間、繰り返す処理>

for文

for文はループ変数とリスト状のデータ(配列や辞書型、文字列等)を指定して繰り返し処理を行います。

for <ループ変数> in <配列/辞書型/文字列などのリストデータ>:
	<繰り返し処理>

for文は用法が多いため、以下にいくつかの使用例をまとめておきます。

var data = [10,20,30]
for i in data:
	print(i)	# 10,20,30 と出力

var dict = {"a": 0, "b": 1, "c": 2}
for i in dict:
	print(i)	# a, b, c と出力
	print(dict[i]) # 0, 1, 2 と出力

for i in range(3):
	print(i) # 0, 1, 2 と出力

for i in 3:
	print(i) # 0, 1, 2 と出力(range(3)と同様)

for i in range(1, 3):
	print(i)	#1, 2 と出力

for i in range(2, 10, 2):
	print(i)	#2, 4, 6, 8 と出力

for c in "ABC":
	print(c)	#A, B, C と出力

for文のループ変数はループ内のローカル変数です。
そのため、ループ変数へ代入や変更を行っても元となったリストデータへは反映されません。
→リストデータを編集したい場合は、以下のような書き方をします

# 配列内の各要素を更新する
var data = [1,1,1]
for i in data.size():
	data[i] = 2	#ループ変数は元の配列の引数として使用

print(data)	#出力は [2,2,2]

# 二次元配列の末尾にデータを追加する
var array_list = [[1,1], [2,2]]
for array in array_list:
	array.append(3)		# 参照によって渡されているオブジェクトは編集可能

print(array_list)	#出力は [[11, 12, 3], [21, 22, 3]]

繰り返し処理用のキーワード

繰り返し処理の中断やスキップには、以下のキーワードがwhile/for両方で使用できます。

キーワード概要
break繰り返し処理を中断する
continuecontinue分の時点で残りの処理をスキップし、次の繰り返しの先頭へ戻る

参考情報

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

GDScript
GDScript reference, GDScript: An introduction to dynamic languages, GDScript exported properties, GDScript documentation comments, GDScript style guide, Static ...
おすすめの本①
おすすめの本➁
GodotEngine
ひらまめ(hiramame)をフォローする
ひらまめゲーム制作研究室

コメント

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