ダウンロード - モノビットエンジン公式サイト

モノビット MO エンジン for Unity
オフィシャルドキュメント
2015 年8月 13 日
株式会社モノビット
更新履歴
版数
日付
改定履歴
0.1
2015 年 5 月 1 日
初版
0.2
2015 年 5 月 7 日
ステージエディタのコリジョン設定の一部記述漏
れを修正・追記。
0.3
2015 年 5 月 11 日
デバッグ機能の説明を追加。
1.0
2015 年 6 月 1 日
エディタ各種機能説明追加。
1.1
2015 年 6 月 10 日
サーバのバトルモード起動の説明を追加。
キャラクタエディタ、AI エディタの追加ノードの
機能説明を追加。
経路探索用コリジョンデータの生成方法の説明を
追加。
1.2
2015 年 7 月 8 日
誤記等の修正。
BattleServer のオプション情報を追加。
1.3
MatchingServer 及び関連サーバの説明を追加。
MatchingServer 及び関連サーバを使用したゲー
ムプレイ方法を追加。
1.4
2015 年8月 13 日
ユーザ入力の拡張パラメータ機能を追加。
マスタデータの拡張機能を追加。
ユニットの当たり判定の機能修正。
勢力概念の追加。
キャラクタ/AI 各エディタのパラメータ定義の追加。
ユニットの AI スクリプト機能修正。
ログインフローの明示化機能追加。
エネミーマスタエディタの機能改修。
ステージエディタの敵ポップ情報機能追加。
視界の概念機能の追加。
2
備考
目次
1.
概要 ............................................................................................................................ 5
1.1.
システム構成 ........................................................................................................... 5
1.2.
MO エンジン機能概要 ................................................................................................ 6
1.3.
ツールについて ........................................................................................................ 7
1.4.
サーバについて ........................................................................................................ 8
2.
MO エンジンの導入 ........................................................................................................ 9
3.
サンプルゲーム.............................................................................................................. 9
3.1.
Scene を開く .......................................................................................................... 9
3.2.
サンプルサーバの起動 ............................................................................................. 10
3.2.1.
MatchingServer 無し ........................................................................................ 10
3.2.2.
MatchingServer 有り ........................................................................................ 10
3.3.
4.
ゲームプレイ ......................................................................................................... 14
仕様説明 .................................................................................................................... 15
4.1.
サーバ機能............................................................................................................ 15
4.1.1.
サーバ種類 ...................................................................................................... 15
4.1.2.
サーバデータ ................................................................................................... 17
4.2.
クライアント機能 ................................................................................................... 22
4.2.1.
MO エンジン本体の機能 ..................................................................................... 22
4.2.2.
Unity の機能 .................................................................................................... 22
4.3.
ゲームの実装 ......................................................................................................... 24
4.3.1.
ログイン処理 ................................................................................................... 24
4.3.2.
モデルの切り替え ............................................................................................. 25
5.
ツール解説 ................................................................................................................. 26
5.1.
ツールの種類 ......................................................................................................... 26
5.1.1.
アニメーションコンバータ .................................................................................. 26
5.1.2.
ユニットマスタエディタ ..................................................................................... 29
5.1.3.
プレイヤーマスタエディタ .................................................................................. 33
5.1.4.
エネミーマスタエディタ ..................................................................................... 35
5.1.5.
バレットマスタエディタ ..................................................................................... 37
5.1.6.
イベントマスタエディタ ..................................................................................... 39
5.1.7.
キャラクタエディタ ........................................................................................... 41
5.1.8.
AI エディタ ..................................................................................................... 57
5.1.9.
ステージエディタ ............................................................................................. 71
5.1.10.
バイナリコンバータ ........................................................................................... 90
6.
MO-Script リファレンス ................................................................................................ 91
6.1.
特徴 .................................................................................................................... 91
3
6.2.
簡単な例 .............................................................................................................. 91
6.3.
スクリプトの基本構造 ............................................................................................. 92
6.3.1.
ヘッダ............................................................................................................ 92
6.3.2.
コマンド ......................................................................................................... 92
6.3.3.
変数 .............................................................................................................. 93
6.3.4.
パラメータ ...................................................................................................... 93
6.3.5.
ラベル............................................................................................................ 94
6.3.6.
計算 .............................................................................................................. 94
6.3.7.
分岐/条件分岐 .................................................................................................. 94
6.3.8.
サブルーチン ................................................................................................... 94
6.4.
6.4.1.
6.5.
wait .................................................................................................................... 95
割り込み ......................................................................................................... 95
基本コマンド表 ...................................................................................................... 96
6.5.1.
パラメータについて ........................................................................................... 96
6.5.2.
戻り値............................................................................................................ 96
6.5.3.
基本制御 ......................................................................................................... 96
6.5.4.
比較 .............................................................................................................. 97
6.5.5.
分岐 .............................................................................................................. 97
6.5.6.
演算 .............................................................................................................. 98
6.5.7.
ベクトル演算 ................................................................................................... 98
6.5.8.
デバッグ用 ...................................................................................................... 99
6.6.
スクリプト起動 ...................................................................................................... 99
6.7.
MO-Script 拡張予定 .............................................................................................. 100
4
1. 概要
MO エンジンは、専用スクリプトで駆動する MO タイプのゲーム制作ツールです。
モノビット独自開発の “MO-Script” を使用して命令やグラフィック、サウンドを組み合わせて MO タイプの
ゲームの制作を可能とします。
MO エンジンサーバでは、MO-Script でプレイヤーや敵のアクション、イベントの設定、ゲームのルールなど
が設定され、ゲームプレイを制御・調停します。
スクリプトは提供される各種 GUI ツールで作成・編集結果として出力されます。
また、プレイヤーキャラクタのレベル、ゲーム進行など動的に変更されるデータは外部のデータベースから
KVS(KeyValueStore)を介してゲームに反映されます。
ツールの出力で実現できない処理は、MO-Script 自体を編集することで実現可能となります。
1.1. システム構成
<全体構成図>
Unity クライアント
バトル以外の画面
MO バトルシーン
リソース
アウトゲーム画面
スクリプトデータ
制御処理
ウンド、エフェクト)
(マイページ、合成、
ショップ、etc…)
マッチング処理
(DLL)
http 通信
Web サーバ
(非同期ゲーム制御)
(モデル、モーション、サ
MO エンジン本体(DLL)
リアルタイム通信エンジン(DLL)
独自プロトコル
独自プロトコル
MatchingServer
バトルサーバ(Windows, Mac, Linux)
(SQLite&C++)
スクリプトデータ
BattleInformation
MO エンジン本体(DLL)
Server
SyncServer
リアルタイム通信エンジン(DLL)
5
1.2. MO エンジン機能概要
MO エンジンサーバは以下のインゲームの状況を処理し、その結果の情報を接続されている各クライアント
に送信します。
クライアントはサーバから送信されたデータを基にビューアとしてゲーム画面を再生します。
(1) ステージの制御

オブジェクトの配置

壊せる壁等のスタティックなオブジェクトの配置

スイッチ等イベントのトリガとなるオブジェクトの配置

ユニットの Spawn 座標の設定
(2) ゲーム進行制御

プレイヤーの Spawn

敵の Spawn

スコアの管理

クリア条件の管理

時間制限の管理

当たり判定
(3) ユニットの管理

NPC の操作(AI)

プレイヤー入力の判定

パラメータの管理
6
1.3. ツールについて
<ツール類>
<スクリプトデータとエンジンの関係>
アニメーションコンバータ
スクリプトデータ
ユニット制御関連
アクション
ステージ制御関連
地形設定
ゲーム制御関連
勝敗判定
モーション
背景モデル
スコア制御
エフェクト
背景アタリ
ゲーム進行制御
モデル
敵配置情報
AI
オブジェ配置情
ステージエディタ
地形配置
キャラクタ エディタ
オブジェ配置
マスタデータエディタ
ユニット配置
AI エディタ
コリジョン設
定
イベント配置
報
サウンド
アタリ判定
(FBX2ANIM)
※ユニット制御はプレイヤー及びエネミーで共通です。
MO エンジン本体
スクリプトエンジン
AI 駆動エンジン
ゲーム進行制御
コリジョン判定ルーチン
地形配置制御
通信処理
イベント制御
キャラクタ制御
静的オブジェクト制
御
【ツールの紹介】
MO エンジンは、ゲームを編集するための GUI ツールを提供しております。
下記、5.1.1~5.1.9 は Unity5 のプラグインとなります。
5.1.1. アニメーションコンバータ ...... FBX データから Anim を作成するツール
5.1.2. ユニットマスタエディタ ......... キャラクタ(動的オブジェクト)の管理情報を作成するツール
5.1.3. プレイヤーマスタエディタ ...... プレイヤーキャラクタの管理情報を作成するツール
5.1.4. エネミーマスタエディタ ......... エネミーキャラクタの管理情報を作成するツール
5.1.5. バレットマスタエディタ ......... バレット(弾)の管理情報を作成するツール
5.1.6. イベントマスタエディタ ......... イベント用オブジェクトの管理情報を作成するツール
5.1.7. キャラクタエディタ .............. MO エンジンで使用するユニットスクリプトを作成するツール
5.1.8. AI エディタ ......................... NPC の行動を制御する思考ルーチンを作成するツール
5.1.9. ステージエディタ ................. ステージの管理情報を作成するツール
5.1.10. バイナリコンバータ ............. MO-Script をバイナリデータに変換するツール
ツールの詳細は、
「5.ツール解説」を参照してください。
7
1.4. サーバについて
以下は、MO エンジン使用するサーバ関連のプログラムです。
(1) サンプルで提供されるサーバプログラム

BattleServer ................... MO エンジン本体

MatchingServer .............. プレイヤーマッチングを管理するサーバ

BattleInformationServer .. BattleServer の空き状況を MatchingServer に通知するサーバ

SyncServer .................... MatchingServer と BattleInformationServer が相互に識別する情報を
管理するサーバ
※ btl_login_init.php
KSV のデータを読み込むプログラム
(2) その他のサーバプログラム等

Web サーバ..................... Redis の KVS に読み書きするために使用するサーバ

Redis ............................ MO エンジンで使用する動的データを格納する KVS を構築するサーバ
サーバの詳細は、
「4.1.1. サーバ解説」を参照してください。
8
2. MO エンジンの導入
開発環境のセットアップ、及び MO エンジンの導入については
『モノビット MO エンジン for Unity セットアップガイド』
を参照してください。
3. サンプルゲーム
MOengine クライアント用パッケージにサンプルのマルチ対戦アクションゲームが含まれています。
ゲーム内のすべてのオブジェクト制御、ルール設定、ゲーム進行の調停、すべて MO-Script 及びマスタデータ
で処理されています。
3.1. Scene を開く
メニューの [File] → [Open Scene]
パス:
C:\Unity\MOengine\Assets\MOengine\Sample\Scenes
※ フォルダ構成はプロジェクトをインストールしたフォルダ、プロジェクト名により変わります。
ファイル:
Title.unity
[Title.unity]を開くとタイトル画面が表示されます。
9
3.2. サンプルサーバの起動
サーバの起動方法は MatchingServer を経由して BattleServer にログインする方法と経由しない簡易な方
法があります。
なお、MatchingServer を使用する場合は Linux 環境が必須となるので注意しましょう。
サーバの詳細については、
[4.1.1. サーバ解説]をご覧ください。
3.2.1. MatchingServer 無し
クライアントから MatchingServer を経由せず直接 BattleServer にログインする方法を説明します。
MO エンジンの動作を確認する場合は、MatchingServer 無しでサーバを起動してください。
MatchingServer を使用してプレイする場合は、本項をスキップして次項[MatchingServer 有り]をご
覧ください。
以下のバッチファイルを実行して BattleServer を起動ます。
フォルダ:
moe_for_unity\server\BattleServer\bin
ファイル:
boot_nomatching.bat (Windows)
MoSample.exe -d ./Data --log -p 62000 -udp 62001 --nomatching
boot_nomatching.sh
(Mac, Linux)
mono MoSample.exe -d ./Data --log -p 62000 -udp 62001 --nomatching
サーバ起動画面
BattleServer が起動してプレイヤーのログインを待ちます。
3.2.2. MatchingServer 有り
※マッチングサーバ関連に一部不具合があり調整中のため、本バージョンではアーカイブから省いております。
MatchingServer を経由して BattleServer にログインする方法を説明します。
複数の BattleServer を起動して、複数のプレイヤーをマッチングする場合は MatchingServer を経由す
る必要があります。
また、MatchingServer を使用する場合は、関連するサーバもあわせて起動する必要があります。
10
※ サンプルに含まれている各サーバを起動するバッチファイルはプレイヤーマッチングに制限をかけ
ていません。MatchingServer 無しの設定と挙動は変わりません。
※ 各サーバの起動は管理者権限で実行します。
【サーバ起動の手順】
① SyncServer の起動
② BattleServer,MatchingServer,BattleInformationServer の起動
【サーバ起動手順の詳細】
(1) SyncServer の起動
SyncServer は、MatchingServer と BattleInformationServer が通信するために必要な情報を管理す
るサーバであるため、MatchingServer、BattleInformationServer よりも先に起動します。
フォルダ:
moe_for_unity\server\sync
ファイル:
sync
(Linux のみ)
サーバ起動時には、以下のバッチファイルを実行します。
ファイル:
sync.sh
起動オプション
./sync -l 7000 -L 127.0.0.1 -n 0x1000000 -N 0x1ffffff
※ サーバの IP アドレスに合せてバッチファイル内の IP アドレスの記述を変更します。
(2) BattleServer の起動
フォルダ: moe_for_unity\server\BattleServer\bin
ファイル: MoSample.exe
(Windows, Mac, Linux 共通)
サーバ起動時には、以下のバッチファイルを実行します。
ファイル:
boot.bat
(Windows)
boot.sh
(Mac, Linux)
バッチファイルで設定されているオプションは以下の通りです。

Windows 版の起動オプション
MoSample.exe -d ./Data --log -p 62000 -udp 62001 -bp 62001 -bi 192.168.0.0 -hb 60000

Mac 版、Linux 版の起動オプション
mono MoSample.exe -d ./Data --log -p 62000 -udp 62001 -bp 62001 -bi 192.168.0.0 -hb
60000
※ サーバの IP アドレスに合せてバッチファイル内の IP アドレスの記述を変更します。
11
※ 上記オプション中の “-d ./Data” は、バイナリデータに変換した MO-Script を格納するフォル
ダです。ご利用の環境に応じて適宜変更してください。
サーバ起動画面(MatchingServer 有り)
BattleServer が起動してプレイヤーのログインを待ちます。
(3) MatchingServer の起動
フォルダ: moe_for_unity\server\MatchingServer\deploy\bin
ファイル: matching
(Linux 専用)
サーバ起動時には、以下のバッチファイルを実行します。
ファイル:
boot.sh
起動オプション
./matching -f 7000 -F 127.0.0.1 -c 8501 -C 0.0.0.0 -n 0x24000000 -N 0x24000000 -b
0x1400000000001 -l 9101 -L 127.0.0.1
※ サーバの IP アドレスに合せてバッチファイル内の IP アドレスの記述を変更します。
(4) BattleInformationServer の起動
フォルダ: moe_for_unity\server\BattleInformationServer\bin
ファイル: battleinformationserver
(Linux 専用)
サーバ起動時には、以下のバッチファイルを実行します。
ファイル:
boot.sh
起動オプション
./battleinformationserver -f 7000 -F 127.0.0.1 -c 7601 -C 0.0.0.0 -n 0x4000000 -N
0x4ffffff
※ サーバの IP アドレスに合せてバッチファイル内の IP アドレスの記述を変更します。
(5) Web サーバの起動
12
管理者権限で Web サーバを起動します。
$ service httpd start
(6) Redis の起動
管理者権限で Redis を起動します。
$ service redis start
(7) クライアントの設定
MatchingServer を使用する場合、クライアント(Unity)で[SystemNodeManager]の設定の変更
が必要になります。
Assets/MOengine/sample/resorces/system/SystemNodeManager
1
2
3
4
[SystemNodeManager]の以下の項目をサーバの設定に合わせて変更します。
① [Use Matching Server]
チェックボックスにチェックを入れます。
② [Battle Svr IP]
BattleServer の IP アドレスを入力します。
③ [Battle Svr Port TCP]
BattleServer と通信する TPC のポート番号に変更します。
④ [Battle Svr Port IDP]
BattleServer と通信する UDP のポート番号に変更します。
13
3.3. ゲームプレイ
Unity エディタ上で、
[▶]ボタンをクリックすると、ゲームスタート画面が表示されます。
表示された[スタート]ボタンをクリックします。
移動:
マウス左ボタンを押したままドラッグして移動方向にマウスをドラッグします。
攻撃:
左ボタンクリックで攻撃、連打でコンボが発生します。
チャージ: 左ボタンをクリックしたままでスキルパワーがチャージされます。
スキル発動:左ボタン押しっぱなしでチャージ、スキルアイコン表示、触れると発動します。
➀[バトル開始]をクリックします
②チームを選択します
③ステージスタート
④ステージ終了
クリア条件となるポイントを獲得
するか、制限時間終了時にポイン
トが 高いチー ムが勝利とな りま
す。
14
4. 仕様説明
MO エンジンの仕様を説明します。
4.1. サーバ機能
4.1.1. サーバ種類
(1) サンプルで提供されるサーバプログラム
MO エンジンのサンプルパッケージに含まれるサーバプログラムです。
① BattleServer
MO エンジンサーバ本体です。
インゲームのすべてのデータ管理を行い、ゲームの進行を処理しクライアントに処理したデータを送
信します。
なお、BattleServer 自体にログインするプレイヤー人数制限やチーム構成を管理するマッチング機
能はありません。
MatchingServer がプレイヤーを管理します。
フォルダ: moe_for_unity\server\BattleServer\bin
ファイル: MoSample.exe
※ 実行ファイルは Windows, Mac, Linux 共用
以下は、BattleServer の起動オプションです。
オプション
省略形
パラメータ
説明
--port
-p
[port]
--udp
-u
[port]
--btlinfoport
-bp
[port]
バトルインフォサーバポート番号を指定します。
--battleinfo
-bi
[host]
バトルインフォサーバ名を指定します。
--heartbeat
-hb
[port]
ハートビート用ポート番号を指定します。
--nomatching
TCP ポート番号を指定します。
UDP ポート番号を指定します。
マッチングサーバを使用しません。
--clhost
-C
--help
-h
--data
-d
[host]
自身の IP アドレスを指定します。
ヘルプを表示します。
[folder]
データフォルダを指定指定します。
--debug
デバッグモードを実行し、デバッグログを出力します。
--log
その他ログを出力します。
② MatchingServer
プレイヤーのマッチングを管理するサーバです。
BattleServer の空きに応じたチームの人数の管理、プレイヤー人数制限などを行います。
15
※ Linux で動作します。Windows, Mac では動作しないので注意しましょう。
フォルダ: moe_for_unity\server\MatchingServer\deploy\bin
ファイル: matching
以下は、MatchingServer の起動オプションです。
オプション
省略形
パラメータ
説明
--fport
-f
[port]
初期接続先ノードのポート。
--fhost
-F
[host]
初期接続先ノードの IP アドレス。 (default=0.0.0.0)
--lport
-l
[port]
リスニングソケットのポート。(default=自動選択)
--lhost
-L
[host]
リスニングソケットの IP アドレス。 (default=0.0.0.0)
--nstart
-n
[start]
ノード ID の開始値。 nend より小さくなくてはならない。
--nend
-N
[end]
ノード ID の終了値。 nstart より大きくなくてはならない。
--clport
-c
[port]
--clhost
-C
[host]
クライアントリスニングソケットのポート。
クライアントリスニングソケットの IP アドレス。
(default=0.0.0.0)
--cl-id-start
-x
[start]
クライアント ID の開始値。(default=" <<
DEFAULT_CLIENT_ID_START << ")
--cl-id-end
-X
[end]
クライアント ID の終了値。(default=" <<
DEFAULT_CLIENT_ID_END << ")
--bpl-puuid
-b
[puuid]
接続先 BattlePUList の PUUID
③ BattleInformationServer
BattleServer の空き状況を管理し、MatchingServer に空き情報を通知します。
※ Linux で動作します。Windows,Mac では動作しないので注意しましょう。
フォルダ: moe_for_unity\server\BattleInformationServer\bin
ファイル: battleinformationserver
以下は、BattleInformationServer の起動オプションです。
オプション
省略形
パラメータ
説明
--fport
-f
[port]
初期接続先ノードのポート。
--fhost
-F
[host]
初期接続先ノードの IP アドレス。(default=0.0.0.0)
--lport
-l
[port]
リスニングソケットのポート。(default=自動選択)
--lhost
-L
[host]
リスニングソケットの IP アドレス。(default=0.0.0.0)
--nstart
-n
[start]
ノード ID の開始値。 nend より小さくなくてはならな
い。
16
--nend
-N
[end]
ノード ID の終了値。 nstart より大きくなくてはなら
ない。
--clport
-c
[port]
クライアントリスニングソケットのポート。
--clhost
-C
[host]
クライアントリスニングソケットの IP アドレス。
(default=0.0.0.0)
--cl-id-start
-x
[start]
クライアント ID の開始値。
(default=" << DEFAULT_CLIENT_ID_START << ")
--cl-id-end
-X
[end]
クライアント ID の終了値。(default=" <<
DEFAULT_CLIENT_ID_END << ")
--bpl-puuid
-b
[puuid]
接続先 BattlePUList の PUUID
--redishost
-R
[host]
RedisServer の接続先
--redisport
-r
[port]
RedisServer の接続ポート(default=6379)
--lbattle
-i
[port]
接続先 BattleServer からのリスニングポート
(default=60000)
④ SyncServer
クライアントや BattleServer の IP アドレスの管理を行うサーバです。
※ Linux で動作します。Windows, Mac では動作しないので注意しましょう。
フォルダ: moe_for_unity\server\sync
ファイル: sync
(2) その他のサーバプログラム
BattleServer と外部のデータベースとの間で、動的なデータ(プレイヤーのレベルテーブル、バフ/デ
バフなどのパラメータ変更)等を、KVS を介してやり取りします。
① Redis
動的なデータを BattleServer に反映させるために KVS を構築します。
② Web サーバ
Redis へのデータ読み取り・書き込みを行うために使用します。
データ処理用にサンプル PHP ファイルが提供されています。
フォルダ: moe_for_unity\server\moweb
ファイル: btl_login_init.php
4.1.2. サーバデータ
4.1.2.1. 設定ファイル
BattleServer には、実装するゲームに合わせた設定を行う設定ファイルがあります。
17
フォルダ: moe_for_unity\server\battleserver\MoSample
ファイル: app.config
ユニットあたり判定
・ユニットから特定距離に居るユニットを対象として判定
<!-- 通知範囲 -->
<add key="NotificationRange" value="10.0" />
Value の値を変更することで、範囲が変更できます。
※MoSample フォルダ以下は当パッケージが提供するサンプルソースとなります。
4.1.2.2. MO-Script
サーバ上の MO エンジンは MO-Script 解釈し、ステージやユニットの制御を行います。
【スクリプトの種類】
MO-Script は、処理する機能により以下の 3 種類に分類されます。
なお、添付されているサンプルスクリプトも併せて紹介します。
スクリプト中に詳細なコメントを付記していますので、ゲームの処理がどのように行われているかご
参照ください。
A) レベルスクリプト
ゲームの進行管理を行うスクリプトです。
【サンプル】
パス:
moe_for_unity\tool\MoScripts\level\
ファイル:
levelscript.mos
stage_init.inc
battle_proc_team.inc
B) AI スクリプト
ユニットのゲーム内の挙動の制御を行うスクリプトです。
【サンプル】
パス:
moe_for_unity\tool\MoScripts\enemy
ファイル:
spider_ai.mos
spider_ai_param.h
C) ユニットスクリプト
モデルのモーションの振る舞いを管理するスクリプトです。
【サンプル】
18
パス:
moe_for_unity\tool\MoScripts\player
ファイル:
player_root.mos
player_root_param.h
19
4.1.2.3. マスタデータ
スクリプト以外で、サーバが利用するマスタデータという定義データがあります。
以下は、サーバが利用するマスタデータです。
A) ステージマスタ (StageMaster.json)
No.
項目名
内容
1
stage_id
ステージ ID
2
prefab_path
読み込むステージマップのプレハブパス
3
script_path
このステージで使用するスクリプトパス
4
collision_path
コリジョン判定に使用するバイナリファイルのパス
B) ユニットマスタ (UnitMaster.json)
No.
項目名
内容
1
unit_id
ユニット ID
2
prefab_path
モデルのプレハブ
3
animeter
Unity の AnimatorController のファイル名(*.controller)
4
start_animation
開始アニメーション名
5
script_path
スクリプトファイルが配置してあるパス
6
size
アタリ判定に使用するサイズ
C) プレイヤーマスタ (PlayerMaster.json)
No.
項目名
内容
1
player_id
プレイヤーID。ログイン時に指定される ID 兼用
2
unit_id
ユニットマスタ ID
3
name
キャラクタ名称
D) エネミーマスタ (EnemyMaster.json)
No.
項目名
内容
1
enemy_id
エネミーマスタ ID
2
unit_id
エネミーマスタ ID に関連付けるユニットマスタ ID
3
name
敵の名称
4
ai_script_path
AI スクリプトファイルが配置してあるパス
E) バレットマスタ(BulletMaster.json)
No.
項目名
内容
1
bullet_id
バレットマスタ ID
2
unit_id
バレットマスタ ID に関連付けるユニットマスタ ID
3
life_time
バレット(弾)の存続時間
4
speed
バレットの移動速度
F) イベントマスタ(EventMaster.json)
No.
項目名
内容
1
event_id
イベント ID
2
script_path
イベント用スクリプトファイル(*.bin)パス込み
20
また、自由にマスタデータを拡張使用する事が可能となります。
フォルダ: moe_for_unity\server\server\battleserver\MoSample
ファイル: EntryPoint.cs
// --- マスタデータを追加
// MoEngine 必須マスタ -ココカラMasterManager.Instance.AddMaster( MasterName.STAGE_MASTER, ResourceManager.ResourcePath + "/master/StageMaster.json" );
MasterManager.Instance.AddMaster( MasterName.UNIT_MASTER, ResourceManager.ResourcePath + "/master/UnitMaster.json" );
MasterManager.Instance.AddMaster( MasterName.PLAYER_MASTER, ResourceManager.ResourcePath + "/master/PlayerMaster.json" );
MasterManager.Instance.AddMaster( MasterName.ENEMY_MASTER, ResourceManager.ResourcePath + "/master/EnemyMaster.json" );
MasterManager.Instance.AddMaster( MasterName.BULLET_MASTER, ResourceManager.ResourcePath + "/master/BulletMaster.json" );
MasterManager.Instance.AddMaster( MasterName.EVENT_MASTER, ResourceManager.ResourcePath + "/master/EventMaster.json" );
MasterManager.Instance.AddMaster( MasterName.BUFFSTATUS_MASTER, ResourceManager.ResourcePath + "/master/BuffStatusMaster.json" );
// MoEngine 必須マスタ -ココマデ// ToDo: 追加でマスタデータが必要な場合はここに追記してください
// --- マスタデータを追加
ToDo の位置に、既存のコードをコピー&ペーストして利用します。
※MoSample フォルダ以下は当パッケージが提供するサンプルソースとなります。
4.1.2.4. KVS データ
MO エンジンと DB との間で KVS を介してデータの受け渡しを行います。
レベルテーブル、バフによるパラメータ変動等、ダイナミックに変更されるデータの受け渡しに使用しま
す。
MO エンジンでは Redis 1.0 以上で KVS データを扱います。
21
4.2. クライアント機能
4.2.1. MO エンジン本体の機能
MO エンジンは、Unity クライアント上で以下の機能を提供します。
(1) サーバとの通信制御
(2) ゲーム再生制御
(3) 操作入力情報送信
4.2.2. Unity の機能
4.2.2.1. ゲームの再生
ステージ描画、ユニットの描画・アニメーション等は Unity の機能で動作します。
MO エンジンから受信したデータを基にゲーム描画機能でゲームの再生を行います。
4.2.2.2. サウンド
キャラクタに付随するサウンドは、Unity でオブジェクトにアタッチしてください。
MO エンジンから受信したデータを基にアニメーションの再生を行い、それに伴って Unity でサウンド
が再生されます。
【参考サイト】
[Unity - マニュアル: オーディオ]
http://docs.unity3d.com/ja/current/Manual/Audio.html
4.2.2.3. 操作入力の取得
プレイヤーの操作入力情報を取得して、MO エンジンに渡します。
操作キャラの入力情報以外に、自由なパラメータをサーバに送信することが出来ます。
これにより、スキルボタンなど独自の UI の操作情報や、Unity 上でユニットを選択した時などの情報
をサーバに送信する事が出来ます。
・クライアントサイド
MoEngineFramework クラスの以下をコールすると、サーバへ情報が送信されます。
/// <summary>
/// カスタム入力送信
/// </summary>
public void SendCustomInput( int[] int_param, float[] float_param )
・サーバサイド
フォルダ: moe_for_unity\server\server\battleserver\MoSample
ファイル: EntryPoint.cs
22
// カスタム入力コールバック設定
framework.CallbackPlayerInputCustom = EntryPoint.OnPlayerInputCustom;
とすることで、入力を受信すると設定した関数にコールバックとして返ります。
※MoSample フォルダ以下は当パッケージが提供するサンプルソースとなります。
23
4.3. ゲームの実装
4.3.1. ログイン処理
ログイン処理の明記化
ログイン処理は《SendStartGame》を明示的に呼び出すことにより実現します。
・クライアントサイド
フォルダ: Assets\moenginesample\Scripts\Scene
ファイル: GameMainManager.cs
// ゲーム開始
SystemNodeManager.Instance.moeFrame.SendStartGame();
this.Phase = PHASE.GAME_START_WAIT;
ログイン処理フロー
チーム選択画面(クライアント)
↓
ログイン (クライアント -> サーバ)
↓
ユーザ情報保存(サーバ)
↓
ログイン結果 (サーバ -> クライアント)
↓
ステージセレクト (クライアント -> サーバ)
↓
ステージロード(サーバ)
↓
ステージ情報通知 (サーバ -> クライアント)
↓
ゲーム画面(クライアント)
↓
ゲーム開始 (クライアント -> サーバ)
↓
ユニット生成(サーバ)
↓
同期開始
24
4.3.2. モデルの切り替え
キャラクターの衣装と武器などの見た目が装備によって切り替える方法について解説します。
生成するキャラクターの prefab に、スクリプトを AddComponent し、ゲーム固有の処理を定義す
ることで対応が可能です。
ユニットが生成されると、インタフェースオブジェクトに対し「OnUnitCreate」というメッセージ
が送信されます。
ここで、キャラクターモデルに必要な設定を行います。
※サンプルでは moenginesample/Scripts/System/MoEngineInterface.cs 内で設定します。
/// <summary>
/// ユニット生成
/// </summary>
/// <param name="param"></param>
public void OnUnitCreate( string[] param, int a )
{
for( int i = 0; i < param.Length; i++ )
{
if( param[i] == null )
continue;
int unitId = int.Parse( param[i] );
UnitBase unit = UnitManager.Instance.FindUnit( unitId );
if( unit == null )
continue;
// 自分のユニット ID の場合
if( unitId == MyUnitId )
{
// キャラクターモデルに設定します
var model = unit.GameObject.GetComponentInChildren<PlayerCharacterModel>();
model.type = user.type;
// 性別
model.head = user.head;
// 頭
model.body = user.body;
// 衣装
model.weapon = user.weapon; // 武器
model.UpdateModel(); //モデル更新
}
}
}
25
5. ツール解説
5.1. ツールの種類
Ver.1.0 で提供されるツールは以下の通りです。
5.1.1. アニメーションコンバータ
5.1.2. ユニットマスタエディタ
5.1.3. プレイヤーマスタエディタ
5.1.4. エネミーマスタエディタ
5.1.5. バレットマスタエディタ
5.1.6. イベントマスタエディタ
5.1.8. AI エディタ
5.1.9. ステージエディタ
5.1.10. バイナリコンバータ
5.1.1. アニメーションコンバータ
アニメーションデータを一括で登録することが可能なツールです。
Unity 上で FBX ファイルからアニメーション用のオブジェクトファイル (Anim、Controller ファイル)を
生成します。
複数の FBX ファイルを Mecanim で扱えるデータに一括でコンバートします。
操作方法
(1) アニメーションコンバータの起動
メニューからアニメーションコンバータを開きます。
[MoEngine] → [AnimationConverter]
26
(2) 編集ファイル保存先の指定
[新規作成] / [編集]
アニメーションコンバータは、編集操作の保存用ファイルとしてプレハブファイルを使用します。
[新規作成]/[編集]ボタンをクリックすると、保存先となるプレハブファイル(*.prefab)を指定
します。
例)
フォルダ:
C:\Unity\MOengine\Assets\MOengine\Sample\Resources\Unit\Player
ファイル名:
player_eomotion.prefab
※ ファイルを保存する際は任意のフォルダに保存できますが、必ず [Assets] の配下、かつ
[Resources]以下のフォルダを指定してください。
例)
○:保存可能,×:保存不可
MOengine ....................................... ×
├─Assets ..................................... ×
│ ├─MOengine ............................ ×
│ │
├─Sample ......................... ×
│ │
│
└─Resources .............. ○
│ │
│
└─Unit................... ○
│ │
│
├─Player .......... ○
│ │
│
└─Enemy ......... ○
│ │
└─Resources .................... ○
│ │
└─Unit ........................ ○
│ │
├─Player ................ ○
│ │
└─Enemy ............... ○
│ ├─Resources .......................... ○
│ │
└─Unit .............................. ○
│ │
├─Player ..................... ○
│ │
└─Enemy .................... ○
[Assets]の配下にある[Resources]以
下のフォルダには保存可能。
[Resources]は[Assets]の直下でなく
ても可。
│ └─Unit .................................... ×
[Resources]以下にないフォルダには保
│
├─Player ........................... ×
│
└─Enemy .......................... ×
存不可。
└─Resources ................................ ×
└─Unit .................................... ×
├─Player ........................... ×
[Assets]の配下にないので[Resources]
以下のフォルダでも保存不可。
└─Enemy .......................... ×
(3) 参照アセットフォルダの指定
[開く]
変換するアニメーションの基データ (*.fbx) が保存されているフォルダを選択します。
例)
フォルダ名:
C:\Unity\MOengine\Assets\Design\Unit\Animation
※ 前操作で [新規作成] を選択していた場合、prefab ファイルを登録すると自動で本項の[ア
セットフォルダの指定]の操作に遷移します。
27
(4) アニメーションデータの選択
[データを追加]
変換する一連のアニメーションデータをリストとして追加します。
追加する fbx ファイルを指定します。
(5) 作成データを保存
[データを保存]
上記で設定した編集内容をプレハブファイルに保存します。
(6) データの変換
[データを作成]
登録したアニメーションデータを anim ファイルと controller ファイルとして出力するためのフォル
ダを指定します。
例)
フォルダ名:
C:\Unity\MOengine\Assets\MOengine\Sample\Resources\Unit\SimplePlayer\Ani
mator
C:\Unity\MOengine\Assets\MOengine\Sample\Resources\Unit\SimplePlayer\Clip
※ ファイルを保存する際は任意のフォルダに保存できますが、必ず [Assets] の配下、かつ
[Resources]以下のフォルダを指定してください。
指定されたフォルダ内に以下のフォルダを作成し、*.anim ファイルと *.controller ファイルを作成
します。

