Monthly Archives: 5月 2015

[Unity] 複数のタイマーチャネルを持たせる

Unityのタイマー関連の情報はTimeクラスのstaticメンバより取得できます。
以下のように使用されることが多いでしょう。

前回のフレームからの経過時間はTime.deltaTime、ゲーム起動からの経過時間はTime.timeをReadすることで取得できます。

しかし、これらはstaticメンバのため、以下のように時間の進行速度を変化させるとゲーム全体に影響を及ぼしてしまいます。

ある特定のオブジェクトだけ時間の進行速度を変えたい場合(ポーズも含む)、複数のタイマーがあると有難いです。
しかし、そのような機能はUnityには元々存在しないため、自力で実装する必要があります。

これはちょっとした工夫で簡単に実装できます。
複数のタイマーを管理するスクリプトの例を以下に記します。

MultipleTimer.cs

次の部分で複数のタイマーを管理しています。

time、timeScale、deltaTimeをメンバに持つ構造体の配列を定義しています。

これらのメンバーの値はUpdate()メソッド内で毎フレーム更新しています。

deltaTimeやtimeの値をtimeScaleの値から独自に計算しています。
この計算処理はUnityタイマーのそれを真似ています。

上記で実装したタイマーは以下のように使用できます。

これで以下のようにGameObjectそれぞれに独立したタイマーを持たせて動かせるようになりました。

少々面倒ですが、複数のタイマーを使用する場合、タイマー管理スクリプトから情報を取得するように開発者が気を付けるようにすれば良いでしょう。

■参考サイト
Unity – Scripting API:Time

[Departure from the Void] ステージ2実装中・・・

今日からゴールデンウィークが始まったということで、Departure from the Void(縦スクロールシューティングゲーム)のリメイク作業を進めています。
現在はステージ2の敵キャラのモーション作成&配置を行っています。

以下、開発途中の画面です。

20150502_001

進捗は3分の1くらいです。
完成までの道のりはまだまだ長いですが、気楽に作業していきたいと思います。

敵キャラのモーション作成には自作のモーションエディタを用いています。

20150502_002

このような感じで、Unityエディタのシーン上に表示される軌道を見ながらインスペクタの値を設定していきます。
例えば、上下に動く敵は、「上に100px移動」→「下に100px移動」→「上に100px移動」→・・・というような動きを順番に行わせるように実装していきます。

かなり地道な作業ですが、従来は複雑な動きを実装するのに一つ一つ個別のスクリプトを書いていたことを考えると多少は楽になった感じです。
ただし、モーションエディタの改善点も見えてきたので、この辺のリファクタリングもまとまった時間を確保して行ってしまいたいです。

敵配置はシーン上に直接置くような形にしました。

20150502_003

そして、実際にゲームを実行するときは下から徐々に敵を出現させるようにします。
全部敵を出現させてしまうとCPUとメモリのリソースを消費してしまうためです。

スクロールシューティングゲームやスクロールアクションゲームではこのような手法がよく登場しそうですね。
需要があればここら辺をアセット化してアセットストアに出せるかも・・・しれないですね。

引き続きまったりと制作進めていきたいと思います。

5月になりました

もう5月になりました。
時がたつのは早いですね。

先週は活動時間をほとんど確保できなかったため、進展は無しです。
しかし、ゴールデンウィーク中は活動時間を割けそうなので、この間に少しでもゲーム制作進めたいと思います。

まずは停滞していたDeparture from the Voidのステージ2制作を進めること。
公開までの道のりはまだまだ長いですが、順調に作業が進めばステージ2の中盤から後半まで実装できそうです。
夏までには何とか公開まで持っていけたらと思います。

公開したら次のゲーム制作に移ります。
今のところ考えているのがiPhoneゲームです。
完成したものはApple Storeで公開する予定ですが、まだまだ先の話になりそうです。

そんなこんなで、今月もよろしくお願いいたします。