イントロダクション
プログラミングをせずにゲームを作れるツールについて多くが言われてきた。 コーディングについて学んでいないでゲームを作ろうとする多くの自主的な開発者の夢であった。 これにはゲームデザイナーがたくさんのゲームの流れを操作したいところの企業側でさえ長い時間を必要とした。
多くの製品が将来有望なプログラミングを必要としない環境を作ってしてしまったところだが、 結果はいつも不完全であった、複雑過ぎたり、昔からあるコーディングによるものと比較して性能が良くなかったりと。同様に結果として、プログラミングが長い時間使われ続けたのだ。 実際、大抵のゲームエンジンの流れは明確なタスクのために書くたくさんのコードを減らし開発速度を早めようと加えられたツールだったのだ。
あの感覚では、Godotは目標に向かった何か便利な設計の決定を掴んでしまった。最初にもっとも重要なことはシーンのシステムです。 その計画は最初は分かりやすくなかったがしかし、後から私達は働きました。 それらはプログラマーからコード設計の責任から開放させました
シーンの仕組みを使ってゲームを設計するとき、全体のプロジェクトは補足のシーン(一つではない)にばらばらにされます。シーンは切り離す代わりにお互いに補足しあいます。 そこではこの後についての例題がたくさん出てくるでしょうが、それを覚えることがとても大切なんです。
上質でたくさん詰まったプログラミングのノウハウとそのために、これはMVCとは違った設計パターンであることを意味します。補足する方としてのシーンに取って代わられるMVCでの落とす習慣で費やされた労力でGodotは能率性を約束します。
また、Godotはスクリプティングのために引き伸ばした型を使って、利用可能なエンジンクラスからスクリプトが引き伸ばされたことを意味します。
GDScript
GDScript(クリックするとリファレンスに飛びます)はGodotに付属するスクリプト言語と動的に分類されます。 これは以下の目標で設計されております。
プログラマーは大抵それを学ぶのに数日で住むし、2週間以内でこれを快適と感じるでしょう。
ダイナミックに打ち込む言語も同じだけれども、高い生産性(コードを学びやすい、素早くかける、編集がないなど)はパフォーマンス的に不利ですが、殆どの批評するコード既にC++のエンジン(vector ops,物理,数学、インデッキシングなど)で書かれていて、結果として性能がほとんどすべてのゲームに十分以上になった。
いずれにせよ、さらなる性能が必要とされても、批判的な部分はC++で書き直せるしスクリプトに目立たせずに置くことができる。これでGDScriptのクラスとC++のクラスをゲームの続きを変更せずにとって変えることができる。
シーンをスクリプティングする
続ける前に、リファレンスを読んで確かめてください。これえは単純な言語で短いリファレンスで、 一見するのに数分ですむものです。
シーンの準備
このチュートリアルで単純なGUIのシーンのスクリプティングを始めます。ノード追加ダイアログで以下のノードによる階層を作ってください。
これこのシーンの樹形図上に見えるべきだ
そして2Dエディタでこのように見えるように作ろうとしてみて。
最後に、"sayhello.scn"みたいな適当な名前でシーンをセーブして。
スクリプトの追加
Panelノードを選択して、以下の"ADD Script"アイコンを押しください
そのスクリプト作成ダイアログはポップアップするでしょう。このダイアログは言語、クラス名などを指定できます。GDScriptはクラス名をスクリプトファイルでは使いませんから、
あそこは編集不可です。 そのスクリプトは"Panel"(
同時にノードを引き伸すことを意味されますが、パネルのタイプで、とにかくこれは自動的に満たされます。)から受け継ぐべきです。script(もしあなたがシーンを前もって保存しているのでしたら、自動的にsavehello.gdが生成しているでしょう。)のファイル名を打ち込んで"Create"を押してください。
これがなされてから、スクリプトができてノードに加えられます。あなたは両方のノードの余分なアイコンをスクリプトのプロパティと同様に見ることができます。
スクリプトを編集すると、上のアイコンを押すべきです。(しかし、UIは穴とを直感的にスクリプトエディタに導いてくれるでしょう。)。だから、ここにスクリプトのテンプレ糸があるのです。
そこには少ししかありません。"_ready()"関数はノード(とそのすべての子)が活発なシーン(覚えておいて、これはコンストラクタではないことを、コンストラクタは"_init()"です)に入った時に呼ばれます。
スクリプトの役割
スクリプトは基本的にノードの挙動に加えられます。それはよく関数と同じように他のノード(子、親、兄弟など)も操作したものであった。スクリプトのローカルスコープはノード(ちょうど規則正しい遺産に似ている)であり、ノードの仮想的関数はスクリプトに捕らえられます。
シグナルを得る
シグナルはたいていGUIノードに使われます(しかし他のノードもこれらを持つ)。具体的な種類のアクションが起こったり他のスクリプトインスタンスの関数が繋がれるとき、シグナルは"発する"。この項では、ボタンから押されたことのシグナルを他の関数にヲタしてみましょう。
そこにはシグナルをつなぐためのGUIがあり、ちょうどそのノードを選び"Signal"ボタンを押してみましょう
どちらかはボタンが発せられるシグナルを示すでしょう。
しかしこの例ではそれを使うことができません。私達は単純なものも作りたくはないのです。だからあのスクリーンは閉じてください。とにかく、ここでそれは私達が"pressed"シグナルで驚いているものは明白ですから、仮想インターフェイスを使いそれをする代わりとして、接合にはコードを使われるでしょう。
このため、そこにはおそらくGodotプログラマが最も使うであろう関数、get_nodeがあります。この関数は現在の樹形図もしくは他のシーンのものでノードを呼ぶパスを使い、スクリプトを持つノードを相対的にします。
ボタンを取ることでは、以下は使われるはずです。
get_node("Button")
だから、次に、コールバックはボタンが押された時に加えられ、ラベルの文字列を変えるでしょう。
func _on_button_pressed():
get_node("Label").set_text("HELLO!")
最後に、ボタンの"pressed"シグナルは_ready()のコールバックにconnect()を使い繋がれるでしょう。
func _ready():
get_node("Button").connect("pressed",self,"_on_button_pressed")
最後はスクリプトはこのようになります。
extends Panel
# member variables here, example:
# var a=2
# var b="textvar"
func _on_button_pressed():
get_node("Label").set_text("HELLO!")
func _ready():
get_node("Button").connect("pressed",self,"_on_button_pressed")
シーンを実行することはボタンを押された結果を予期しておくべきだ。