Animator
controller ファイルを保存します。

Clip
anim ファイルを保存します。
作成されたデータを基に Mecanim でアニメーションの作成を行うことができます。
作成された anim ファイルは Unity エディタ上で確認することができます。
28
5.1.2. ユニットマスタエディタ
ゲーム内で使用するユニット(プレイヤー/エネミーキャラクタ、バレット等)のモデル情報をユニットマ
スタ(UnitMaster.json)に登録します。
ユニットマスタに登録することで、プレイヤーキャラクタ、敵キャラクタ、弾として設定が可能となりま
す。
※ ユニットマスタの内容は、
「4.1.2.2. マスタデータ」を参照してください。
操作方法
(1) ユニットマスタエディタの起動
[MoEngine]メニューからユニットマスタエディタを開きます。
[MoEngine]→[MasterEditor]→[Unit]
(2) ユニットデータの追加
[ユニットデータ追加]ボタンをクリックすると、ウィンドウにユニットデータ入力用の欄が追加され
ます。
ユニット ID は最後の番号に+1 した整数が自動入力されますが、編集ウィンドウ内で番号変更を行う
こともできます。
29
(3) ユニットデータの編集
登録・編集を行うユニットの[編集]ボタンをクリックすると、
[UnitData]ウィンドウが開き、ユニ
ットデータの登録・編集を行うことができます。
ユニットマスタとして登録されるデータは以下の通りです。
[UnitID] ............... ユニット(ゲームで使用する動的オブジェクト)を管理するための ID です。
自動採番されます。編集して別の ID を割り振ることも可能です。
編集する際は、ユニット ID が重複しないよう注意してください。
[Prefab] ............... ゲーム内でユニットとして使用するプレハブデータ(*.prefab)を指定しま
す。
[Animator] ........... ゲーム内で使用する AnimatorController(*.controller)ファイルを指定し
ます。
[StartAnimation] ... 使用するアニメーションデータ内のアニメーション名(Animator の State
Machine で表示されるアクションの名称)を指定します。
[Script] ................ ユニットを制御するバイナリ変換されたスクリプトファイル(*.bin)を指定
します。
新規登録時はバイナリ変換されたスクリプトファイルは存在しないため、保
存予定のファイル名を仮で入力します。
30
[AIScript] ............. ユニットを制御する AI のバイナリ変換されたスクリプトファイル(*.bin)
を指定します。
[Size]................... アタリ判定のサイズです。ユニットのサイズに応じてサイズを設定します。
サンプルではどのユニットも 1 になっています。
左図の青線(プレイヤー)
、赤線(エ
ネミー)がコリジョンを視覚化した
ものです。
ユニットを中心としたスフィアとし
て設定されます。
[SightSize] ........... 視界のサイズです。ユニットのサイズに応じてサイズを設定します。
サンプルではどのユニットも 1 になっています。
(4) パラメータの追加
マスタデータに基本値を定義し、その値をパラメータへ設定することが可能です。
ゲームの仕様に合わせて項目の追加が可能です。
「カラム追加」ボタンを押下し、カスタムカラムを追加します。
対象となるスクリプトエディタを開きます。
「ローカルメモリ」ボタンを押下し、ローカルメモリ設定ウィンドウを開きます。
「データ追加」を押下し、必要となるパラメータを追加します。
31
スクリプトエディタに戻り、マスタからデータを取得し、ローカルメモリに値を設定します。
(5) 編集データの保存
項番(3)の操作で入力が終了した後、[編集データを保存する]をクリックしてウィンドウを閉じます。
※ [編集データを保存する]ボタンをクリックしても、編集した内容をオンメモリで保持しているだ
けなので、ファイルとして保存されていません。
UnitMasterEditor のウィンドウから[UnitMaster を保存]をクリックして登録・編集したユニットデ
ータを保存します。
データは以下の通り保存されます。
保存先フォルダ
保存ファイル名
C:\Unity\MOengine\Master
UnitMaster.json
32
5.1.3. プレイヤーマスタエディタ
ユニットをプレイヤーキャラクタとして使用できるようにプレイヤーマスタへ登録します。
※ プレイヤーマスタに登録するには、事前にユニットデータをユニットマスタに登録する必要がありま
す。
※ プレイヤーマスタデータの内容は、
「4.1.2 マスタデータ」を参照してください。
操作方法
(1) プレイヤーマスタエディタの起動
[MoEngine]メニューからプレイヤーマスタエディタを開きます。
[MoEngine]→[MasterEditor]→[Player]
(2) プレイヤーデータの追加
[プレイヤーデータ追加]ボタンをクリックすると、ウィンドウにプレイヤーデータ入力用の欄が追加
されます。
プレイヤーID は最後の番号に+1 した整数が自動入力されますが、番号変更を行うこともできます。
33
(3) プレイヤーデータの編集
登録を行うプレイヤーの欄を指定し、プレイヤーデータの登録・編集を行うことができます。
[プレイヤーID] ....... プレイヤーキャラクタを管理する ID です。
自動採番されます。編集して別の ID を割り振ることも可能です。
編集する際は、プレイヤーID が重複しないよう注意してください。
[ユニット ID] ......... ユニットマスタに登録したユニットの ID を選択します。
[名前] .................. プレイヤーユニットの[名前]入力します。
ここで入力された[名前]がゲーム内に反映されます。
(4) 編集データの保存
項番(3)の操作で力が終了した後、
[PlayerMaster を保存]をクリックして登録・編集したプレイヤ
ーデータを保存します。
データは以下の通り保存されます。
保存先フォルダ:
C:\Unity\MOengine\Master
保存ファイル名:
PlayerMaster.json
34
5.1.4. エネミーマスタエディタ
ゲーム内で使用するユニットをエネミーキャラクタとして使用できるようにエネミーマスタへ登録/編集
/削除します。
※ エネミーマスタに登録するには、事前にユニットをユニットマスタに登録する必要があります。
※ エネミーマスタデータの内容は、
「4.1.2 マスタデータ」を参照してください。
操作方法
(1) エネミーマスタエディタの起動
[MoEngine] メニューからエネミーマスタエディタを開きます。
[MoEngine]→[MasterEditor]→[Enemy]
(2) エネミーデータの追加
[エネミーデータ追加]ボタンをクリックすると、ウィンドウに敵データ入力用の欄が追加されます。
エネミーID は最後の番号に+1 した整数が自動入力されますが、番号変更を行うこともできます。
35
(3) エネミーデータの編集
追加・編集するエネミーの欄を指定し、エネミーデータの登録・編集を行うことができます。
[エネミーID].......... エネミーキャラクタを管理する ID です。
自動採番されます。編集して別の ID を割り振ることも可能です。
編集する際は、エネミーID が重複しないよう注意してください。
[ユニット ID] ......... ユニットマスタに登録したユニットの ID を選択してください。
[名前] .................. エネミーユニットの[名前]入力してください。ここで入力された[名前]
がゲーム内に反映されます。
(4) 編集データの保存
項番(3)の操作で力が終了した後、
[EnemyMaster を保存]をクリックして登録・編集したエネミー
データを保存します。
データは以下の通り保存されます。
保存先フォルダ:C:\Unity\MOengine\Master
保存ファイル名:EnemyMaster.json
36
5.1.5. バレットマスタエディタ
ゲーム内で使用するユニットをバレット(弾)として使用できるようにバレットマスタへ登録します。
※ バレットマスタに登録するには、事前にユニットをユニットマスタに登録する必要があります。
※ バレットマスタデータの内容は、「4.1.2.2. マスタデータ」を参照してください。
操作方法
(1) バレットマスタエディタの起動
[MoEngine] メニューからバレットマスタエディタを開きます。
[MoEngine]→[MasterEditor]→[Bullet]
(2) バレットデータの追加
[バレットデータ追加]ボタンをクリックすると、ウィンドウにバレットデータ入力用の欄が追加され
ます。
バレット ID は最後の番号に+1 した整数が自動入力されますが、番号変更を行うこともできます。
(3) バレットデータの編集
登録・編集を行うバレットの欄を指定し、バレットデータの登録・編集を行うことができます。
[バレット ID] ......... バレットを管理する ID です。
自動採番されます。編集して別の ID を割り振ることも可能です。
編集する際は、バレット ID が重複しないよう注意してください。
[ユニット ID] ......... ユニットマスタに登録したユニットの ID を選択してください。
[寿命] .................. バレットの効果時間を入力します。単位はミリ秒です。
[スピード] ............. バレットの移動速度です。
37
(4) 編集データの保存
項番(3)の操作で力が終了した後、
[BulletMaster を保存]をクリックして編集したバレットデータ
を保存します。
データは以下の通り保存されます。
保存先フォルダ
保存ファイル名
C:\Unity\MOengine\Master
BulletMaster.json
38
5.1.6. イベントマスタエディタ
ステージ内で扉を開ける、触れると敵が出現するといったイベントのトリガとなるオブジェクト、及びイ
ベント内容をイベントマスタ(EventMaster.json)に登録します。
※ イベントマスタの内容は、
「4.1.2 マスタデータ」を参照してください。
操作方法
(1) イベントマスタエディタの起動
[MoEngine]メニューからユニットマスタエディタを開きます。
[MoEngine]→[MasterEditor]→[Event]
(2) イベントデータの追加
[イベントデータ追加]ボタンをクリックすると、ウィンドウにユニットデータ入力用の欄が追加され
ます。
イベント ID は最後の番号に+1 した整数が自動入力されますが、編集ウィンドウ内で番号変更を行う
こともできます。
(3) イベントデータの編集
イベントマスタとして登録されるデータは以下の通りです。
[イベント ID]
イベントを管理するための ID です。
自動採番されます。編集して別の ID を割り振ることも可能です。
編集する際は、イベント ID が重複しないよう注意してください。
[スクリプト]
イベントを制御するバイナリ変換されたスクリプトファイル(*.bin)を指定
します。
新規登録時はバイナリ変換されたスクリプトファイルは存在しないため、保存
予定のファイル名を仮で入力します。
(4) 編集データの保存
項番(3)の操作で力が終了した後、
[BulletMaster を保存]をクリックして編集したイベントデータ
39
を保存します。
データは以下の通り保存されます。
保存先フォルダ
保存ファイル名
C:\Unity\MOengine\Master
EventMaster.json
40
5.1.7. キャラクタエディタ
ゲーム内で使用するユニットや発生する特定のゲーム条件(攻撃、スキル発動、被ダメージ)によるアニ
メーションの制御情報を作成します。
設定したキャラクタ制御する情報を MO-Script に出力します。
キャラクタエディタで使用するアニメーション名は、Unity の Animator で設定された情報を基にステー
トとパラメータを指定します。
Unity の Animator
アニメーションの処理は、以下のように機能ノードを配置し、遷移するアニメーションを指定します。
また、条件による切り替え先のアニメーションの分岐の制御も行えます。
41
5.1.7.1. キャラクタ制御機能
ノードの機能と入出力データの一覧を以下に列記します。
システム処理
ノード名
ノード画像
説明
開始
処理の開始ノードです。
必ずこのノードから開始されます。
割り込み終了
処理中に発生したの割り込みの終了処理です。
通常割り込み終了した際には、割り込みが発生した処理に戻
りますが、ノード内のテキストボックスにラベルを入力する
ことで該当するステートラベルの処理に飛びます。
ステートラベル
ネスト(入れ子)で処理を行うノードです。
テキストボックスにはラベルとなる処理名を入力します。
[エディタを開く]ボタンで別ウィンドウが開き、その中に
ネストで処理を入力することができます。
ブランチ実行
テキストボックスに入力されたラベルのノードに飛びます。
goto 文のような処理を行います。
待機
テキストボックス内入力された数値(単位はミリ秒)分、処
理を待ち、次のノードに処理を移します。
割り込み処理
割り込み処理が発生した際の処理を開始するノードです。
プルダウンリストは、発生した割り込みの種類です。
※ Ver.1.0 では[Message]のみ利用できます。
Run
毎フレームごとに実行される割り込みです。
Message
システムからのメッセージを受信して発生す
る割り込みです。
End
スクリプトの終了時に発生する割り込みで
す。
42
変数・定数
ノード名
ノード画像
説明
比較分岐
変数を比較(OR、AND 等の論理演算も含む)結果に基づき
処理を分岐させます。
プルダウンリストで以下の分岐条件を選択します。
算術演算

