ステージギミックの作成
どうもこんにちは,たつぷりです.皆さんご存知の通り,UnityではProbuilderを用いて簡単にステージのプロトタイプを作成することができます.今回の記事ではProbuilderを用いて作成したステージにギミックを作ってみたいと思います.ここでギミックと言っているのはスイッチをONにすると扉が開いたりエレベーターが動く,落とし穴が開く,といったことを想定しています.
参考映像
今回作成したギミックの動作テストをYouTubeにアップしています.
動くギミックの要素
上で具体的にあげた例の自動扉やエレベーター,落とし穴はいずれも以下の要素からなります.
扉やエレベーターの実体のオブジェクト
ギミックを作動させるための操作盤
オブジェクトを移動させるスクリプト
ここで,1はProbuilderで作ったもの,2は以前作成した鍵のついた扉の仕組みを流用することで作成できます.よって今回は3のオブジェクトを移動させるためのスクリプトの作成を行います.
必要な情報
まずはギミックを実装する上で必要な情報は何か整理します.基本的には,
どの方向 に どのくらいの距離 を動かすか
どれくらいの早さで操作を完了させるか
の情報で記述できそうです.後者を定義しておかないとオブジェクトを瞬間移動させることになってしまいます.
まず前者は,移動の変位分のベクトルに他なりません.これを与えることで方向と,距離の情報を得ることができます.後者は「何フレームで操作を完了させるか」を指定する整数を与えれば良いです.これを以下ではステップ数と呼ぶことにします.
これによって,与えた変位ベクトルの距離をステップ数で割った1フレームあたりの変位ベクトルを定義することができます.つまりUpdate関数のなかでステップ数の回数だけ変位ベクトルを動かすことで,少しずつ動かすことができます.
以上の情報に加えて,扉が開いているかどうかの情報も記述することにします.これによって扉を開けっぱなしにするのではなく,開け閉めをすることができます.
より具体的には,扉が閉まっている時は与えられた変位ベクトルだけ動かし,開いている時は与えた変位ベクトルの絶対値が同じで向きが反対のベクトルだけ動かすことによって開け閉めを実装することができます.ここまでをまとめると以下の情報を与えることでギミックを実装することができます.
変位ベクトル(Vector3)
操作が持続するフレーム数(int)
扉が開いてるか否か(bool)
実装
では実際に上で整理した情報を用いてギミックを実装していきます.
1フレームあたりの変位ベクトル
1フレームあたりの変位diff(Vector3型)を以下のように定義します.
[SerializeField] Vector3 dir; //与えた変位ベクトル Vector3 diff; diff = 1.0f/(float)step * dir;
与えたベクトルの大きさを単純にステップ数で割っただけです.ただし注意したいのは,Vector3の絶対値はfloat型なのでint型で定義したステップ数はfloatにキャストして使う必要があります.
オブジェクトの移動
オブジェクトの位置を移動させるのはTranslateメソッドで実現できます.先ほど定義したdiffを使って
this.transform.Translate(diff);
をUpdate中に実行することで各フレームでdiffずつ変位を与えることができます.これをステップ数の回数だけくり返すことで期待通りの動きが実現されます.
扉が開いているか否か
上で示した扉を開ける操作が完了したら,扉の開閉を格納するbool値変数を反転させるようにしておけばそれで完了です.私の認識ではbool値の反転は,
bool hoge = true; //bool値変数の宣言・初期化 hoge = !hoge;//変数hogeの反転
というようにして実装するのが簡単です.
補足
今回オブジェクトはTranslateで移動させていますが,これは基本的には物理を無視した瞬間移動のようです.ですから今回実装した具体例のエレベーターでは下に降りる際にプレイヤーが慣性で置いていかれるようなことが起きてしまいます.これはいろいろ解決法があると思いますが,今回は対処療法的ですがPlayerSetting>Physics で重力加速度を変更しました.defaultでは地球上の重力加速度と同じ9.8m/s2になっていますが,これを10倍ほど大きくしてとりあえず床に置いていかれない道ように改良しました.
まとめ
今回はPribuilderで作ったステージにギミックの作成を試みました.今のところスイッチで動作する自動扉とエレベーターを作成してみました.他に応用できる例として自分が考えているのは(最初にも述べましたが)落とし穴の実装です.「スイッチを押したら落とし穴が開いて敵を落とした後にもう一度スイッチを押して蓋をしてプレイヤーが通れるようにする」といったことができるようになれば攻略の幅も広がって面白そうだなあーっと思っています.
だんだんProbuilderを使って自作の建造物が作れるようになってきました.今後,もう少しProbuilderを用いたレベルデザインに関して知識が溜まってきたら改めて解説記事を書きたいと思っています.
ではまた,次の記事でお会いしましょう.たつぷりでした.