ゲーム組み込み向け
独自スクリプト言語の設計で
気を付けている事
2015年12月25日
守屋 俊
自己紹介
 守屋 俊
 コンシューマゲーム機のゲーム開発を主にしてきました
 Twitter: @shun_moriya
ターゲット
 ゲームにかかわる制御をプログラムから切り離したい
 スクリプト記入者がプログラマ以外で、しかも経験が乏しい
 しかも3人以上を相手にする必要がある
なんで独自言語を作るの?
 スクリプト実装者がプログラマなら、LuaやSquirrelなど既存の言語を利用させ
てもらった方が断然に効率が良い
 プログラムに興味を持たない大勢の人達に、スクリプトで制御をしてもらう為
の手段を提供する必要がある
 でも、大抵の作業者はコピペで済ませる傾向・・・
ガチガチに機能を制限した言語が欲しい!
スクリプト設計時に気をつけている事
 コンパクトである
 静的型である
 簡単にリスタートができる
 コンパイル方式である
 文法に強い要望は受けた経験は無い
 メッセージの為の文字列型は必要無い
 デバッカーはあればより良い
 アクター指向
コンパクトである
コンシューマ機は例外なくメモリが十分にある事はなく、
ユーザーの目に触れないスクリプト系の処理は高速かつコンパクトである
ことがいつも求められます。
しかし、効率を求めすぎてシンボルなどの情報を完全に切ってしまうと、
デバックなどの開発効率を落としてしまう事になるため、
絶妙なさじ加減が必要です。
静的型である
特定の状況でのみ使われるスクリプトは良くある話です。
しかし、ゲーム開発において実行されない限り簡単な名称エラーや型違い
エラーを検出できない事は非常に問題があります。
例えば100回に1回実行されるレアな条件があった場合を考えてみましょう。
この場合、変数の型の違いや名前の間違いなど非常に簡単なエラーですら
発見が難しくなります。
そして、修正の変更が入ることで、多くの確認事項のやり直しになってし
まいます。
簡単なリスタートができる
特にコンシューマ機の開発環境のコールドリセットは想像以上に遅いもの
があります。
プログラムのチェックにassertを利用してしまうと、ちょっとしたパラ
メータの間違いでもコールドリセットによる待ち時間が発生してしまいま
す。
メモリ不足など継続が困難な状態にならない限り、
ボタン1つでスクリプトを高速にリスタートできる事がとても重要です。
コンパイル方式である
インタプリタ方式ではなくコンパイル方式である事を推奨します。
理由は二つあります。
実行環境のメモリは十分にある事が少ないので、メモリの消費が多い翻訳
部分があるインタプリタ方式は薦めません。
そして、リスタートが遅い環境が考えられるので、実行前に早く間違いを
検出する事ができる点でコンパイル方式を薦めています。
文法に強い要望は受けた経験は無い
今のところスクリプターからスクリプトの文法に対して強い要望を受けた
事がないので、あなたの好きな文法で開発して問題ないでしょう。
もしも、ゲームアプリケーションの開発がCやC++で行なわれるのならば、
定数や構造体の定義はc言語に合わせておくと同期が便利かもしれません。
メッセージの為の文字列型は必要無い
文字列型を用意するのは問題ないですが、
海外展開する予定のゲームのスクリプトにメッセージを表示する命令を組
み込もうとしているなら、
それは止めておいた方が良いでしょう。
私の笑えない経験で、スクリプトの命令ごと翻訳されてしまった事があり
ました。
メッセージはExcelなど表で管理できるフォーマットにしておくと、
自分が読めない言語でも対応がわかり便利です。
デバッカーはあればより良い
デバッカーを用意できれば最も良いが、
最低限printfさえあればどうにかなります。
それすらも無い場合は問題です。
もしも、あなたが、デバッカーもprintfもない状態でデバックしろと言わ
れたら何と答えるか想像してみましょう。
アクター指向言語
経験した方ならお気づきだと思われますが、
全てのスクリプターが賢明である保障は残念な事にありません。
オブジェクト指向?スレッド?コルーチン?
とにかくイメージしている事が動けばよいのです。
クラスやポインターなど複雑そうな機能を導入する事をやめるかわりに、
私のスクリプトではアクターモデルを導入しています。
アクターは世の中の物事と同じで、常に並行して行われています。
そして、アクターという用語もゲーム内のキャラクターを制御するスクリ
プターに受け入れられやすい事も理由の一つです。
私が実装した言語の紹介
アクター指向言語Mana
Manaは疑似並列処理を行うことを目的にしたスクリプトで、
複数のアクターという単位によって構成されます。
アクターとは日本語で直訳する通りに「役者」の意味であり、そのシーン(シチュ
エーション)に必要なアクターが、そのシーンのソースファイルの中に存在してい
ます。
そして、各アクターがお互いの動きに応じて反応しあい、一つのシーンを作り上
げていきます。
Manaはリクエストと呼ばれる割り込みで動作するシステムです。
複雑な処理はプログラム側に任せて、タイミングや分岐など演出部分だけをスク
リプトに任せることができます。
詳しくはWebで…
https://github.com/shun126/Mana
まとめ
プログラマ以外の方が作るスクリプトは十分な設計を考えられている事は
少ないです。
実行前のコンパイラによるチェックと、実行時のトライアンドエラーの繰
り返しの効率化が最優先になります。
実機での実行回数が、最終的に高品質につながると考えてほぼ間違いない
でしょう。
この文章が今後ゲーム向けスクリプトを作ってみようと考えている方のヒ
ントになればうれしいです。

ゲーム組み込み向け独自スクリプト言語の設計で気を付けている事