Godot4 2Dゲームでランダムに動く敵キャラを作る2/3

2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」でランダムに移動する敵キャラを作成します。

GodotEngine4 Mob ノードを選択した後右上の+ボタンを押してスクリプトを作成して割り当てます2.

パート2では、敵同士は当たり判定をしない設定や、アニメーション表示サイズの変更ランダム移動プログラムを紹介します。
※ Godot Engine のバージョンは 4.1.2 .NET です。
※キャラチップ画像は「キャラメル -CharaMEL-」で作成しました。

前回の記事

前回は、敵キャラ用のシーン mob へのノードの追加、見下ろし型ゲームでは不要な下方向に落下する重力の設定の無効化、敵キャラのアニメーションの設定を行いました。

GodotEngine4 フレームを選択ダイアログで、アニメーションに用いるフレームを選択して追加ボタンを押します.

当たり判定の設定

主人公キャラと敵キャラが接触した際にダメージ処理が行われるように、当たり判定を行う CollisionShape2D クラスを継承した同名のノードを前回作成しました。
しかし、それを作成しただけでは、当たり判定の範囲や形状が決まっていないので、それを設定します。

シーンドックで CollisionShape2D ノードを選択して、インスペクタードックで CollisionShape2D クラスのプロパティを表示します。
Shape プロパティの初期値は「<空>」なので、▽ボタンを押して表示されるリストからカプセル型の「新規 CapsuleShape2D」を選択して、当たり判定の形状のリソースを作成して割り当てます。
※用途に合わせて他の形状のリソースも選択できます。

GodotEngine4 Mob 用の当たり判定の領域を指定するリソースを CollisionShape2D ノードの Shape 項目で形状を選択して割り当てます.

形状のサイズを 2D エディタで直接編集できます。
今回追加したカプセル型の当たり判定の形状では、横と縦の幅を設定できます。

GodotEngine4 Mob 用の当たり判定の領域の幅や位置を調整します.

この当たり判定は主人公キャラと接触したかを判定するためのものなので、同じ Mob シーンの敵キャラ同士は当たり判定をしないように設定を変更します。
インスペクタードックの CollisionObject2D クラスの Mask プロパティ明るく表示されている 1 番のクリックして無効にします。

GodotEngine4 Mob 用の当たり判定の設定で Mask1 をオフにして Mob 同士は衝突しないようにします.

表示サイズの変更

敵キャラのサイズを、作るゲームに合わせて変更します。
今回はスプライト画像の原寸の 3 倍の大きさに拡大しました。

GodotEngine4 Mob のサイズを AnimatedSprite2D ノードの Node2D セクションの Scale を変更して 3 倍に変更します.キャラ画像

敵キャラのサイズを変更するために、シーンドックで AnimatedSprite2D ノードを選択して、インスペクタードックで Node2D クラスScale プロパティx, y の値を 1 から 3 に変更します。

GodotEngine4 Mob のサイズを AnimatedSprite2D ノードの Node2D セクションの Scale を変更して 3 倍に変更します.

拡大表示でぼやけてしまう場合は、以下の記事の「画像をぼやけさせない設定」を参照してください。

ランダム移動プログラムを割り当てて動かす

敵キャラがランダムな方向に進むプログラム(スクリプト)を作成して割り当てて、ランダム移動することをテストします。

シーンドックの mob シーンのルートノード Mob を選択してから、右上の「+のついたファイル」アイコンのボタンをクリックして独自のスクリプトを割り当てます。

GodotEngine4 Mob ノードを選択した後右上の+ボタンを押してスクリプトを作成して割り当てます.

「ノードにスクリプトをアタッチする」ダイアログが表示されるので、スクリプトの言語(今回は C#)、ファイル名(今回は mob.cs)を入力して「作成」ボタンを押します。

GodotEngine4 Mob ノードを選択した後右上の+ボタンを押してスクリプトを作成して割り当てます2.

GodotEngine4 のエディターの上部にある「Script」を選択して、 Script エディタに切り替えます。
mob タブを選択すると、作成された空のスクリプトが表示されるので、以下のランダム移動するプログラム入力して保存します。
プログラムの細かな説明はコメントをお読みください。
※プログラムは自己責任で使用してください。

using Godot;
using System;

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

	public Vector2 ScreenSize; // Size of the game window.

	// 歩行パターンの数(4方向)
	private const int NUMOF_WALK_PATTERNS = 4;
		
	// 歩行パターンに応じた単位ベクトル(移動量)
	private Vector2[] WalkVectors = new Vector2[NUMOF_WALK_PATTERNS]{Vector2.Down, Vector2.Left, Vector2.Right, Vector2.Up};

	// 歩行パターンごとのアニメーション名。 WalkVectors と要素の並びを一致させています。
	private string[] WalkAnimationNames = new String[NUMOF_WALK_PATTERNS]{"walk_down", "walk_left", "walk_right", "walk_up"};
	
	// 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);
	}
	
	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.
		
		uint walk_pattern_idx = GD.Randi() % NUMOF_WALK_PATTERNS;
		velocity = WalkVectors[walk_pattern_idx];
		animatedSprite2D.Animation = WalkAnimationNames[walk_pattern_idx];
		
		// 移動する場合は、移動量を計算して、アニメーションを再生します。移動しない場合はアニメーションを停止します。
		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」を参照してください。

ランダム移動スクリプトのテスト

ランダム移動するスクリプトを mob.cs に保存したら、エディタ右上の「現在のシーンを実行(F6)」ボタンを押して動作を確認します。

敵キャラが移動方向ごとにアニメーションを切り替えて、ランダムに移動するようになりました。

動くようになりましたが、向きがすぐに変わるため、歩行しているようには見えません

今回はここまで

今回は、2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」でランダムに移動する敵キャラのシーンを作成するために、敵同士は当たり判定をしない設定や、アニメーション表示サイズの変更ランダム移動プログラムを紹介しました。

次回は、ある程度同じ方向に進み続けるように改善したプログラムを紹介します。

参照サイト 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をコピーしました