GodotEngine4 入力に応じてキャラを移動させるC#スクリプト

2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」で、公式チュートリアル「Coding the player — Godot Engine (stable) documentation in English」を参考にして、C# スクリプトを作成して Player ノードに割り当てます。

_Ready, _Process といったイベントで呼び出される関数についても紹介します。

GodotEngine 公式サイトの一部

※ Godot Engine のバージョンは 4.1.2 .NET です。
※キャラチップ画像は「キャラメル -CharaMEL-」で作成しました。

前回の記事

前回は、ノードの拡大率を調整して、CollisionShape2D ノードを Player ノードの下位に作成して、キャラクター画像の形に合わせてカプセル型の当たり判定領域を設定しました。

https://compota-soft.work/wp1/wp-admin/post.php?post=15083&action=edit

GodotEngine4  CollisionShape2D の形状カプセルでは Scene パネルでドラッグすることで縦と横の幅と中心位置を調整できます.

Player ノードに新規スクリプトを割り当てる

Player ノードは player シーンのルートノードとして Area2D を基底のノードとして作成しました。
この Player ノードに新しく C# のスクリプトを割り当てて、イベント処理のオーバーライド、新しい関数の追加を行います。

「シーン」パネルで Player ルートノードを選択して、「インスペクター」パネルの Node セクションの Script 項目の「<空>」となっているフィールドで▽ボタンを押すと表示されるドロップダウンから「新規スクリプト」を選択します。

GodotEngine4  Player ノードを移動させるためのスクリプトを Node の Script フィールドで新規スクリプトを選択して作成します..

「シーン」パネルで、スクリプトを追加したいノードを選択して、+のボタンを押すことでも新規または既存のスクリプトをアタッチできます。
すでにアタッチしている場合は ーのボタンになりデタッチできます。

GodotEngine4 シーンパネルの右上の新規のスクリプトをアタッチするボタンでも割り当てられます.

「ノードにスクリプトをアタッチする」ダイアログで、言語で GD または C# を選び、パスにファイル名を指定して「作成」ボタンを押します。

GodotEngine4  ノードにアタッチするスクリプトを作成します.言語は GD または C# を選択できます..

player.cs が作成されて、シーンを表示していた中央上の画面が 2D から Script に切り替わりました。
指定した継承元クラス Area2D を継承したクラスのスケルトンコードが表示されます。

GodotEngine4  player.cs スクリプトが作成され 2D から Script に切り替わりました.

エディターの右上の Build ボタンを押すと、スクリプトを実行可能な形式に変換します。

GodotEngine4  player.cs スクリプトで移動のコードを書いて、インプットの設定を行ったらビルドボタンを押します.

エラーがある場合は画面中央下の MSBuild タブにエラーメッセージが表示されます。

GodotEngine4 ビルドに失敗すると MSBuild タブにエラーメッセージが表示されます.

キャラを移動させるスクリプト

公式チュートリアル「Coding the player — Godot Engine (stable) documentation in English」で紹介されているスクリプトを参考にしています。

細かな処理についてはコメントを参照してください。

Start 関数については、まだ未実装の Main シーンから呼び出されるので、とりあえず _Ready 関数で呼び出しました。
※以下のスクリプトを使用する際は自己責任でお願いします。

using Godot;
using System;

public partial class player : Area2D
{
	[Export]
	public int Speed { get; set; } = 400; // How fast the player will move (pixels/sec).

	public Vector2 ScreenSize; // Size of the game window.
	
	// Called when the node enters the scene tree for the first time.
	public override void _Ready()
	{
		ScreenSize = GetViewportRect().Size;
		
		// ゲームプレイ前にプレイアブルキャラクターを非表示にしたい場合は Hide() を _Ready イベント関数で呼び出します。
		Hide();
		
		// 後から Main シーンで呼び出す関数を、テストのため、とりあえずここで呼び出します。
		Start(Position);
	}
	
	// Main シーンから呼び出される関数です。(まだ呼び出す設定がありません)
	public void Start(Vector2 position)
	{
		Position = position;
		
		// ゲームプレイ開始時にプレイアブルキャラクターを表示します。
		Show();
		
		// ゲームプレイ時に当たり判定のノードを有効にします。
		GetNode<CollisionShape2D>("CollisionShape2D").Disabled = false;
	}

