Godot Engineで作る ホラーノベルゲーム Part 2


このチュートリアルでは、Godot 4.3を使用して、ホラーノベルゲームの基本的なシステムを構築する方法を解説します。物語が進行する簡単なゲームを作成します。

試しにこちらから遊んでみてください!

プロジェクトをダウンロードはこちらから!


1. シーンの作成

新しいシーンを作成:
  • シーンを作成してstory.tscnで保存します。
シーン構成:

  • Story(CanvasLayer): 画面全体のUIを設定するLayer
  • Background(Sprite2D): 背景の画像(用意した画像を画面全体に表示する)
  • ColorRect(ColorRect): 背景の画面の色、お好みで暗さを設定する
  • TextScenario(Label): シナリオを表示するラベル
  • Next(AnimatedSprite2D): シナリオの表示が終わった時を知らせる矢印アニメーション
  • TextDelay(Timer): シナリオのテキストを一文字ずつ表示していくタイマー
  • EndPanel(Panel): シナリオが終わった時のパネル
  • Label(Label): 終了のテキスト
  • Button(Button): タイトルに戻るボタン
  • BGM(AudioStreamPlayer2D): 怖い雰囲気のBGMを設定する


. スクリプトの作成

スクリプトを作成してstory.gdで保存します。
シナリオのファイルを読み込んで、テキストを一文字ずつ表示していくスクリプトを作成します。
extends CanvasLayer

@export var path = ""

var text_to_display = []
var current_index = 0
var current_text_index = 0

func _ready() -> void:
text_to_display = load_text_file(path)
var filterText = "\\n".join(text_to_display)
filterText = filterText.replace("\\n", "\n")
text_to_display = filterText.split("\n\n")

func _on_text_delay_timeout() -> void:
if current_index < text_to_display.size():
if current_text_index < text_to_display[current_index].length():
%TextScenario.text = text_to_display[current_index].substr(0, current_text_index + 1)
current_text_index += 1
else:
%TextDelay.stop()
%Next.visible = true
else:
%TextDelay.stop()
$EndPanel.show()
# END

func _input(event: InputEvent) -> void:
if event.is_action_pressed("click"):
if current_index < text_to_display.size():
if current_text_index == text_to_display[current_index].length() || current_text_index == 0:
%TextScenario.text = ""
%TextDelay.start()
current_text_index = 0
current_index += 1
%Next.visible = false
else:
%TextScenario.text = text_to_display[current_index]
current_text_index = 0
%TextDelay.stop()
%Next.visible = true

func load_text_file(file_path: String) -> PackedStringArray:
var txt = FileAccess.open(file_path, FileAccess.READ)
var txt_packed = PackedStringArray()
while txt.get_position() < txt.get_length():
txt_packed.append(txt.get_line().replace("\\n", "\n"))
txt.close()
return txt_packed

func _on_color_rect_gui_input(event):
if event is InputEventScreenTouch and event.pressed:
var cancel_event = InputEventAction.new()
cancel_event.action = "talk"
cancel_event.pressed = true
Input.parse_input_event(cancel_event)

func _on_button_pressed():
get_tree().change_scene_to_file("res://scenes/title.tscn")



. シナリオの作成

ホラーのシナリオを作成していきます。
シナリオはTXTファイルで作成します。storyフォルダーの中にstory.txtを作成します。
今回は「怖いチャンネル」から提供していただいたシナリオを使います。
かつて田舎町にある古い中学校には、夜になると怪奇現象が起きるという噂が絶えなかった。
その中心にあったのは音楽室だった。
昼間は普通の教室だが、放課後を過ぎると謎の音や影が現れるという。

主人公の裕也は、その学校の二年生。
裕也は好奇心旺盛で、友人の直樹とともに噂の真相を突き止めようと決意した。
放課後の学校に残り、音楽室を調査することにしたのだ。

午後6時を回り、校舎内の生徒がほとんど帰った後、裕也と直樹は音楽室に忍び込んだ。
部屋は静まり返っており、夕日の薄明かりがカーテンの隙間から差し込んでいた。
「意外と普通だな」と直樹が言ったその時、突然、ピアノの音が静かに鳴り始めた。
二人は顔を見合わせた。「誰かいるのか?」裕也が声をかけるが返事はない。ピアノの鍵盤を確かめても、誰も触っていなかった。
音が止まったと思った瞬間、部屋の隅で黒い影が動いた。直樹が驚いて駆け寄ると、そこには一枚の古びた楽譜が落ちていた。

楽譜には「終わりなき夜の旋律」とだけ書かれていた。直樹が楽譜を拾い上げると、部屋全体が急に冷え込んだように感じた。
「これ、持ち帰るか?」と直樹が提案したが、裕也は首を振った。
「いや、ここに置いておこう。何か良くない気がする」
その瞬間、背後から聞き覚えのない声が囁いた。
「もう遅い……」
二人が振り向くと、音楽室の入り口が閉ざされ、ドアの鍵が勝手に掛かった。

部屋の中央にピアノが不気味に光を放ち始めた。楽譜が宙に浮き、目の前で音符がひとりでに動き出す。
その音符が描き出す旋律に合わせ、部屋の隅から黒い影が形を持ち始めた。
「お前たちはここに何をしに来た?」影が人型を成し、低い声で問いかけた。
裕也は恐怖を感じながらも言葉を振り絞った。
「ただ、噂が本当かどうかを確かめに来ただけだ!」
影は静かに笑った。
「この旋律を奏でた者は、二度と外へ出られない。それがこの部屋の掟だ……」

直樹が必死に窓を叩くが、外は闇に覆われて何も見えない。「どうすれば出られるんだ!?」
影が指をピアノに向けた。
「この楽譜を最後まで弾け。だが、一つだけ忠告しよう。弾き終わるまで、決してミスをするな……」
裕也がピアノの前に座り、震える手で鍵盤を押し始めた。
旋律は美しくも悲しく、部屋全体が不気味な共鳴を始めた。
しかし、途中で音を外した瞬間、影が不気味に笑いながら近づいてきた。
「ミスをしたな……お前はこの部屋の新たな主になる」

翌日、裕也と直樹の姿は学校中を探しても見つからなかった。
ただ、音楽室には誰も見たことのない楽譜と、開いたままのピアノが置かれていたという。
その後、夜になると音楽室から誰かが奏でる旋律が聞こえてくることが多くなった。
しかし、音楽室に近づいた者は誰一人戻ってこなかったという。

シナリオのファイルをスクリプトに設定します。


これでホラーノベルゲームの基本的なシステムができました!
最終更新日: 2024/12/16 06:58

コメント