Arg1 == Arg2 .... 引数 1 と 2 が等しい

Arg1 != Arg2 ...... 引数 1 と 2 が等しくない

Arg1 > Arg2 ....... 引数 1 が 2 より大きい

Arg1 >= Arg2 .... 引数 1 が 2 以上

Arg1 < Arg2 ....... 引数 1 が 2 より小さい

Arg1 <= Arg2 .... 引数 1 が 2 以下

Arg1 and Arg2 .... 引数 1 と 2 の論理積

Arg1 or Arg2 ...... 引数 1 と 2 の論理和

Arg1 xor Arg2 .... 引数 1 と 2 の排他的論理和
算術計算をさせます。
プルダウンリストで以下の計算を選択します。
ベクトル演算

Value += Arg1 ... 引数 1 加算してを Value に入力

Value -= Arg1 ...... 引数 1 減算してを Value に入力

Value ×= Arg1 ..... 引数 1 乗算してを Value に入力

Value ÷= Arg1 ..... 引数 1 除算してを Value に入力
ベクトル演算をさせます。
プルダウンリストで以下の計算を選択します。

Scale

Length

LengthSqr

Distance

DistanceSqr

Normalize

Dot

Cross

Lerp

Unit

Zero

One
変数の設定
変数に値を入力させます。
定数
処理内だけ有効な定数を設定させます。
テキストボックスに任意の数値を入力します。
プルダウンリストで定数の以下の型を宣言します。
43