	// Called every frame. 'delta' is the elapsed time since the previous frame.
	public override void _Process(double delta)
	{
		// 移動方向によりアニメーションを切り替えるために、Player ノード下位の AnimatedSprite2D ノードを取得します。
		var animatedSprite2D = GetNode<AnimatedSprite2D>("AnimatedSprite2D");
		
		// 移動速度の変数を 0 に初期化します。入力に応じて変更され、新しいキャラの位置を割り当てる際に用いられます。
		var velocity = Vector2.Zero; // The player's movement vector.
		
		// アニメーションの名前。空文字列の際はアニメーションを変更しません。
		var animation_name = "";

		// 入力に応じて移動量(移動方向)とアニメーションを設定します。
		if (Input.IsActionPressed("move_right"))
		{
			velocity.X += 1;
			animation_name = "walk_right";
		}

		if (Input.IsActionPressed("move_left"))
		{
			velocity.X -= 1;
			animation_name = "walk_left";
		}

		if (Input.IsActionPressed("move_down"))
		{
			velocity.Y += 1;
			animation_name = "walk_down";
		}

		if (Input.IsActionPressed("move_up"))
		{
			velocity.Y -= 1;
			animation_name = "walk_up";
		}
		
		// 移動方向に応じたアニメーションを設定
		if (animation_name != "")
		{
			animatedSprite2D.Animation = animation_name;
		}

		// 移動する場合は、移動量を計算して、アニメーションを再生します。移動しない場合はアニメーションを停止します。
		if (velocity.Length() > 0)
		{
			velocity = velocity.Normalized() * Speed;
			animatedSprite2D.Play();
		}
		else
		{
			animatedSprite2D.Stop();
		}
		
		// 入力に応じて新しい位置を設定します。
		Position += velocity * (float)delta;
		Position = new Vector2(
			x: Mathf.Clamp(Position.X, 0, ScreenSize.X),
			y: Mathf.Clamp(Position.Y, 0, ScreenSize.Y)
		);
	}
}

GodotEngine 4 の C# (.NET 版) の HTML5 へのエクスポートは未対応

GodotEngine4 の C#(.NET 版) では、 2024 年 1 月 27 日現在、 HTML5 エクスポートは未サポートです。

Projects written in C# using Godot 4 currently cannot be exported to the web. To use C# on web platforms, use Godot 3 instead.

Godot 4 を使用して C# で作成されたプロジェクトは現在、Web にエクスポートできません。 Web プラットフォームで C# を使用するには、代わりに Godot 3 を使用してください。

Webのエクスポート — Godot Engine (4.x)の日本語のドキュメント と Google 翻訳

詳しくは「GodotEngine4 ブラウザゲーム用 HTML5 エクスポートの手順 | Compota-Soft-Press」を参照してください。

C# と GDScript の相互変換については「GodotEngine C# ⇔ GDScript 変換早見表 | Compota-Soft-Press」を参照してください。

_Ready 関数

そのスクリプトをアタッチされているノードが、シーンツリーというメインループに入った直後に呼び出されます。

Called when the node enters the scene tree for the first time.

ノードが初めてシーン ツリーに入るときに呼び出されます。

Coding the player — Godot Engine (stable) documentation in English のスクリプト内のコメントとその Google 翻訳

SceneTree は、シングルトンで管理される、メインループの実装です。

As one of the most important classes, the SceneTree manages the hierarchy of nodes in a scene as well as scenes themselves. Nodes can be added, retrieved and removed. The whole scene tree (and thus the current scene) can be paused. Scenes can be loaded, switched and reloaded.

You can also use the SceneTree to organize your nodes into groups: every node can be assigned as many groups as you want to create, e.g. an “enemy” group. You can then iterate these groups or even call methods and set properties on all the group’s members at once.

SceneTree is the default MainLoop implementation used by scenes, and is thus in charge of the game loop.

(Google 翻訳)

最も重要なクラスの 1 つとして、SceneTree はシーン自体だけでなくシーン内のノードの階層も管理します。ノードは追加、取得、削除できます。シーン ツリー全体 (したがって現在のシーン) を一時停止できます。シーンはロード、切り替え、再ロードできます。

また、SceneTree を使用してノードをグループに編成することもできます。各ノードには、作成したいグループの数だけ割り当てることができます。 「敵」グループ。その後、これらのグループを反復したり、メソッドを呼び出してグループのすべてのメンバーのプロパティを一度に設定したりできます。

SceneTree はシーンで使用されるデフォルトの MainLoop 実装であり、ゲーム ループを担当します。

SceneTree — Godot Engine (4.x)の日本語のドキュメント と Google 翻訳

シーンツリーの使用 — Godot Engine (4.x)の日本語のドキュメント」では公式で日本語に訳されてシーンツリーについて説明されています。

Start 関数

独自に追加した関数です。まだ実装していない Main シーンから呼び出されます。
参照:The main game scene — Godot Engine (stable) documentation in English

現状は暫定的に _Ready 関数の最後に呼び出しています。

_Process 関数

毎フレーム呼び出される関数です。引数は前回の呼び出しからの経過時間です。

入力に応じて、アニメーションを切り替えたり、移動方向(移動量)を設定しています。

Called every frame. ‘delta’ is the elapsed time since the previous frame.

フレームごとに呼び出されます。 「デルタ」は、前のフレームからの経過時間です。

Coding the player — Godot Engine (stable) documentation in English のスクリプト内のコメントとその Google 翻訳

IsActionPressed の引数の文字列はまだ未設定

_Process 関数内の

Input.IsActionPressed("move_right")

の move_right のような文字列は、入力のアクション名として設定されている必要があります。
設定していない場合は入力は検知されません。

そのため、現状ではシーンを実行しても、キー入力に反応しません
入力のアクションの設定については次回の記事を参照してください。

まとめ

今回は、2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」で、公式チュートリアル「Coding the player — Godot Engine (stable) documentation in English」を参考にして、C# スクリプトを作成して Player ノードに割り当てました。

_Ready, _Process といったイベントで呼び出される関数についても紹介しました。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

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