MoonSharp Debug完全に理解した！

# まず結論
- 公式に書いてある説明通りにすれば使えてたよ
- VCIのスクリプトの開始はバーチャルキャスト側からだよ
- 最初の処理は一時停止しないよ。数十フレームしてから止まるよ
:::note warn
この記事にはMoonSharp Debugの使い方は書かれていません。
MoonSharp Debugの使い方については拙著の補足記事
[「VCIデバッグ時の簡単なMoonSharp Debugの使い方」](https://qiita.com/teiron/private/8b901f3cffcaac136a11)
を参考にしてください。
:::

# 導入
みなさんこんにちは！VCIスクリプト書いてますか？
スクリプトを作っているとよくわからないバグが出るときがありますよね？
そんなとき役立つのがデバッガーです。

VSCodeにはVCIスクリプトのデバッガーに使えるMoonSharp Debugという拡張機能があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/54963e2e-a0c1-157c-67e7-e058bfd7ec1f.png)

これを使えばバーチャルキャスト内で動かしているVCIのスクリプトの __一時停止__ や __一時停止中の変数の中身の確認__ などができます。

つまりprint文を書かなくてもスクリプトの動きを確認できるのです！
(※他の人との同期挙動の検証除く）

・・・なのですが私が初めてMoonSharp Debugを導入したときうまく使えず「どこかの設定が間違っていて使えないのかな？」と思って2年くらいずっと放置してました。

__実は使えていたにも関わらず！__

そして最近ようやく使い方を「完全に理解した！」ので
- 何故使い方がわからなかったのか？
- 何に引っかかっていたのか

を書いていきます。
# まずは環境設定
環境設定は公式の説明ページを参照ください。

:::note info
リンク先はこちら
- [VCIスクリプトの開発環境の導入(バーチャルキャスト公式Wiki)](https://wiki.virtualcast.jp/wiki/vscode/tutorial)
- [VSCodeでデバッグをする方法(バーチャルキャスト公式Wiki)](https://wiki.virtualcast.jp/wiki/vscode/debugger)
:::

ここから先は環境設定が完了しているものとして話を進めていきます。
</details>

# 世間一般的(主観)なデバッガーとは？
世間一般で一番使われているであろうデバッガーと言えば？
それはExcelやWordのマクロ作成で使われる __Visual Basic Editor__ ですね！（主観）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/eae26aaf-0360-39ba-dc28-55861f00992b.png)
(特にExcelのマクロはどこにでもいますね)

Visual Basic Editorはスクリプトを書いて再生ボタン![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/3617fab2-bc48-f367-7c36-c39005441ab4.png)を押してあげれば動きます。
止めたいところがあれば行の左側をクリックして![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/ad8b5e75-c820-3eb2-3b69-5146b8cf4c83.png)マークを付けてあげればそこで止まります。

スクリプトの作成は別としてデバッガーであるVisual Basic Editorの使い方自体は簡単です。
有名なIDEのVisual Studioとかも大体同じですね。
# じゃあMoonSharp Debugは？
今度はVSCodeでやっていきましょう。

VSCodeを立ち上げてデバッグしたいスクリプトファイルを選んだら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/c0413cd3-441e-e564-4eec-d7c4ea45fc6f.png)
の赤枠で囲んだ部分にある![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/8369a1d5-2703-b586-a05d-b0c5fff715cb.png)を押すと↓のようにデバッグ用のペインが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/29a35572-29c5-53f1-cbda-e98a3791f01b.png)

デバッグ用ペインの上の方にはVisual Basic Editorと同じように再生ボタン![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/d2f638e8-d569-cb1c-8311-2d9bbecb63f3.png)
がありますね！
### バーチャルキャストを起動してない状態でとりあえず押してみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/5f34be36-7ca7-6c8b-390f-084404a3408d.png)
はいVSCodeさんに怒られました。
どうやら __「127.0.0.1:41921に繋がんねーんだけど？ちゃんと設定してる？」__ と言っているようです。
### バーチャルキャストを起動して再生ボタンを押してみる。
ではバーチャルキャストを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/8dd0c59d-de3d-04af-95d9-15fdd29f3e3d.png)
VCIを出すよりもっと前のスタジオやルームにすら入っていないトップ画面の状態でやってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/e448aa15-7f39-9117-d328-acb16f85baae.png)
何やらツールボタンみたいなもの![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/7ca5a584-2c6a-ec8a-f431-129ac1a7312e.png)が出てきて __「MoonSharpと繋がったよ！」__ と言われました。
## Q:んで再生ボタンを押したけどVCIスクリプトは動かないの？
__A:はい。これだけじゃ動きませんしMoonSharp Debugにスクリプトを動かす機能はありません。__

