パスワードを忘れた? アカウント作成
14397031 journal
日記

yumeの日記: Unity制作 メデューサ・ゲーム #9 2

日記 by yume

●タイトル画面

タイトル画面と言っても、とりあえずは「なんかキーを押したらゲームが始まる画面」でよい。
一応タイトル画面であることがわかるように、仮のタイトルロゴを入れておく。実際にタイトルロゴを使うかは未定。
とにかくなんでも入力したらゲームスタート(現状はいきなりStage 1から始まる)
後々ここでやりたいこともあるが、一旦OK

--

●ESCキーでメニュー画面。あと一時停止

ESCキーを押すと:
・音量調整
・ゲーム終了
みたいなのが出るといい。
現状は音もないから、とりあえずはゲーム終了だけがあればいいが、仮のメニューも作っておこう。
メニューの外枠が必要だが、枠のサイズごとにでかいスプライトを作ってたら大変だな。
たぶん9スライスみたいな機能があるだろう。探したらバッチリある。

そんで、uiCanvasオブジェクトを作る。これはキャンバスオブジェクトで、スクリーン上に出てくるもの。
uiCanvasの子オブジェクトとして
・inGameMenu(うっすらとした黒)
        ・MenuWindow(メニュー背景ボックス)
        ・ボタンを二つ(音量・終了)
を置く。
uiCanvasにはMenuManagerスクリプトを置き、このスクリプトがエスケープキーの入力によって、inGameMenuのアクティブ状態を切り替える。

Unity既存のUIコンポーネントは、触った時にフェードインしながら色を変えたりとかができるようになっているので、自分でこの辺りを作る必要が無い(細かく変えようと思ったらやっぱり作らなきゃあかんけど)。

さて、タイトル画面などでは問題ないが、ゲーム中はポーズ(一時停止)としておきたい。
簡単な方法としては、Time.timeScaleを0にする、などがあるそうだ。
TimeScaleはFixedUpdate関数などの処理速度を変えるが、Update関数は止まったりはしないらしい。
対策として、すべてのUpdate関数にTimeScaleが0かどうかチェックする、などがあるようだが、ちょっと難がありそうだ。
notargs.comのポーズ処理の方法を導入してみよう。
ただし、このスクリプトは3D向けに作ってあるので、RigidBody周りを2Dに変える。
このコンポーネントが入ったオブジェクトに、ポーズさせたい対象のオブジェクトすべて子として入れてしまえば、ポーズさせれば停止するようだ。
今回はプレイヤーと兵士、あとカメラも入れておく。
テストすると……経路探索系の動きがおかしい。ポーズするたびに停止するのはいいが、ポーズ解除で再び加速するような動きになっている。ふーむ。
Astarプロジェクト公式曰く、
canMoveをtrueにすれば移動、Falseにすれば停止するようだ。
一時停止メソッドのどこかに、それを入れておけばうまくいくだろうか?
一時停止メソッドは、読んでみるに:
・RigidBodyの速度を保存し、RigidBodyをSleepさせる(アクティブ/非アクティブとは違うみたい? > RigidBody2Dはアクティブを切り替えられない代わりにSleepがあるようだ)
・アクティブかつ無視リストにないMonoBehaviour(とにかくUnityのMonoBehaviourを継承するすべてのコンポーネント=FixedUpdateとかで動くやつ)を非アクティブにする
で、戻すときは逆にアクティブにしたり、速度を入れてやったりしているようだ。

ここに、
・AIPathならcanMoveだけをFalseにする。
・MonoBehaviour停止リストから、AIPath型のものは除外する
という二つのコードを追加する。

こうすれば、
・RigidBodyはSleep
・AIPathはアクティブなままだがcanMoveだけFalse
・それ以外のすべてのMonoBehaviour継承コンポーネントは非アクティブ
となる。

このために型の比較が必要だが、調べたところisとかTypeOfとかでチェックできるようだ

MonoBehaviourとはなんぞや、というと大雑把にUnityのUpdateやらなんやらにひっかかる型、およびそれを継承する型のことのようだ。

アセットを使うと自分が理解していない要素が当然出てくるので、いじるときちょっと怖い。
が、とりあえずこれはこれでうまく動いてくれた。

次はテキスト描写シーンを作りたい。

typodupeerror

アレゲはアレゲ以上のなにものでもなさげ -- アレゲ研究家

読み込み中...