ReDScribe チュートリアル
ReDScribe とは?
ReDScribe は Godot 上で Ruby (mruby) を実行させて DSL (ドメイン固有言語) を書くための GDExtension プラグインです。
基本的な機能としては以下の3つになります。
- 💎 Godot 上で mruby (Ruby) のコードを実行し、mruby からシグナルを発行できます。
- ✏️ Godot エディタ上で Ruby ファイルを編集・保存できます。
- ⬛ REPL でインタラクティブに Ruby コードを試せます。
本チュートリアルでは、ReDScribe の基本的な使い方を丁寧に説明します。
Godot とは?
Godot は、クロスプラットフォームで動作する MIT ライセンスのゲームエンジンです。
2Dゲーム、3Dゲーム、XRアプリ、GUI アプリなどさまざまなものが Godot で作成できます。
GDScript
Godot では、GDScript という独自のスクリプト言語を使います。
extends Node
class_name MyNode
const Foo = 'CONST'
var bar := [1, 2, 3]
func _ready() -> void:
do_something()
func do_something() -> void:
# ...
return true
extends Resource
class_name MyResource
@export var foo : String
var bar : int
func do_something() -> bool:
# ...
return true
シグナル
Godot では大きくノードとリソースと呼ばれる2種類のゲームオブジェクトを組み合わせてシーンを作成していきますが、ボタンが押された、など特定のイベントが起こったことを他のゲームオブジェクトに伝える方法として シグナル というメッセージングの仕組みがあります。
# Button ノードの pressed シグナルが発行された場合
func _on_button_pressed() -> void:
do_something()
# シグナルを自分で定義する場合
signal some_signal(val: String)
func _ready() -> void:
some_signal.connect(_on_some_signal)
func do_something() -> void:
# ...
some_signal.emit('foo')
func _on_some_signal(val: String) -> void:
print_debug(val) # output 'foo'
ReDScribe では、このシグナルの仕組みを使って Ruby (mruby) と Godot の橋渡しをします。
Ruby とは?
Ruby とは、簡潔な文法を持ったオブジェクト指向言語です。 「名前重要」 が座右の銘である Ruby の作者 Matz は、コンピュータの都合を押し付けられた言語仕様を嫌い、自分にとって書きやすい言語を追求した結果、それが多くのプログラマにも愛される言語になっていました。
class Game
attr_accessor :score
def initialize
self.score = 0
end
def roll(pins)
# ...
end
end
game = Game.new
20.times { game.roll(1) }
Ruby はプログラマを束縛するよりも自由を与えます。
- 省略可能な
return
- 省略可能な文末の
;
- 省略可能な
()
- メソッド名の末尾に使える
!
や?
- 数字もブーリアンも文字列も、全てがオブジェクト
- 組み込みクラスであっても再定義可能なメソッド
- メタプログラミング
module IntegerExt
def days_ago
Date.today - self
end
def !
(1..self).reduce(1){|sum, i| sum *= i }
end
def to_kanji
chars = %w(〇 一 二 三 四 五 六 七 八 九)
to_s.split('').map{|i| chars[i.to_i] }.join
end
def method_missing(name, *args)
"#{to_kanji}#{name}#{args.map(&:to_s).join}"
end
end
Integer.prepend IntegerExt
Date.today # => 2025/7/15
4.days_ago # => 2025/7/11
5.! # => 120
2025.年 7.月 # => '二〇二五年七月'
mruby
mruby は、メモリが少ない組み込み機器での利用や、他のアプリケーションに組み込んで使用されることを目的にした軽量な Ruby 処理系です。
ReDScribe では、GDExtension という Godot の機能を使って mruby を Godot 上で実行しています。
DSL とは?
DSL (Domain-Specific Language) とは、ある特定の分野で使われる言葉を意識して作成された、構文ノイズ の少ないプログラミング言語ないしテキストファイルのデータのことです。
Ruby は前述のとおり、return
や ()
といったプログラミング言語特有の構文を書かなくてもいいので、言語内DSL としてよく利用されています。
class Player
def initialize(name)
@name = name
end
def walk
puts "#{@name} walk"
end
def jump
puts "#{@name} jump"
end
end
def player(name, &block)
Player.new(name).instance_exec(&block)
end
require 'player'
player 'Alice' do
3.times { walk }
jump
end
# => Alice walk
# Alice walk
# Alice walk
# Alice jump
本チュートリアルを通して ReDScribe の使い方を学ぶことで、みなさんが自分専用の DSL を Ruby で楽しく作って、今後のゲームプログラミングにご活用いただければ幸いです。