先ほどの再生ボタン![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/da2bc76a-7350-12eb-151b-6449a1d5c27b.png)をよく見ると __MoonSharp Attach__ と書かれていますね。

つまりこのボタンはスクリプトを動かすボタンではなく、 __バーチャルキャスト(の中のMoonSharp)に接続するためのボタン__ だったというわけです。

__なのでスクリプトを動かしてデバッグするにはバーチャルキャスト内でVCIを取り出してから行わないといけません。__

まぁデバッグはVCIオブジェクト自体の動きも見ながら行いたいので当然と言えば当然ですね。
でもこれVisual Basic Editorみたいなのしか知らない私は最初全然わかりませんでした。

それとMoonSharp Debugにはスクリプトの再実行機能もありません。
再実行したい場合は通常のようにバーチャルキャスト上で再読み込みするか、デバッグ用のスクリプトファイルを上書き保存する方法で行います。
## バーチャルキャストとMoonSharp Debugとのやり取り
大体次みたいな感じです。



- まず接続

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/a1416332-5e26-30f5-8870-89aa2be47936.png)
（接続の際にデバッグしたいVCIを出してなかった場合は、VCIを出した後にツールボタンの![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/1c6d4deb-043f-5838-17c1-cbaa4c98a334.png)を押してください。）

- MoonSharp Debugからバーチャルキャストに対象となるVCIのスクリプトファイルの一時停止位置を指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/374a2707-1b24-5d63-3a5f-a1b907d103de.png)


- 指定箇所に来たらバーチャルキャストからMoonSharp Debugに一時停止したこととその時の変数の中身を教える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/44483068-f28e-06e2-6019-a8c6536b42a8.png)

- 一時停止を解除して次の一時停止箇所まで進むようにMoonSharp Debugからバーチャルキャストに知らせる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/2aabe323-0fc1-c2da-600d-eceb4d409c40.png)

基本的にMoonSharp Debugでやるのは一時停止位置の指定になります。
改めて最初から実行したい場合は先ほど説明したようにバーチャルキャストで操作して行います。

:::note warn
なお、この説明で書かれているバーチャルキャストというのはローカルで動いているアプリケーション側のことです。
MoonSharp Debugがインターネット上のバーチャルキャストのサーバーと直接やり取りをすることはありません。
:::

# 最大の罠 ～始めの方の処理は一時停止しない！～

### それではやってみましょう。
停止箇所を指定したテスト用のコードのスクショです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/d0434e7c-949a-1820-3b61-5116701832af.png)


行の左側に![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/1cc8c73c-5267-a91c-51ba-a971163e7c0d.png)が付いているのが停止箇所となります。

これを動かした場合、３行目の
```lua
local x = "World"
```
で停止するので、最後のprint文の「end」は表示されないはずです。

### 実行結果はこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/408693e4-a916-48e1-f263-e2859a205334.png)

「end」が表示されてしまってます。止まってません。
これ何度やっても結果は変わりません。
２年前の私はここで自分の設定が間違ってると思いMoonSharp Debugを使うのを諦めてしまいました。

__実はこの状態でもちゃんとMoonSharp Debugはちゃんと動いている__ のですがとある仕様？により止まらなかったのです。

### 追試
では今度はこんなコードでやってみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/c96fb38b-388c-48e8-3c14-fda502d0df01.png)

そして結果はこちら

MoonSharp Debugが動くVSCode側では8行目で停止したと表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/0cf46fca-37b4-5b0c-1a5d-de78a490195f.png)

バーチャルキャスト側はというと・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406587/d392d990-8664-7c3b-34e3-efd429ee5afb.png)
62カウントされたところで停止していました。

## つまりどういうことかというと
MoonSharp Debugで一時停止箇所を指定しても最初のある程度の時間は停止をできないようです。

たぶんバーチャルキャストとMoonSharp Debugとの通信でどうしてもラグが発生してしまうためで仕様上のものと思います。

MoonSharp Debugを使うときはこの点に注意が必要です。

# おしまいに

というわけで今回は「私はどうしてMoonSharp Debugを使えなかったのか？」という内容で記事を書いてみました。

デバッグ作業は辛いものですが、この記事が少しでもみなさんの役に立てば幸いです。

それではまたの機会に