Byte

Short

Int

Float

Vector 3
ノード名
ノード画像
説明
変数
レジスタに変数名を付けます。
テキストボックスに任意の変数名を入力します。
プルダウンリストで以下の変数の型を宣言します。
ローカルメモリ

Byte

Short

Int

Float

Vector 3
ローカルメモリに変数名を付けます。
テキストボックスに任意の変数名を入力します。
プルダウンリストで以下の変数の型を宣言します。
戻り値

Byte

Short

Int

Float

Vector 3
演算処理などが行われて結果が出た際に、一時的に結果の値
が格納されます。
システム変数
システムで定義されている変数を呼び出します。
プルダウンリストで以下の変数を選択します。
システム定数

Interrupt Type

Unit Id

Input X

Input Y

Input Flag

My Unit Id

Fact Unit Id
システムで定義されているリードオンリーの定数を宣言し
ます。
プルダウンリストで以下の定数を選択します。
44

INPUT

MOVE

DAMAGE

TAP

HOLD

SKILL1

SKILL2
マスタ
ノード名
ノード画像
説明
ステージマスタ取得
ステージマスタから指定の値を取得します。
ステージ ID
カラム名
ユニットマスタ取得
ユニットマスタから指定の値を取得します。
ユニット ID
カラム名
プレイヤーマスタ取得
プレイヤーマスタから指定の値を取得します。
プレイヤーID
カラム名
エネミーマスタ取得
エネミーマスタから指定の値を取得します。
エネミーID
カラム名
バレットマスタ取得
バレットマスタから指定の値を取得します。
バレット ID
カラム名
イベントマスタ取得
イベントマスタから指定の値を取得します。
イベント ID
カラム名
45
共通処理
ノード名
ノード画像
説明
ユニット座標取得
UnitID で指定したユニットの座標を取得します。
ユニットパラメータ取得
指定したユニットのローカルメモリの値を取得します。
[パラメータ名]は事前に[ローカルメモリ]で宣言された
変数名です。
取得する値の型宣言も行います。
イベントメッセージ送信

