第 1 节:GdScript の理解#
Godot は GdScript をスクリプト言語として使用し、コードでゲームオブジェクトを制御します
- GdScript は弱い型付けの言語であるため、比較的自由ですが、コードをより規範的にするためにいくつかの原則を定めることができます:
クラス名はファイル名と同じで、小文字である必要があります
できるだけNode2Dノードを継承し、Node2Dノード内のTransformは最も使用されるノードです
- よく使われる関数の内部実行順序、_init _ready _process
いくつかのイベント関数がデフォルトで定義されています。例えば、
_init() スクリプトの初期化時に呼び出され、オブジェクトのコンストラクタで、Javaのコンストラクタに似ています
_ready() 一度呼び出され、スクリプトの初期化に使用できます
_process(delta) 毎フレーム呼び出され、フレーム間隔は不等で、ゲームの更新に使用できます
第 2 節:変数とデータ型#
- 変数は情報を保存するための「コンテナ」です。
var x=5;
var y=6;
var z=x+y;
代数のように
x=5
y=6
z=x+y
代数では、値(例えば5)を保存するために文字(例えばx)を使用します。
上記の式z=x+yを通じて、zの値が11であることを計算できます。
Godotでは、これらの文字は変数と呼ばれます。
- Export キーワードを使用すると、変数をエディタで編集できます
# 数字をエクスポート
@export var a = 1
# ノードパスをエクスポート
@export var b:NodePath
# ノードパスをエクスポート、異なる書き方
@export(NodePath) var c
# ファイルパスをエクスポート
@export(String, FILE) var e
# txtで終わるファイルパスをエクスポート
@export(String, FILE, "*.txt") var d
# リソースファイルパスをエクスポート
@export(Resource) var f
# 色をエクスポート
@export(Color, RGB) var g
- GDS データ型の分類
- Bool、1 バイト、デフォルトは false
- Int(C++ および Java の long と同じ)、8 バイト、デフォルトは 0
- Float(C++ および Java の double と同じ)、8 バイト、デフォルトは 0
- String、デフォルトは null、文字列は「John Doe」のような一連の文字を保存できます。
- 配列
- オブジェクト
- Null、変数が値を持たない場合、デフォルトは null です
第 3 節:関数#
- 関数は、呼び出されたときに実行される再利用可能なコードブロックとして簡単に理解できます。
- 関数は波括弧で囲まれたコードブロックで、前にキーワード func を使用します。この関数を呼び出すと、関数内のコードが実行されます。
- 空の関数は pass キーワードを使用する必要があります
func sayHello():
# コードを実行
- 引数付きの関数を呼び出すとき、関数を呼び出す際に値を渡すことができ、これらの値は引数と呼ばれます。
func sayHello(param1, param2):
# コードを実行
- 戻り値のある関数では、時には関数が呼び出し元に値を返すことを望むことがあります。return 文を使用することで実現できます。
- return メソッドは戻り値の型を指定できます
func sayHello(param1, param2):
# コードを実行
return x
第 4 節:変数のスコープ#
- ローカルスコープ、関数内で宣言された変数はローカルスコープであり、関数内部でのみアクセスできます
# ここではcarName変数を呼び出すことはできません
func myFunction():
var carName = "Volvo";
# 関数内でcarName変数を呼び出すことができます
- グローバル変数、関数外で定義された変数はグローバル変数であり、スクリプトファイル全体で使用できます
var carName = "Volvo";
# ここではcarName変数を呼び出すことができます
func myFunction():
# 関数内でcarName変数を呼び出すことができます
第 5 節:演算子#
- 算術演算子
+ 加法 x=y+2 7 5
- 減法 x=y-2 3 5
* 乗法 x=y*2 10 5
/ 除法 x=y/2 2.5 5
% 剰余 x=y%2 1 5
- 代入演算子、代入演算子は GdScript 変数に値を代入するために使用されます
= x=y x=5
+= x+=y x=x+y x=15
-= x-=y x=x-y x=5
*= x*=y x=x*y x=50
/= x/=y x=x/y x=2
%= x%=y x=x%y x=0
- 比較演算子、比較演算子は論理文で使用され、変数または値が等しいかどうかを判断します
== 等しい x==8 false
!= 等しくない x!=8 true
> 大きい x>8 false
< 小さい x<8 true
>= 大きいまたは等しい x>=8 false
<= 小さいまたは等しい x<=8 true
- 論理演算子、論理演算子は変数または値間の論理を判断するために使用されます。
&& and (x < 10 && y > 1) は true
|| or (x==5 || y==5) は false
! not !(x==y) は true
第 6 節:条件文#
-
コードを書くとき、異なる決定に対して異なるアクションを実行する必要があります。条件文を使用してこのタスクを完了できます。
-
if 文 - 指定された条件が true のときのみ、この文を使用してコードを実行します
if (condition):
条件がtrueのときに実行されるコード
- if...else 文 - 条件が true のときにコードを実行し、条件が false のときに他のコードを実行します
if (condition):
条件がtrueのときに実行されるコード
else:
条件がtrueでないときに実行されるコード
- if...else if....else 文 - この文を使用して、実行する複数のコードブロックの 1 つを選択します
if (condition1):
条件1がtrueのときに実行されるコード
elif (condition2):
条件2がtrueのときに実行されるコード
else:
条件1と条件2の両方がtrueでないときに実行されるコード
- match(switch)文 - この文を使用して、実行する複数のコードブロックの 1 つを選択します
第 7 節:ループ文#
- ループは、指定された回数だけコードブロックを実行できます。同じコードを何度も実行し、毎回異なる値を持たせたい場合、ループを使用するのが便利です。
- for
- while
- break 文はループを抜けた後、ループの後のコード(もしあれば)を続けて実行します
- continue 文はループ内の反復を中断し、指定された条件が発生した場合、ループ内の次の反復を続けます
第 8 節:配列と辞書の反復#
- 配列の反復
func arrayIterator():
# rangeはfor(int i = 0; i < 20; i++)に相当します
print("配列の反復方法1:")
for i in range(3):
print(i)
print("配列の反復方法2:")
for ele in arr:
print(ele)
print("配列の反復方法3:")
for index in range(arr.size()):
print(arr[index])
- 辞書の反復
func dictionaryIterator():
print("辞書の反復方法1:")
for key in dict:
print("key:" + key as String)
print("value:" + dict[key] as String)
print("辞書の反復方法2:")
for key in dict.keys():
print("key:" + key as String)
print("value:" + dict[key] as String)
print("辞書の反復方法3:")
for value in dict.values():
print("value:" + value as String)
第 9 節:静的変数と静的メソッド#
- const 変数(静的変数)
const ANSWER = 42
- 静的メソッド
static func getAnswer():
return ANSWER
第 10 節:オブジェクト#
- 現実世界のオブジェクト、属性とメソッド
- 現実世界では、自動車はオブジェクトです。オブジェクトには、重量や色などの属性があり、起動や停止などのメソッドがあります
# 内部クラス、デフォルトでObjectを継承
class Animal:
extends Object # 継承するクラスを指定しない場合、デフォルトは基底Object
const STATIC_FIELD = "静的変数"
# 属性
var height: int
func _init():
print("Animalのコンストラクタ")
func move():
print("animal、移動")
static func staticFuction():
pass
第 11 節:ノードの取得方法#
# 現在のノードを取得
var currentNode1 = $"."
var currentNode2 = self
# 親ノードを取得
var parentNode1 = get_parent()
var parentNode2 = $"../"
# 子ノードを取得
var subNode1 = $SubNode2
var subNode2 = $"SubNode2"
var subNode3 = get_node("SubNode2")
# ルートノード検索法、ノードツリーの上から下に見つかった最初のノードを返します
var subNode4 = get_tree().root.find_node("SubNode2", true, false)
第 12 節:信号 signal#
-
信号はモジュールや機能間の通信を完了するための媒体であり、実際にはいくつかのメソッドのコールバック形式を約束したものです
-
デザインパターンでは、オブザーバーデザインパターンと呼ばれます
1. 観察者と被観察者は抽象的に結合されており、モジュールをデカップリングします
2. 統一されたトリガーメカニズムを構築します
-
Godot エンジンの公式は、ゲーム開発においてモジュールや機能間の通信を完了するために信号をより多く使用することを推奨しています
-
第一の使用方法
# 第一の信号受信方法、シーン内で信号の受信方法を設定します
func _on_Button1_pressed():
print("こんにちはボタン1")
- 第二の使用方法
# 第二の信号受信方法、コードで信号の受信を制御し、より柔軟で推奨される方法です
func _ready():
$Button2.connect("pressed", self, "onButton2")
func onButton2():
print("ボタン2が押されました")
第 13 節:カスタム信号#
- カスタム信号
signal mySignal(a, b)
- 信号を送信
emit_signal("mySignal", 1, 2)
- 信号のバインディングを解除
disconnect("mySignal", 1, 2)