💻

人はIntel(R) Celeron(R) CPU 3865U @ 1.80GHzで3Dゲームを開発できるのか? Part08

に公開

はじめに

この記事は前回の続きです。とはいってもここから読んでも問題ないと思われます。

人はIntel(R) Celeron(R) CPU 3865U @ 1.80GHzで3Dゲームを開発できるのか? -Zenn版-

以下本文

初めましての人は初めまして、普段ゲーム制作やら3D数学の勉強やらやっているえうなひゃともうします。

現在Youtubeの企画で以下のスペックのPCを使ってGodot Engineを使ったゲーム開発を行なっております。

  • CPU:Intel(R) Celeron(R) CPU 3865U @ 1.80GHz
  • MEMORY:4GB
  • GRAPHICS:Intel HD Graphics 610

ちなみにOSはWindowsではなくLinuxのディストリビューションの一つDebianでデスクトップ環境はXfceにしております。

なぜこのようにしたのかの経緯は上記の記事にございます。

私のYoutubeチャンネル

私のX

ここに書くこと

今回はこのアーカイブでやったことを書きます。

人はIntel(R) Celeron(R) CPU 3865U @ 1.80GHzで3Dゲームを開発できるのか? その10

今回実装したのは大岩です。本当はもっとスムーズに進めたかったのですがとあるアクシデントがあり、3時間くらいのアーカイブになってしまいました。

つまづいたところ

とりあえずCharacterBody3Dをベースに(元ネタのゲーム的にも実質敵がこいつだけのパターンがあるため)

  • 普段は宙に浮いている
  • 特定の領域に到達すると落下して追いかけてくる

これらを踏まえて実装していきました。

実際のシーンの図はこちらです。

大岩のシーン

大岩そのもののスクリプトは以下の構成になります。

ohiwa.gd
extends CharacterBody3D

class_name Ohiwa

@export var rakka_flag : bool = false
@export var forward : Vector3 = Vector3.MODEL_FRONT
@export var speed : float = 0
@onready var spiky_ball_2: Node3D = $SpikyBall2


func _ready() -> void:
	rakka_flag = false
	print("Ohiwa is here: ", name)

func _physics_process(delta: float) -> void:
	if rakka_flag:
		if !is_on_floor():
			velocity += get_gravity() * delta
		velocity.z = forward.z
		velocity.x = velocity.x
		if is_on_wall():
			velocity.y = 12.0
		move_and_slide()
		# spiky_ball_2.rotate_x(speed * delta)

その大岩を落とすためのArea3Dのスクリプトは以下の通りです。

ohiwa_rakka_area.gd
extends Area3D

@onready var ohiwa: Ohiwa = $Ohiwa

@export var forward : Vector3 = Vector3.MODEL_FRONT

func _on_body_entered(body: Node3D) -> void:
	if body is Player:
		ohiwa.rakka_flag = true
		ohiwa.forward = forward

これで普通に実装できるはずでした。

何が起きたか

突然大岩が荒ぶりだし、あらぬ方向へ飛んでいくバグに悩まされることに・・・

全く問題ないはずなのですが本当にそうとしか言えない状態が続きました。

ちなみにGodot4.6はゲーム実行中にノード構成からremoteタブをクリックしてそこから該当ノードを探し出して現在のポジション等を確認する機能があります。

そこをみてみたらポジションがあらぬ方向へ飛んでいってしまっていた・・・

あれこれ試してもダメで何がいけないのかがわからなかった矢先、ある仮説が出てきた。

Area3Dを使って試しに実装してみた時、偶然、プレイヤーで触れてみたところ、なぜか物理が作動する。これは・・・

convex_import.gd
@tool
extends EditorScenePostImport


# Called by the editor when a scene has this script set as the import script in the import tab.
func _post_import(scene: Node) -> Object:
	if not scene:
		push_error("not scene.")
	# Modify the contents of the scene upon import.
	var is_mesh = scene.get_child(0)
	if is_mesh is MeshInstance3D:
		is_mesh.create_convex_collision()
	return scene # Return the modified root node when you're done.

実は該当する大岩ノードにimportする際に作動するスクリプトが適用されており、すでにStaticBodyが追加されていた状態だったのだ。

そんなノードにCharacterBody3Dを適用しようものなら当たり判定が荒ぶり出すのも無理ない。 別ゲーで例えるならマリオの中にブロックが入っている状態というわけわからん状態なのでこうなるのは必然だったというわけだ。

となればやることは簡単である、該当スクリプトを解除すればいいのだというわけでimportスクリプトの項目を空にするだけである。

そのあとCharacterBody3Dに型を変更して実行してみる、全く問題なく実行できた。

改良前はこんなふうにポジションが荒ぶっていたのだが
Before

ちなみに異常に気づいた時はこれ、(ルートをArea3Dに変更した)
異変に気付いた瞬間

改良後は普通に落下するようになった
After

最初に楽したいがために後先考えずStaticBody3Dconvexを適用するスクリプトを適当に適用したのが仇になってしまった・・・

次なるTODOは以下の通りです。

  • 穴から飛び上がって邪魔する敵
  • 敵のカラバリを作成 ← 敵のスクリプトや必要なノードをインポートするスクリプトを作成、ここは裏でいいかも
  • ゲームのエクスポート、もちろんCeleron上で

最後に

普段は以下のコンテンツを配信しております。

  • この記事で述べたロースペPCでの開発配信
  • goghを使った視聴者参加型作業配信
  • Godot Engineの使い方をまとめた動画
  • Godot Engineのソースコードを閲覧する配信

よかったらチャンネル登録・高評価等をよろしくおねがいします。

また、今回からGithubでソースコードを公開することにいたしました。

https://github.com/E-unahya/celeron_game_dev

以下は私のチャンネルです。

えうなひゃ

Discussion