Int

Float
全ユニットに対してイベントメッセージを送信します。
メッセージは割り込み処理ノードの Message 処理で処理で
きます。
こ の と き 、 シ ス テ ム 変 数 :InterruptType が シ ス テ ム 定
数:EVENT_MESSAGE になっています。
ノードで指定したイベントタイプ、Param1、Param2 はそ
れぞれ、システム変 数:Event Type/Event Param1/Event
Param2 で受け取れます。
乱数取得
最小・最大の間で Int 型の乱数を発生させます。
ユニット削除
ステージからユニットを削除します。
勢力設定

UnitId
止めを刺したユニットの ID

TargetId
ステージから削除するユニットの ID
ユニットに勢力を割り当てる。
勢力 ID
ユニットスクリプトの Initialize などで設定します。
※敵はデフォルトで -1 が割り当てられます。
46
ユニット制御
ノード名
ノード画像
説明
アニメーションパラメー
Mecanim で指定されたのパラメータ名(アニメーション名)
タ
を開始させます。
プルダウンリストはアニメーションの以下のパラメータの
型を宣言します。
サブコリジョン

Trigger

Bool

Int

Float
攻撃のアタリ判定を設定します。

オフセット X, Y, Z
アタリ判定が出現する相対
座標
弾生成

効果範囲
アタリ判定の効果範囲

効果時間
アタリ判定の効果時間
遠距離攻撃用の弾(バレット ID)を生成します。

オフセット X, Y, Z
バレットが生成される相対
座標

前方へ移動
弾 ID
生成するバレット ID
ユニットを前に動かします。
バレットユニットで使用します。
47
5.1.7.2. キャラクタエディタ操作方法
(1) キャラクタエディタの起動
[MoEngine] メニューからキャラクタエディタを開きます。
[MoEngine] → [CharacterEditor]
キャラクタエディタを起動すると新規作成の画面が表示されます。
ウィンドウ上部に操作ボタンが表示されます。
① 新規作成
ユニットのアニメーション制御情報を新規に作成する際に使用します。
[起動]ノードのみが配置されたブランクのウィンドウが開きます。
② 開く
既存のユニット編集ファイルを開きます。
ノードの配置などの CharacterEditor の編集情報は、XML ファイルで保存されています。
③ 上書き保存
開いている CharacterEditor のデータを既存の XML ファイルに上書き保存します。
48
④ 保存
開いている CharacterEditor のデータを、ファイル名を指定して保存します。
⑤ ローカルメモリ
ローカルメモリとは、アニメーション制御情報を制作するに際にユーザが任意に定義できる変数で
す。
このローカルメモリは、ユニットごとに共通する変数を扱うことが多いため、この[ローカルメモ
リ]機能を使って共通定義を行います。
⑥ スクリプトを出力
編集したアニメーション制御情報を MO-Script に出力します。
⑦ DebugMode
チェックが入った状態でスクリプトの出力を行った際に[デバッグ出力]ノードが有効になります。
BattleServer のコンソールに指定したメッセージが表示されます。
(2) アニメーション制御情報の追加
新規作成の状態でマウスの右ボタンをクリックし、コンテキスメニューから制御項目を選択します。
マウスの右ボタンをクリックしてコンテキストメニューを表示します。
ノードを配置し、各ノードの[Out]と[In]をつなぐことで処理の流れを作成します。
49
ノードの接続
ノードの接続解除
50
以下はプレイヤーのアニメーション制御情報です。
1
6
4
2
7
5
3
8
9
この管理情報を基にプレイヤーアクションの処理を説明します。
① 開始
処理を開始します。
51
② ステートラベル「player_idle」
[開始]直後に「player_idle」と入力された[ステートラベル]に遷移します。
[ステートラベル]には、他のノードから呼び出される際のラベルとなる任意の文字列を入力します。
[エディタを開く]ボタンをクリックするとウィンドウが開き[ステートラベル]の処理内容が記述
されています。
「player_idle」内部の処理
「player_idle」内では、100 ミリ秒待機状態としてあります。
「player_idle」で 100 ミリ秒待機後、また「player_idle」に戻り、割り込みが発生するまでループ
状態になります。
③ 割り込み処理
[Run]
[Message]
[End]の割り込み処理が配置されています。
[Run][End]は何の処理も行わず、割り込み終了します。
[Message]の割り込み処理が発生した場合のみ、次の[比較分岐]に遷移します。
52
④ 比較分岐
[比較分岐]は、
[システム定数]
「INPUT」を引数 1(Arg1)
、
[システム変数]
「InterrutType」
(割り込みを
発生させたメッセージの値)を引数 2(Arg2)として二つの値を比較し、割り込みメッセージがユーザの入力な
のか識別します。
引数 1、2 を比較した結果[False]
(入力ではなかった)場合は[割り込み終了]に遷移し、中断し
ていた「player_idle」の処理に戻ります。
[True]
(入力であった)場合は、
[ステートラベル]「input_select」に遷移します。
53
⑤ [ステートラベル]
「input_select」
「input_select」の処理は以下の通りとなります。
操作入力の種類を示す[システム変数]
「InputFlag」と以下の[システム定数]と比較し、結果に基
づいて遷移します。

SKILL1
スキル発動のアニメーションを再生します。

HOLD
割り込みを終了し、
[ステートラベル]「player_charge」に遷移します。

MOVE
割り込みを終了して[ステートラベル]
「player_run」に遷移します。

TAP
攻撃のアニメーションを再生します。さらに内部[ステートラベル]
「Attack」で連打
操作された際のコンボ攻撃の分岐処理が行われます。
連 打 操 作 の 際 は 、 1 回 の 攻 撃 ご と に [ ス テ ー ト ラ ベ ル ]「 player_wait_short 」 ま た は
「player_wait_long」で待機します。
⑥ [ステートラベル]
「player_run」
100 ミリ秒走るアニメーションを再生し、
[ステートラベル]
「player_idle」に遷移します。
⑦ [ステートラベル]
「player_charge」
スキルパワーチャージのアクションを再生し、
300 ミリ秒待機した後、
[ステートラベル]
「player_idle」
に遷移します。
54
⑧ [ステートラベル]
「player_wait_short」
プレイヤーキャラクタの攻撃パターン再生中の待機処理です。
コンボの 1~2 回目の攻撃は攻撃アクションの再生時間が短いため、こちらの[ステートラベル]を
使用します。
⑨ [ステートラベル]
「player_wait_long」
プレイヤーキャラクタの攻撃パターン再生中の待機処理です。
コンボの 3~4 回目の攻撃は攻撃アクションの再生時間が長いため、この[ステートラベル]を使用
します
(3) 編集データの保存
項番(2)の操作で力が終了した後、
[上書き保存]もしくは[保存]をクリックして配置したノードの配
置情報を保存します。
データは以下の通り保存されます。
保存先フォルダ
C:\Unity\MOengine\Master
保存ファイル名
player_root.xml
※ ファイル名は任意です。
※ 配置情報を保存した XML ファイルはノード配置のデータを保存するだけです。
ゲームプレイ関しては使用しません。
55
(4) スクリプトファイルの出力
項番(2)の操作で力が終了した後、
[スクリプト出力]をクリックしてユニットスクリプト(アニメーシ
ョンを制御するスクリプト)を出力します。
スクリプトを以下の通り出力します。
出力先フォルダ
C:\Unity\MOengine\Master
出力ファイル名
player_root.mso
Prayer_root_param.h
※ スクリプトのファイル名は任意につけることができます。
※ [player_root_param.h]はスクリプトファイル(player_root.mos)
を出力する際に自動で出力くされます。
56
5.1.8. AI エディタ
エネミーユニット、バレット(弾)ユニットの行動を制御します。
設定したキャラクタの行動を制御する情報を MO-Script に出力します。
行動の制御は、以下のように機能ノードを配置し、行動遷移の各種条件や割り込みを指定します。
57
5.1.8.1. AI 制御機能一覧
ノードの機能と入出力データの一覧を以下に列記します。
システム処理
ノード名
ノード画像
説明
開始
キャラクタの処理開始
必ずこのノードから開始されます。
割り込み終了
処理中に発生したの割り込みの終了処理です。
通常割り込み終了した際には、割り込みが発生した処
理に戻りますが、ノード内のテキストボックスにラベ
ルを入力することで該当するステートラベルの処理
に飛びます。
ステートラベル
ネスト(入れ子)で処理を行うノードです。
テキストボックスにはラベルとなる処理名を入力し
ます。
[エディタを開く]ボタンで別ウィンドウが開き、そ
の中にネストで処理を入力することができます。
ブランチ実行
テキストボックスに入力されたラベルのノードに飛
びます。
goto 文のような処理を行います。
待機
テキストボックス内入力された数値(単位はミリ秒)
分、処理を待ち、次のノードに処理を移します。
割り込み処理
割り込み処理を発生させます。
プルダウンリストは、割り込みを発生させる処理の種
類です。
※
Run
Ver.1.0 では[Message]のみ利用できます。
毎フレームごとに実行される割り込み
Message システムからのメッセージを受信して発生
する割り込み
End
58
スクリプトの終了時に発生する割り込み
変数・定数
ノード名
ノード画像
説明
比較分岐
変数を比較(OR、AND 等の論理演算も含む)結果に
基づき処理を分岐させます。
プルダウンリストで以下の分岐条件を選択します。
算術演算

Arg1 == Arg2 .......引数 1 と 2 が等しい

Arg1 != Arg2 ........引数 1 と 2 が等しくない

Arg1 > Arg2 .........引数 1 が 2 より大きい

Arg1 >= Arg2 .......引数 1 が 2 以上

Arg1 < Arg2 .........引数 1 が 2 より小さい

Arg1 <= Arg2 .......引数 1 が 2 以下

Arg1 and Arg2 .......引数 1 と 2 の論理積

Arg1 or Arg2 .........引数 1 と 2 の論理和

Arg1 xor Arg2 .......引数 1 と 2 の排他的論理和
算術計算をさせます。
プルダウンリストで以下の計算を選択します。

Value += Arg1 ......引数 1 加算してを Value に
入力

Value -= Arg1 .........引数 1 減算してを Value に
入力

Value ×= Arg1 ........引数 1 乗算してを Value に
入力

Value ÷= Arg1 ........引数 1 除算してを Value に
入力
ベクトル演算
ベクトル演算をさせます。
プルダウンリストで以下の計算を選択します。

Scale

Length

LengthSqr

Distance

DistanceSqr

Normalize

Dot

Cross

Lerp

Unit

Zero

One
プレイヤーとエネミーの座標の計算(Distance)
二つの座標を比較するため、arg1 と 2 を使っていま
す。
変数の設定
変数に値を入力させます。
59
ノード名
ノード画像
説明
定数
処理内だけ有効な定数を設定させます。
テキストボックスに任意の数値を入力します。
プルダウンリストで定数の以下の型を宣言します。

Byte

Short

Int

Float
Vector 3
変数
レジスタに変数名を付けます。
テキストボックスに任意の変数名を入力します。
プルダウンリストで以下の変数の型を宣言します。

Byte

Short

Int

Float
Vector 3
ローカルメモリ
ローカルメモリに変数名を付けます。
テキストボックスに任意の変数名を入力します。
プルダウンリストで以下の変数の型を宣言します。
戻り値

Byte

Short

Int

Float

