メインコンテンツまでスキップ

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 としてよく利用されています。

player.rb
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 で楽しく作って、今後のゲームプログラミングにご活用いただければ幸いです。