人は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にしております。
なぜこのようにしたのかの経緯は上記の記事にございます。
ここに書くこと
今回はこのアーカイブでやったことを書きます。
人はIntel(R) Celeron(R) CPU 3865U @ 1.80GHzで3Dゲームを開発できるのか? その10
今回実装したのは大岩です。本当はもっとスムーズに進めたかったのですがとあるアクシデントがあり、3時間くらいのアーカイブになってしまいました。
つまづいたところ
とりあえずCharacterBody3Dをベースに(元ネタのゲーム的にも実質敵がこいつだけのパターンがあるため)
- 普段は宙に浮いている
- 特定の領域に到達すると落下して追いかけてくる
これらを踏まえて実装していきました。
実際のシーンの図はこちらです。

大岩そのもののスクリプトは以下の構成になります。
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のスクリプトは以下の通りです。
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を使って試しに実装してみた時、偶然、プレイヤーで触れてみたところ、なぜか物理が作動する。これは・・・
@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
最初に楽したいがために後先考えずStaticBody3Dとconvexを適用するスクリプトを適当に適用したのが仇になってしまった・・・
次なるTODOは以下の通りです。
- 穴から飛び上がって邪魔する敵
- 敵のカラバリを作成 ← 敵のスクリプトや必要なノードをインポートするスクリプトを作成、ここは裏でいいかも
- ゲームのエクスポート、もちろんCeleron上で
最後に
普段は以下のコンテンツを配信しております。
- この記事で述べたロースペPCでの開発配信
- goghを使った視聴者参加型作業配信
- Godot Engineの使い方をまとめた動画
- Godot Engineのソースコードを閲覧する配信
よかったらチャンネル登録・高評価等をよろしくおねがいします。
また、今回からGithubでソースコードを公開することにいたしました。
https://github.com/E-unahya/celeron_game_dev
以下は私のチャンネルです。
Discussion