Vector 3
演算処理などが行われて結果が出た際に、一時的に結
果の値が格納されます。
システム変数
システムで定義されている変数を呼び出します。
プルダウンリストで以下の変数を選択します。
システム定数

Interrupt Type

Unit Id

Target Unit Id
システムで定義されているリードオンリーの定数を
宣言します。
プルダウンリストで以下の定数を選択します。

60
AI_SEARCH_HIT
マスタ
ノード名
ノード画像
説明
ステージマスタ取得
ステージマスタから指定の値を取得します。
ステージ ID
カラム名
ユニットマスタ取得
ユニットマスタから指定の値を取得します。
ユニット ID
カラム名
プレイヤーマスタ取得
プレイヤーマスタから指定の値を取得します。
プレイヤーID
カラム名
エネミーマスタ取得
エネミーマスタから指定の値を取得します。
エネミーID
カラム名
バレットマスタ取得
バレットマスタから指定の値を取得します。
バレット ID
カラム名
イベントマスタ取得
イベントマスタから指定の値を取得します。
イベント ID
カラム名
61
共通処理
ノード名
ノード画像
説明
ユニット座標取得
UnitID で指定したユニットの座標を取得します。
ユニットパラメータ取得
指定したユニットのローカルメモリの値を取得しま
す。
[パラメータ名]は事前にノード[ローカルメモリ]
で宣言された変数名です。
取得する値の型宣言も行います。
イベントメッセージ送信

Int

Float
全ユニットに対してイベントメッセージを送信しま
す。
メッセージは割り込み処理ノードの Message 処理で
処理できます。
このとき、システム変数:InterruptType がシステム定
数:EVENT_MESSAGE になっています。
ノードで指定したイベントタイプ、Param1、Param2
は そ れ ぞ れ 、 シ ス テ ム 変 数 :Event Type/Event
Param1/Event Param2 で受け取れます。
乱数取得
最小・最大の間で Int 型の乱数を発生させます。
ユニット削除
ステージからユニットを削除します。

UnitId
止めを刺したユニットの ID

TargetId
ステージから削除するユニット
の ID
勢力設定
ユニットに勢力を割り当てる。
勢力 ID
ユニットスクリプトの Initialize などで設定します。
※敵はデフォルトで -1 が割り当てられます。
62
AI
ノード名
ノード画像
説明
プレイヤー探知
自ユニットの座標から[範囲]で指定した半径内に敵
となるユニットが存在しないか索敵します。
接近移動
敵となるユニットを検知した後、敵ユニットを追尾す
る速度と 1 回の[接近移動]で移動する距離を[範囲]
として指定します。
[範囲]の距離を移動した後に、再度[プレイヤー探知]
を行わせます。
ユニット割り込み発生
ユニットに割り込み処理を発生させます。
発生した割り込みは割り込み処理ノードの Message
処理で処理できます。
このとき、システム変数:InterruptType がシステム定
数:INTERRUPT AI になって います。
ノードで指定した Param1、Param2 をそれぞれシス
テム変数:Interurupt Param 1/Interrupt Param2 で
受け取れます。
63
5.1.8.2. AI エディタ操作方法
(1) AI エディタの起動
[MoEngine] メニューからキャラクタエディタを開きます。
[MoEngine] → [AIEditor]
AI エディタを起動すると新規作成の画面が表示されます。
ウィンドウ上部に操作ボタンが表示されます。
① 新規作成
ユニットの AI 情報を新規に作成する際に使用します。
[起動]ノードのみが配置されたブランクのウィンドウが開きます。
② 開く
既存のユニット編集ファイルを開きます。
64
ノードの配置などの AIEditor の編集情報は、XML ファイルで保存されています。
③ 上書き保存
開いている AIEditor のデータを既存の XML ファイルに上書き保存します。
④ 保存
開いている AIEditor のデータを、ファイル名を指定して保存します。
⑤ ローカルメモリ
ローカルメモリとは、アニメーション制御情報を制作するに際にユーザが任意に定義できる変数で
す。
このローカルメモリは、ユニットごとに共通する変数を扱うことが多いため、この[ローカルメモ
リ]機能を使って共通定義を行います。
⑥ スクリプトを出力
編集した AI 情報を MO-Script に出力します。
⑦ DebugMode
チェックが入った状態でスクリプトの出力を行った際に[デバッグ出力]ノードが有効になります。
BattleServer のコンソールに指定したメッセージが表示されます。
(2) AI 制御情報の追加
新規作成の状態でマウスの右ボタンをクリックし、コンテキスメニューから制御項目を選択します。
65
ノード配置の操作は「キャラクタエディタ」と同じ操作です。
[5.1.7 キャラクタエディタ]を参照してください。
以下は、エネミーユニット「スパイダー」の AI 制御情報です。
1
2
4
5
6
3
この制御情報を基にエネミーAI の処理を説明します。
① 開始
処理を開始します。
② ステートラベル「idle」
100 ミリ秒待機した後に[プレイヤー探知]で指定された範囲内にプレイヤーユニットが存在するか
をチェックします。
66
③ 割り込み処理「Message」
「Message」の割り込みが入った場合、比較分岐処理に遷移します。
④ 比較分岐
[システム変数]
「InterruptType」が、
[システム定数]
「AI_SEARCH_HIT」と等しいか比較します。
等しくない場合は、
[割り込み終了]に遷移して[ステートラベル]「idle」に戻ります。
等しい場合は、
[ステートラベル]
「approach_star」に遷移します。
67
⑤ ステートラベル「approach_star」
エネミーユニットがプレイヤーユニットを発見して追跡を始める処理です。
「approach_start」内部の処理は以下の通りです。

「approac_start」の処理を開始します。

[システム変数]
「TargetUnitId」から追跡対象となるプレイヤーユニットの座標を取得します。

取得した座標データは[戻り値]に格納されます。

座標の取得処理が終了した後、
[接近移動]の処理を行います。

-
移動速度:
エネミーユニットがプレイヤーユニットを追跡する際の移動速度です。
-
範囲:
1 回の[接近移動]で移動する距離です。
[アニメーションパラメータ]でエネミーユニットの移動アニメーション再生メッセージを送信
します。

