「スクリプトでやれば良かった」なんてもう言わせないつもりで独自のスクリプト言語「slag」を作った話

本記事はslagという自作ツールの作成過程を綴ったものです。
slagは https://github.com/NNNIC/slag にて公開中です。

----

# スクリプトでやれば良かった

1年と数ヵ月前、Unity用のあるゲーム開発が佳境になり様々な調整（別名：仕様変更）が始まった頃・・・

調整作業で修羅場の担当プログラマがつぶやいた。

**「やっぱ、スクリプトでやれば良かった。」**

バイナリとは別実行できるスクリプトなら仕様変更も早く済み、イテレーション期間が短い。結果としてゲームの精度も上がっていく。

ゲーム自体がつまらなければ、直前であろうが仕様が変わるのが当たり前の世界では、**スクリプトが強力な武器**となる。

それを知っての発言だ。

だが、この佳境を想像していなかったのか？　

何をいまさら・・・無いものはない！

プログラムの一部を抽象化データで扱う方法もあり、スクリプトがあるかないかは別として設計ミスとうことだ。（期間後半の緊急増員というハンデがあったのも理由だが、ここはあえて言及）

そして当然のごとく、その彼は努力と根性で乗り切り、そのゲームは晴れてリリースされたのだった。

# 転ばぬ先のスクリプト

とはいうものの、Unity上で動くスクリプトがないのも不便である。

今後、同じことがわが身に降りかかってくるかもしれぬ。

起きる前に行動を起こす事にした。

そして、まずはゲーム業界で使われているスクリプトを調査。

## 実績のLUA

ゲーム開発では有名で実績が多いのが **"[LUA](https://www.lua.org/)"**。

多数で紹介され、日本語も充実していいて実績も多い。Git hubを眺めると UnityでLuaを扱うプロジェクトも幾つか。

だがしかし、個人的にはちょっと痛い思い出がある。2007年頃採用しようとしたのだが、当時はまだデバッグ関連が充実しておらず、結果として試作のみの利用に留まった。


## 一度は使ってみたい Angle Script

個人的に興味を持っているのが **"[Angle Script](http://www.angelcode.com/angelscript/)"**。

BMFontという、ゲーム用にTTFフォントをビットマップで加工するツールを出している会社が作っているスクリプトで、2011年頃に知った。

このスクリプトツールのすごい所は、著作権表記がいらないこと。

> 紹介記事
>[「Angel Script をアプリケーションに組み込もう」](http://qiita.com/Ushio/items/cc5f9aa1abeb56f0d6f1)
>[「3D-CoatのAngelScriptで遊ぶ」](http://qiita.com/jene8774/items/bc4388227d32d9476b81)

機会があればぜひ採用したいと思っている。

# 自作に走る

LuaとAngelScript、どちらも素晴らしい。難を言えば、どちらもC/C++でターゲットとしたいUnityでは動かないのが惜しいところ。

>本記事を書きながら調べたところ、実績のありそうなUnity向けLuaがあった。
> 参考記事　
>http://baba-s.hatenablog.com/entry/2016/03/30/180000

だが、今回は自作に走ってしまった。

仕事であれば、要求・時間・品質を確認しながら慎重に検討し、既存のものを使うという判断もあったかもしれない。

ただ、お金をもらうわけでもないので自由にやらせてもらう。

好きなことこそが続けるモチベーションである。

さらに言えば、Unityの採用しているC#は、C++で苦労したこともいとも簡単に実装できる便利な言語である。

**『C++に比べ、スクリプトシステム作成はそれほど難しくないバズ』**と考えた。

また、過去に２度ほどインハウスツールとして簡易スクリプト言語を作った(C++)ことがあったが、その時に実現できなかった機能も多々あった。

その心残りを解消したいと思いも重なり、フルスクラッチで作る事とした。

# 目標

## １．インハウス向け

スクリプトは内部コードと連携して動作する。スクリプトのみでアプリ作成できるようなことはしない。ゆえにパフォーマンスは内部コードに委ね、スクリプトは多少パフォーマンスが落ちてもよい。

## ２．使いやすい言語であること

インハウスで使う際、プランナーやグラフィッカーなどプログム知識をあまり持ち合わせてない方も使う。

なるべく一般に親しみやすい仕様にする

## ３．一般のエディタが使えること

文法チェックとか、面倒なことを肩代わりするエディタは貴重だ。そういうエディタが使えた方がミスが少ない。

## ４．エラー検知、デバッガがあること

エラーの発生場所を分かるようにする。スクリプトシステム作成時に実現を急ぐばかりに忘れやすい機能だ。<br>
そして、簡単なデバッガを提供する。信頼性を増すため大事なことだ。

## ５．ライセンスが緩いこと

ライセンスが厳しいと導入に躊躇する。特に受託プロジェクトの場合には発注先がコピーライトの掲示を断ることもあり、導入の障害になる。

## ６．私用として作成

自己満足の趣味的なところがあるので、実業とは別に作成。
さらに公開することで達成感を満喫する。
<br>

----
# **以上の目標を立て、数ヵ月連日数時間の作業に没頭した。**<br><br>　
<br>
----
----
----
----
----
----
----
----

# 出来たのは **"なんかJavaScritptみたいなもの"**

敷居を低くするため、選んだのは**JavaScript**の仕様。

多くの方に親しみがあり、一般的に簡単なものと認識されている。（現実は違うのだが一般にということで）

実装に面倒な部分(クロージャ等)と分かり辛い仕様(宣言がない変数はグローバル変数扱い等)はバッサリ切って、入門編で触るような仕様とした。

それで、"なんかJavaScritptみたいなもの"・・・　**S**omething **L**ike **A** **G**ei-es[JS]

という意味で　**"slag"**と名付け、githubで公開した。　

公開先はこちら：https://github.com/NNNIC/slag

# slagの特徴

## 1. Unity向け

C#で作成し、依存部分と非依存部分を分け、最初のターゲット環境をUnityとした。

## 2．Javascriptライクな文法。

完全なJavaScriptではなく、サブセット。
JavaScript対応のエディタを使うことで事前の文法ミスを防ぐことが出来る。

## 3. C#のクラスとシームレスにアクセス可能

.NETのリフレクション機能を使い実装してあるので、バインディングの実装なしにスクリプトから簡単呼出しが出来る。
つまりは、**.NETクラス、Unityクラスへアクセスし放題。**

## 4. ビルトイン関数の提供

スクリプト作成環境の向上には欠かせない組込関数を提供。カスタム化も簡単に。

## 5. エラー検知と簡易デバッガー提供

お粗末ながら、エラー場所がわかるようにした。
デバッガも簡易なものを用意した。

## 6. バイナリ時のコピーライト表示義務なし

正直、まったく自由というのもいささかなので、バイナリ時のコピーライト義務がないものとした。（MITライセンス項目に追加として記載）


# 最後に

正直、新味はなく、レガシーと一部つたない技術で作り上げたツールです。
何かしら興味を持って頂ければ幸いです。

slag公開先: https://github.com/NNNIC/slag 

以上


---