-
パラメータ名:Mecanim で指定された当該ユニットのアニメーション名を指定します。
-
パラメータ: アニメーションのパラメータを指定します。
割り込みを終了し、
[ステートラベル]「approch」に遷移します。
⑥ ステートラベル「approach」
追跡対象となるプレイヤーユニットの追跡処理です。
「approach_start」と同様にプレイヤーユニットとの自ユニットの距離を計測し、移動を続けます。
一定の範囲内(「定数」「float:1.5」に入った際に攻撃をしかける(内部の[ステートラベル]
「attack_start」の処理に遷移します。
68
「attack_start」内では攻撃のアニメーション再生メッセージの送信と攻撃([ステートラベル]
「attack1」~「attack3」
「skill」の処理に遷移します。
「attack_start」内部の処理
攻撃処理が終了した後に、
[ステートラベル]
「idole」に遷移します。
69
(3) 編集データの保存
項番(2)の操作で力が終了した後、
[上書き保存]もしくは[保存]をクリックして配置したノードの配
置情報を保存します。
データは以下の通り保存されます。
保存先フォルダ
C:\Unity\MOengine\Master
保存ファイル名
spider_ai.xml
※ ファイル名は任意です。
※ 配置情報を保存した XML ファイルはノード配置のデータを保存するのみです。
ゲームプレイ関しては使用しません。
(4) スクリプトファイルの出力
項番(2)の操作で力が終了した後、
[スクリプト出力]をクリックして AI スクリプト(キャラクタの行
動を制御するスクリプト)を出力します。
スクリプトを以下の通り出力します。
出力先フォルダ
C:\Unity\MOengine\Master
出力ファイル名
spider_ai.mos
spider_ai _param.h
※ スクリプトのファイル名は任意につけることができます。
※ [spider_ai _param.h]はスクリプトファイル(spider_ai.mos)を出
力する際に自動で出力くされます。
70
5.1.9. ステージエディタ
ステージで使用するゲームのルール、ユニットの制御などのデータを付与し、MO-Script に出力するツー
ルです。
StageEditor では、Scene に配置されたステージオブジェクトに以下情報を作成・編集します。
作成・編集されたデータは、MO-Script として出力されます。

ステージのプレハブ作成

背景コリジョンデータの作成

経路探索用コリジョンデータの作成

スタティックオブジェクトの配置

イベントオブジェクトの配置

プレイヤー出現座標の設定

敵出現座標の設定

上記設定したデータを MO-Script と StageMaster に出力
※ ステージの制限時間設定は、レベルスクリプトの処理に変更しました。
操作方法
ゲーム内で使用するステージ情報を StageEditor で設定します。
(1) 編集する Scene を開く
メニューの [File] → [Open Scene] から、設定する Scene を開きます。
パス:
C:\Unity\MOengine\Assets\MOengine\Sample\Scenes
ファイル名:
StageEditSampleScene.unity
71
(2) StageEditor を開く
StageEditor を起動します。
[MoEngine] → [StageEditor]
登録されているステージの一覧が表示されます。
新規にステージを登録する場合は、
[ステージデータ追加]をクリックします。
ステージを編集するには、リストから[編集] ボタンをクリックします。
(3) ステージデータの編集
選択されたステージの情報が表示されます。
72
ステージ毎の視界情報配置も、ステージエディタで設定できます。
・X 配置数
X 方向への配置数
・Z 配置数
Z 方向への配置数
・オフセット
各情報の配置オフセット
・偶数行オフセット
偶数行の配置をずらす場合のオフセット
※ 配置数のいずれかが 0 に設定されていると、視界情報は出力されません。
例:
X 配置数:32
Z 配置数:32
オフセット:10.0
偶数行オフセット:5.0
→ ステージ原点を中心に、32x32 の視界情報を、10.0 間隔で配置。
→ 偶数行は 5.0 ずらして配置。
「ステージ初期化スクリプトの出力」より出力される inc ファイルを使用し、MoScript をコンバート
することで有効になります。
(4) プレハブの編集
ゲームで使用するステージデータをプレハブデータとして保存します。
保存するプレハブのファイル名を指定します。
例)
フォルダ: C:\Unit\MOengine\Assets\MOengine\Sample\Resources\Stage
ファイル: Stage02.prefab
(5) コリジョンデータ
StageEditScene 内の[StageRoot]にはゲーム中の背景オブジェクトが配置されています。
この背景を確認しながら、コリジョン用のオブジェクト(Quad 等)を配置します。
オブジェクトを配置した後に、
[CollisionAttribute]というコンポーネントを追加することでコリジョ
ンデータ用のオブジェクトに変換されます。
※ [StageRoot] に配置されたオブジェクトがゲーム内の背景として適用されるため、コリジョン
用オブジェクトは [StageRoot] 以外に配置します。サンプルでは [Wall] を使用しています
が、任意のオブジェクト名が使用できます。
73
コリジョン変換用
コンポーネント
74
オブジェクトはメニューの
[GameObject] → [3D Object] → [Quad]
で選択し、ステージ中に配置します。
コリジョンの形状に合わせてクワッド以外の種類のオブジェクトも使えます。
コンポーネントの追加は、
[Inspector] 下部より
[Add Component]→[Scripts]→[MOengin.Tool.Script.Collision]→[Collision Attribute]
を選択することで追加できます。
※ Ver.1.0 では地形の高低差の編集機能は未実装です。近いバージョンで実装予定です。
75
(6) ステージ初期化スクリプト (inc)
編集中のステージでゲーム中に使用する初期化スクリプトファイルの保存先を指定します。
(7) スクリプト (bin)
このステージで使用するレベルスクリプト(ゲームの進行管理を行うスクリプト)ファイルを指定しま
す。
なお、スクリプトファイルは、バイナリ変換されたスクリプトファイル(*.bin)のファイル名を指定し
ます。
(8) コリジョン確認機能
※ ステージエディタの機能ではなく、BattleServer の機能です。
コリジョンの確認の際に利用できます。
画面上に表示されているオブジェクトと、そのコリジョンデータに視覚的に確認する機能です。
確認にはサーバプログラムをデバッグモードで起動してクライアントでログインします。


Windows
パス:
\Package\server\WindowsDebug
起動ファイル:
boot.bat
Mac, Linux
パス:
\Package\server\LinuxDebug
起動ファイル:
boot.sh
※ 上記デバッグモードは、デバッグ用にコリジョンデータのパケットを大量に送信するため、開発用
としての利用には不適なので注意してください。
[Secne]ビュー: コリジョン設定状況の確認
青: プレイヤー関連コリジョン
[Game]ビュー: ゲーム画面
赤: 敵関連コリジョン
黄: 壁等背景コリジョン
MO エンジンではコリジョンの判定をサーバ側で処理しています。
76
オブジェクト自体にコリジョンデータを持つ Unity とは異なり、MO エンジンではゲーム画面上に表示
されるオブジェクトとコリジョン判定に齟齬が生じる可能性があります。
そのため、オブジェクトとコリジョンをリアルタイムで視覚的に確認できるデバッグ機能が提供されて
います。
コリジョン確認機能は上図の通り、
[Game] ビューで動作を確認しながら、[Scene] ビューに同時
に視覚化したコリジョン情報を表示します。
コリジョン確認の際は[Scene]ビューと[Gmae] ビューを同時に視認できるよう画面を分割します。
ゲームをスタートさせて、プレイ中に[D]キーを押下すると [Scene] ビュー上にワイヤーフレー
ムでコリジョンが表示されます。
[D] キーを押下すると、以下の通りトグルで表示が切り替わります。
《コリジョン非表示》→《プレイヤー・敵コリジョン表示》→《プレイヤー・敵・壁コリジョン表示》
77
なお、
[Scene] ビューはプレイヤーの移動を追尾しないため、プレイヤーキャラクタが [Scene] ビ
ューの表示外となる場合があります。
この場合、 [Hierarchy] ビュー内で複数表示される [UnitID]の中で末尾に ’@’ が付いているオ
ブジェクトをダブルクリックすると [Scene] ビューにプレイヤーが表示されます。
[UnitID]の末尾に付く「@」は、Unity のメ
インカメラの対象オブジェクトを意味します。
[UnitID]はゲーム開始ごとに生成されるた
め、プレイヤーキャラクタの ID は毎回異なり
ます。
(9) ユニット同士の当たり判定について
UnitMaster の size を参照し、ユニットがお互い重ならないようにしています。
設定で ON/OFF 切り替えが出来ます。
・クライアントサイド
SystemNodeManager の Inspector で設定します。
UnitCollision: チェックボックスで有効、無効の切り替え。
NotificationRange: 当たり判定でサンプリングするユニットを取得する範囲を設定。
78
・サーバサイド
フォルダ: moe_for_unity\server\server\battleserver\MoSample
ファイル: app.config
UnitCollisionFlag: true で有効, false で無効
<!-- ユニット同士の当たり判定フラグ -->
<add key="UnitCollisionFlag" value="true" />
(10) 経路探索用コリジョンデータ
エネミーユニットがプレイヤーユニットを追跡する際に、壁等の障害物を避けて経路探索を行います。
経路探索を実行するにあたり、障害物等がありユニットが入っていけないエリアと入っていけるエリア
を識別するコリジョンデータを作成します。
コリジョンデータを作成するにあたり、壁コリジョンと同様にオブジェクトを配置して設定します。
配置するオブジェクトは Unity のプリミティブオブジェクトを使用します。
経路探索用コリジョン用オブジェクトは以下の 2 種類あります。
InnerProbe
コリジョンの角を表すオブジェクト。
OuterProbe
侵入可能領域外(壁の外側)を表すオブジェクト。
※ オブジェクトの形状は識別しやすいよう Cube と Sphere にしています。配置するにあたり、追加
する Component の設定で Inner か Outer を判別するため、オブジェクトの形状は問いません。
OutlerProbe
InnerProbe
79
InnerProbe
OuterProbe
【侵入可能領域の判定】
任 意 の InnerProbe は 最 も 近 い 二 つ の
InnerProbe で三角形を構成します。
侵入不可領域
構成された三角形の各辺の中間点で侵入可能領
域外(コリジョン内)となる箇所に OuterProbe
を配置します。
左図のように配置すると、
色の箇所が侵入可
能領域としてデータが生成されます。
侵入可能領域
壁コリジョンの角に InnerProbe を、侵入可能領域の外側に OuterProbe を配置します。
この配置を基にコリジョンの内側・外側のデータを、StageEditor が作成します。
出力されるデータはコリジョンと同じく”*.cbin”ファイルになります。
配置するオブジェクトは、InnerProbe,OuterProbe の親要素に Component でスクリプトを追加しま
す。
Inspector から
[Add Component]→[Scripts]→[MOengine.Tools.Collision]→[Navigation Probe]
を選択します。
選択するコンポーネントの[Type]は、コリジョンの角であれば「Inner」を、侵入可能領域外であれ
ば「Outer」を選択します。
80
「Innter」
「Outer」のオブジェクトの子要素としてオブジェクトを追加すると、子要素すべてが探索用
コリジョンとしての属性を持ちます。
(個別に Component の追加は不要です)
子要素の[Type]は、すべて[Inner]になります
子要素の[Type]は、すべて[Outer]になります
(左)背景オブジェクト、
(右)経路探索用コリジョン用オブジェクト
配置した後にファイルを保存すると経路探索用コリジョンデータを自動生成します。
81
(11) チーム初期情報を配置
編集中のステージで、プレイヤーの出現座標をオブジェクトとして配置します。
[チーム初期情報を配置] をクリックするとチーム初期出現情報用のオブジェクト [Team] が
[TeamInfo] の子要素として作成されます。
[Team] の Inspector (画面右) に表示されている各種情報を入力します。

Transform
プレイヤーの出現する座標等の情報
画面上の座標 (下図) をマウスでドラッグして座標を指定することも可能です。

Type
[Initialize] (初期配置)、Respawn (再配置) のどちらかを選択。
デフォルトは [Initialize]

Team ID
チームの ID (青チーム、赤チーム) を入力。

Range
(未実装)出現範囲。
82
(12) チームリスポーン情報を配置
編集中のステージで、プレイヤーの再出現座標をオブジェクトとして配置します。
[ チ ー ム リ スポ ー ン 情報 を 配 置 ] をク リ ッ クす る と チ ー ム リ ス ポ ーン 情 報 用 の オブ ジ ェクト
[TeamRespone]が[Team]と同様に[TeamInfo]の子要素として作成されます。
[TeamRespone] の Inspector (画面右) に表示されている各種条件を入力します。
入力する内容は [Team] と同様ですが、 Inspector にある [Tyep]のデフォルトが [Repawn]
となっています。
83
(13) 敵を配置
編集中のステージで、敵の出現座標をオブジェクトとして配置します。
[敵を配置] をクリックすると、
[EnemyInfo] の子要素として敵出現情報用のオブジェクト [Enemy]
が作成されます。
[Enemy] の Inspector に表示されている各種情報を入力します。
Type
[Default](通常のエネミー)[Unique](ボス)から出現する敵の Type を選択
します。
Group Id
任意のグループ ID を設定します。
ここで設定した ID を使用して、スクリプトから任意のタイミングでポップさせ
ることができます。
Enemy Type
敵の種別を設定します。エネミーマスタからリストが作成されます。
Range
敵の出現範囲を設定します。EnemyInfo の設定されている GameObject の座
標を基準に、ここで設定した範囲内のランダムの位置に出現します。
Pop Min/Max
一度に出現する最小値/最大値を設定します。この範囲でランダムに出現数が決
84
定されます。
Pop Limit
出現する総数の限界値を設定します。繰り返し出現させた場合、この数値を超
える出現しなくなります。
Interval Min/Max
繰り返しで出現する間隔の最小値/最大値を設定します。この範囲でランダムに
出現間隔が決定されます。両方が 0 の場合、繰り返しが無効になります。
【例】
Pop Min : 1
Pop Max : 2
Pop Limit : 4
Interval Min : 5
Interval Max : 10
以上のように設定すると、5 秒~10 秒間隔で総数が 4 体を超えない範囲で 1 体か 2 体ポップします。
85
編集時に識別しやすくするため、出現するエネミーオブジェクトを [Enemy] にドラッグ&ドロップ
して子要素として配置します。
下記画面のエネミーのオブジェクトファイルは以下の通りです。
フォルダ:
C:\Unity\MOengine\Assets\Design\Enemy\dragon
ファイル:
dragon_10_00_00.fbx
ドラッグ&ドロップ
エネミーオブジェクト
表示されたエネミーオブジェクト
※ Unit Id とそれに紐付いた敵イメージのオブジェクトの表示について、Ver.1.0 では自動では紐付けさ
れないため、Spawn 座標を設定したオブジェクトアタッチする必要があります。
今後のバージョンアップにて自動的に紐付けされる機能を実装予定です。
86
(14) 編集データを保存する
上記操作が終了した後、
[StageDataEdit] ウィンドウ上で[編集データを保存する]をクリックす
ると、StageDataEdit のウィンドウが閉じます。
※ [編集データを保存する]ボタンをクリックしても、編集した内容をオンメモリで保持している
だけなので、ファイルとして保存されていません。
※ データを保存するには項番(16)[MasterData の出力]と編集したシーンファイル
[StageEditSampleScene.unity]を保存してください。
(15) 編集データを破棄する
編集中の[StageDataEditor]上のデータを破棄してリセットします。
既に保存されているステージデータは削除されません。
87
(16) ゲームデータの出力
[StageDataEdit]ウィンドウ上で、
[プレハブを作成]、
[スクリプトを出力]
、
[コリジョンデータ出力]
のボタンをクリックすると、上記で作成したデータをゲーム用のデータファイルとして出力します。
1
2
3
⑧ プレハブを作成
ステージの背景データ(*.prefab)を出力します。
※ 任意のフォルダに保存できますが、必ず[Assets]Resources 以下のフォルダに保存してくだ
さい。
例)
フォルダ:
C:\Unity\MOengine\Assets\MOengine\Sample\Resources\Stage
ファイル:
stage01.prefab
⑨ ステージ初期化スクリプトを出力
ゲーム開始時にステージを初期化するスクリプトファイル(*.inc)を出力します。
フォルダ:
C:\Unity\MOengine\Master
ファイル:
stage_init.inc
(ファイル名は任意)
⑩ コリジョンデータを出力
壁のコリジョンデータと経路探索用 Probe データを出力します。
フォルダ:
C:\Unity\MOengine\Master
ファイル名:
collisiontest.cbin(ファイル名は任意)
88
(17) マスタデータの出力
入力したステージの管理データを出力します。
[StageDataEditor]ウィンドウで登録・編集したデータが保存されます。
[StageEditor]ウィンドウ上の[StageMaster を保存]ボタンをクリックします。
データは以下の通り保存されます。
フォルダ:
C:\Unity\MOengine\Master
ファイル:
StageMaster.json
(ファイル名は固定)
また、ユニットの配置情報など、オブジェクトを保存するため編集した[StageEditSampleScene.unity]
も保存してください。
89
5.1.10. バイナリコンバータ
MO エンジンでは高速化を計るため、スクリプトファイルをバイナリ変化して MO エンジンに読み込ま
せます。
バイナリ変換には専用のコンバータを提供しています。
5.1.10.1.
MO-Script のバイナリ変換
MO-Script のバイナリ変換方法を説明します。
バイナリ変換用のツールはプラットフォームによりプログラムが異なります。

Windows の場合
moe_for_unity\tool\MOScriptConverter フォルダで以下のバッチファイルを実行します。
mos_all.bat

Mac の場合
moe_for_unity\tool\ MOScriptConverterForMac フォルダで以下を実行します。
sh make.sh
なお、バイナリ変換する MO-Script ファイルは、作業を行うフォルダの配下にある以下のフォルダ内に格納
します。

common

level

player

sample
コンバートを実行すると、上記フォルダ内に MO-Script ファイル (*.mos) と同名で拡張子が bin となっ
たファイルが出力されます。
この bin ファイルがバイナリ変換されたスクリプトファイルです。
5.1.10.2.
サーバへの反映
前述のバイナリ変換した MO-Script ファイルをサーバに反映するために以下のフォルダに配置します。
例)

Windows の場合
server\Windows\data

Mac、Linux の場合
server\Linux\Unit
ここでデータを配置したフォルダは、サーバの起動オプションで任意に指定できます。
サーバ起動オプションについては、
「サンプルサーバの起動」を参照してください。
90
サーバを再起動することで変更がクライアントに反映されます。
6. MO-Script リファレンス
MO-Script とは MO エンジン用に開発された、キャラクタ制御やAI、UIの制御、アウトゲームのフロー
制御などに使用できる軽量スクリプトです。
MO エンジンでは、ステージの配置、プレイヤーのアクション、ゲームのルールなど MO-Script というスク
リプト言語で制御されています。
提供されている各種ツール類も編集したデータから MO-Script を出力し、その出力されたスクリプトを基
に MO エンジンがゲームを制御・調停します。
6.1. 特徴

アセンブラライクな記述のシンプルで軽い言語

プラットフォームに依存しない

プロジェクト毎に自由にコマンド追加可能

コルーチンとしての動作が前提となっており、時系列的な記述をそのまま縦に書く事ができる

グルーコード実装は Lua に比べて僅かな手間で済む

バイナリコードはリソースとして扱えるため、プログラム実行中に修正してコンパイルしたバイナリコ
ードのリロードが可能

定型部分のマクロ化やサブルーチン化、コマンド化によりプランナ・デザイナでも容易にスクリプトを
組める環境の構築が可能
6.2. 簡単な例
以下の例では、10+20 を計算してコンソールに出力しています。
// ======== サンプル ========
#include "mosc_def.h"
// ヘッダ
head(0, 0, 64, 1, 0x1000, 0x400);
// テストコード 10+20 の計算
ldi(r(0), _i(10));
addi(r(0), _i(20));
dbg_printd(r(0));
// r0
= 10
// r0 += 20
// print( r0 )
stop();
現バージョンでは完全にアセンブラ式による記述を必要としますが、近いバージョンでCライクな制御構造
が使用可能になる予定です。
91
6.3. スクリプトの基本構造
6.3.1. ヘッダ
スクリプトの先頭には必ずヘッダを置く必要があります。
head(0, 0, 64, 1, 0x1000, 0x400);
以下のパラメータを設定します。
head
メジャーバージョン マイナーバージョン レジスタ数 並列実行数 ローカルメモリサイズ スタックサイズ
head( 0,
0,
64,
1,
0x1000,
0x400);
パラメータの内容
メジャーバージョン
メジャーバージョンを設定します。現状は 0 を設定して下さい。
マイナーバージョン
マイナーバージョンを設定します。現状は 0 を設定して下さい。
レジスタ数
並列実行数
ローカルメモリサイズ
スタックサイズ
スクリプト内で使用するレジスタの数を記述します。通常は 64 を設定して下さ
い。
現在はスクリプト内並列実行には対応していないため、1を設定して下さい。
スクリプト内で自由に使えるローカルメモリのサイズを指定します。必要なサイ
ズをバイトで指定して下さい。
スクリプトのスタックサイズです。通常は 0x400 程度で十分ですが、再帰など
を使用する可能性がある場合は大きめに設定して下さい。
6.3.2. コマンド
MO-Script は1行に1コマンドを記述します。
コマンドはほぼ以下の形式となっています。
cmd_xxx(param, param, ...);
param には操作対象にするパラメータや参照するパラメータを記述します。
処理結果の戻り値はコマンドごとに異なり、param に直接反映されるものや、
特定の"レジスタ"に結果が入るもの等があります。
92
6.3.3. 変数
MO-Script ではプログラミング言語で言うところの"変数"はありません。
その代わり幾つかのメモリアクセス方法が用意されています。
タイプ記述内容
タイプ
記述
レジスタ
r(n)
システムレジスタ
sr(n)
グローバルレジスタ
gr(n)
ローカルワーク
l(idx)
内容
通常使用する"変数"にあたるもので、スクリプト内でのみ使用できます。
上記のレジスタと同様に使用できます(将来拡張で用途が変わる可能性がありま
す)
。
プロジェクト内の static な領域で、 C++/C#とのやり取り に使用します。
ヘッダで指定したサイズで確保された領域で、スクリプト内で自由に使用する事
ができます。
MO-Script は gcc のプリプロセッサを使用しますので、上記のレジスタを直接記述する必要はなく、以下の
ようにマクロで分かり易い別名を定義して使用する事になります。
#define
PlayerHandle
sr(40)
#define
NearEnemyHandle sr(41)
#define TotalItemNum
gr(1)
6.3.4. パラメータ
コマンドのパラメータ記述にはいくつかの種類があり、適切に指定する必要があります。

汎用パラメータ
レジスタや各種固定値を指定できますが、レジスタ/固定値の判別のため決まった書式で記述する必要
があります。
レジスタ
r(n),sr(n),gr(n)
ローカルワーク
l(index)
固定値(8bit)
_b(n)
固定値(16bit)
_s(n)
固定値(32bit)
_i(n)
固定値(64bit)
_ll(n)
固定値(浮動小数点)
_f(x.xf)
ラベル
_lb(label)
ラベル間接参照
_idx(label, r(n))
93

固定値
コマンドによっては固定値を直接指定する場合もあります。
wait(100.0f);

//100 ミリ秒待つ
ラベル
ジャンプ先ラベルは通常そのまま記述します。
bra(loop);
6.3.5. ラベル
ジャンプ先やサブルーチンを表すラベルは[label]の形式で記述します。
[loop]
dbg_print("loop!\n");
wait(100.0f);
//100 ミリ秒待つ
bra(loop);
6.3.6. 計算
計算はパラメータ1に対してパラメータ2を演算する形で行います。
addi(r(10), _i(20));
// r(10) += 10
muli(r(10), r(1)); // r(10) *= r(1)
divi(r(10), _i(3)); // r(10) /= 3
6.3.7. 分岐/条件分岐
条件分岐は最初に比較コマンド、次に比較結果を見る条件分岐コマンドを記述します。
cmpi(rLIFE, _i(0));
// LIFE が0か?
beq(dead);
// 0とイコールだったら dead へ
bra(loop_top);
// 先頭に戻る
6.3.8. サブルーチン
bsr(label)でサブルーチンコール、
ret()でサブルーチンから戻ります。
ldi(rPARAM1, _i(100));
// 経験値 100
bsr(exp_add);
// 経験値加算サブルーチン
bra(loop_top);
// 先頭に戻る
// -------- 経験値加算サブ
[exp_add]
addi(rTOTAL_EXP, rPARAM1);
ret();
// 加算
// 戻る
94
6.4. wait
次のアクションまで一定時間待つときは wait()コマンドを使用します。
[act02]
// ==================== 攻撃2
act_setMot(rUNIT, MOT_ATTACK1);
wait( 500.0f );
// モーション設定
// 500ms 待つ
act_setAttack( rUNIT, J_HANDR, 1.5f );
// 右手に 1.5 サイズの攻撃判定 ON
snd_playSe( rUNIT, J_HANDR, SE_BLOW );
// 振り音
wait( 750.0f );
// 750ms 待つ
act_clearAttack( rUNIT );
// 攻撃判定クリア
act_waitMotEnd( rUNIT );
// モーション終端まで待つ
act_change( act00 );
// 待機へ移行
stop();
6.4.1. 割り込み
MO-Script にはいくつかの種類の割り込みモードがあり、
スクリプトの進行と関係なく処理を割り込ませる事ができます。
種類
RUN割り込み
内容
毎ループに登録したラベル位置の処理が実行されます。
保護されるレジスタ
フラグ/PC
C++/C#側やスクリプト自身からメッセージを送信する事で、
メッセージ割り込み
他のスクリプトに対して登録したメッセージ処理へ割り込ま 全レジスタ
せます。
終了処理
割り込みジャンプ
スクリプトの終了時(exit()に来た時や C++/C#からの強制終
了時)に実行されます。
割り込みの形で現在のスクリプトの処理位置を強制的に変更
します。
95
なし
なし
6.5. 基本コマンド表
6.5.1. パラメータについて
パラメータの記述については以下の意味があります。
r?
汎用パラメータ:r(n), sr(n), gr(n), l(idx), _b(n), _s(n), _(n), _ll(n), _f(n), _idx(label, r0)
l0
ラベル
i0
整数
f0
浮動小数点数
s0
文字列
6.5.2. 戻り値
コマンドの戻り値は通常では、スクリプトヘッダ(head())で指定したレジスタ数で末尾にあたるレジスタに
格納されます。
レジスタ数はデフォルトとして64個を推奨しておりますので、その場合は r(63) が戻り値になります。
以下のように別名定義して使用して下さい。
#define rRET
r(63)
6.5.3. 基本制御
exit()
スクリプト終了&消滅
run(s0)
スクリプトロード&起動
wait(f0)
指定時間待つ
stop()
無期限 wait
seteiv(l0)
終了実行ベクタ設定
setmiv(l0)
メッセージ割り込みベクタ設定
setjv(l0)
割り込みジャンプベクタ設定
setrv(l0)
毎ループ実行ベクタ設定
sendMessage(r0, r1, r2)
メッセージ送信
reti()
割り込み終了
getTaskHash()
タスクのハッシュ取得
nop()
NOP(何もしない)
96
6.5.4. 比較
cmpb(r0, r1)
比較(byte)
cmps(r0, r1)
比較(short)
cmpl(r0, r1)
比較(long)
cmpll(r0, r1)
比較(longlong)
cmpf(r0, r1)
比較(float)
tstb(r0, r1)
ビットテスト(byte)
tsts(r0, r1)
ビットテスト(short)
tstl(r0, r1)
ビットテスト(long)
tstll(r0, r1)
ビットテスト(longlong)
6.5.5. 分岐
bra(l0)
分岐
beq(l0)
==分岐
bne(l0)
!=分岐
bgt(l0)
> 分岐
blt(l0)
< 分岐
bge(l0)
>=分岐
ble(l0)
<=分岐
cmpbeq(r0, r1, l0)
==比較分岐(long)
cmpbne(r0, r1, l0)
!=比較分岐(long)
cmpbgt(r0, r1, l0)
> 比較分岐(long)
cmpblt(r0, r1, l0)
< 比較分岐(long)
cmpbge(r0, r1, l0)
>=比較分岐(long)
cmpble(r0, r1, l0)
<=比較分岐(long)
bsr(l0)
サブルーチンコール
ret()
リターン
push(r0)
プッシュ(long)
pop(r0)
ポップ(long)
braTable(r0, i0)
テーブルブランチ
bsrTable(r0, i0)
テーブルコール
tbl(l0)
テーブルブランチ用テーブル
bsrp(l0, i0); param; param;...
パラメータスタック渡しサブルーチンコール
97
6.5.6. 演算
"?"の部分には演算のサイズ(b:8bit/s:16bit/i:32bit/l:32bit/ll:64bit/f:float)が入ります。
ld?(r0, r1)
代入
add?(r0, r1)
加算
sub?(r0, r1)
減算
mul?(r0, r1)
乗算
div?(r0, r1)
除算
neg?(r0)
符号反転
and?(r0, r1)
AND
or?(r0, r1)
OR
xor?(r0, r1)
XOR
not?(r0)
NOT
6.5.7. ベクトル演算
ldv(r0, r1)
代入
addv(r0, r1)
加算
subv(r0, r1)
減算
mulv(r0, r1)
乗算
negv(r0)
反転
geta(r0, i0)
指定軸の値取得
seta(r0, i0, r1)
指定軸に値セット
scale(r0, r1)
スケーリング
len(r0)
ベクトル長
lenSqr(r0)
ベクトル長の二乗
dist(r0, r1)
2点間の距離
distSqr(r0, r1)
2点間の距離の二乗
normalize(r0)
正規化
dot(r0, r1)
内積
cross(r0, r1)
外積
lerp(r0, r1, r2)
直線補間
unit(i0)
指定軸のユニットベクトルを返す
zero()
0,0,0 を返す
one()
1,1,1 を返す
setv(r0,r1,r2,r3)
3値セット
98
6.5.8. デバッグ用
dbg_print(s0)
文字列出力
dbg_printd(r0)
10進数出力
dbg_printx(r0)
16進数出力
dbg_printf(r0)
float 出力
dbg_cr()
改行の出力
dbg_verbose(i0) コマンド実行状態出力の ON/OFF
6.6. スクリプト起動
C#による簡単なスクリプト実行テストです。
string filename = @"TestScript/test02.bin";
MoScriptTask task = MoScriptManager.Instance.LoadScript(filename);
while (MoScriptManager.Instance.isValid(task))
{
//通常実行
MoScriptManager.Instance.Execute();
//run 部実行
MoScriptManager.Instance.Interrupt((int)MoScriptCommandBlock.MoScriptInterruptType.ITR_RUN, 0,
0, 0);
//ウェイト(仮メインループ)
System.Threading.Thread.Sleep(15);
}
99
6.7. MO-Script 拡張予定
次回リリース版ではC言語的な制御構造が使用可能になる予定です。
以下に例を示します。
[test]
// while if else
r(0) = _i(0);
r(1) = _i(500);
while ( r(0).i < _i(1000) ) {
r(0) += _i(10);
if ( r(0).i > r(1) ) {
break;
} else {
dbg_print("next!\n");
}
}
// switch
l(0x20) = _i(2);
switch ( l(0x20).i ) {
case 0:
dbg_print("-- 0\n");
break;
case 1:
dbg_print("-- 1\n");
break;
case 2:
dbg_print("-- 2\n");
break;
case 3:
dbg_print("-- 3\n");
break;
case 4:
dbg_print("-- 4\n");
break;
default:
dbg_print("-- other number\n");
break;
}
stop();
100