Monthly Archives: 2月 2017

[Departure from the Void] 敵弾の発射方向の計算式修正

今日はスクリプトのリファクタリングを中心にやっていました。
そのため、見た目上の進捗はありません。

いくつかリファクタリングしたスクリプトのうちの一つ、敵弾の発射方向を計算するスクリプトを参考までに載せておきます。
(投げやりになってしまいすみません・・・)

来月も引き続きDeparture from the Voidの制作を進めていきたいと思います。

[Departure from the Void] ステージ1の敵配置をぼちぼちと・・・

今日はステージ1の敵配置作業を少し進めました。

大型で耐久度のある敵が出現するようになりました。
破壊すると派手な爆発を起こします。

また、Shooterクラスの設計を大幅に見直しました。
昨日のクラス図から大分変ってます。

20170227_1

ShooterInvokerクラスとかShooterTriggerクラスとか色々存在していましたが、無駄なインスタンスややり取りが発生してしまい、実装が冗長になってしまうため、ここら辺を最小限に抑えた構成にしました。

これに伴い、自機のショット発射のクラス構成もシンプルになりました。

20170227_2

引き続きステージ1の敵配置を進めていきます。

[Departure from the Void] 弾を発射する敵を実装

昨日投稿したクラス図を基に実装し、敵が自機に向かって弾を発射できるようになりました。

修正したクラス図も投稿しておきます。

20170227_1

大幅な修正はありませんが、属性や操作で一部修正が入っています。
敵の実装に必要な機能がこれで大体揃ったということで、明日以降はステージの敵配置を行っていきたいと思います。

[Departure from the Void] 敵弾の発射クラス改良中・・・

昨日作成した敵弾の発射クラスを少し改良していました。
以下進捗です。

20170225_1

まだ改良中のクラスもあるので、今日は説明は省きます。
今は上記クラスをコーディング中なので、また構成が変わる可能性大です。

大分複雑になってきましたが、概ねやりたいことはできるようになりました。
敵弾のみならず、自機のショット発射とも共通化する方向で考えています。

[Departure from the Void] 敵弾の発射クラス設計中

今日は敵弾の発射を管理するためのクラス設計を考えていました。

以下、途中結果ですが敵弾の発射クラス図です。

20170224_1

敵弾の発射はShooterクラスが行います。
Shoot()の呼び出しで敵弾が一回発射されるようにしました。
引数には発射する敵弾(Prefab)、発射速度(初速)、発射位置を指定します。

Shooterの派生クラスにより実際の敵弾の発射パターンが実装されます。
DirectionalShooterは以下の発射方向を設定できるShooterクラスです。

  • 固定速度:予め指定された固定のベクトルに敵弾を発射する
  • 自機への発射:自機に向けて敵弾を発射する
  • 前方へ発射:自分の前に向けて敵弾を発射する

DirectionalShooterクラスで上記指定された発射方向から発射速度を計算し、OnShoot()を実行します。
OnShoot()はDirectionalShooterの派生クラスが実装します。

Shooter.Shoot()の呼び出し管理はShooterInvokerクラスが管理します。
ShooterとShooterInvokerにクラスを分ける理由は発射タイミングと発射処理の管理を完全に分離させるためです。
こうすることで、多彩なパターンの敵弾を自由なタイミングで発射できるようになります。

明日はこれらのクラスを実装し、自機を敵弾で攻撃する敵の実装もできたらと思います。

[Departure from the Void] ステージ1の敵配置途中・・・

今日はステージ1の敵配置を少し進めていました。
カーブモーションの処理の説明は明日以降の時間のある時に記事で投稿します。(執筆に少し時間が掛かるため)

自機に突進する敵やUターンする敵などの動きを実装して配置しました。

一つ一つの敵の動きを実装していくのは計算式を立てる必要があって面倒ですが、最小単位の動きを組み合わせる仕組みを実装したおかげで大分作業が楽になりました。
(動きのクラス設計はこちらで解説しています。)

引き続きこの調子でステージ1の敵の実装&配置を行っていきたいと思います。

[Departure from the Void] カーブする動き

今日は敵をカーブさせる動きを実装していました。

動きのスクリプトをとりあえず実装して、テストはこれから行うという感じです。
時間が無いので、スクリプトの説明は端折ります・・・

処理の説明は明日に行えれば良いなあと思います。
今日は力尽きたのでここまでにします。

[Departure from the Void] 敵の動きクラスを整理

昨日からステージに配置する敵の動きを本格的に実装し始めました。
今日はこの敵の動きを効率的に管理できるようにする仕組みを実現するため、敵の動きを管理するクラス周りの見直しを行いました。

以下、出来上がったクラス図です。

20170221_1

かなり複雑になってしまいましたが、これで概ねこのゲームでやりたい動きの管理はできるようになりました。
今回このクラス構成にした意図は以下の通りです。

  • 最小単位の動きはUnityのインスペクタから設定できるよう、Serializableなクラスを継承させる
  • 直線やカーブといった最小単位の動きを順番に行う仕組みにする
  • 最小単位の動きは時間や距離で終了できる(次の動きに切り替えられる)ようにする
  • 動きの一部は敵弾の発射時の初速指定ができるようにする
  • 進行方向に敵を向かせられるようにする

直線やカーブは、MotionBaseというSerializableなクラスを継承させて実装するようにしました。
当初はIMotionというinterfaceクラスを継承させていましたが、interfaceクラス型のフィールドはUnityのシリアライズ対象にならないため、苦肉の策としてこのような継承関係になりました・・・

最小単位の動きはこのMotionBaseクラスを継承したLinerMotion、CurveMotion、ChargeMotionクラスなどで実装します。

これらの最小単位の動きは、~MotionInvokerというクラスが責任をもって実行させるようにしました。
これは最小単位の動きを順番に実行させる必要があったためです。
最小単位の動きを順番に実行するクラスはSequenceMotionInvokerが行います。
単一の動きでよい場合はSingleMotionInvokerが行うようにしました。

最小単位の動きは、IMotionConditionクラスが監視し、終了させるようにしました。
MoveByTimeクラスは指定時間経過したら、MoveByStanceクラスは指定距離移動したらIMotion.End()を実行し、動きを終了します。
このタイミングで~MotionInvokerが終了通知を受け取り、次の処理に移れるようにします。
SequenceMotionInvokerはこれで次の動きを実行(IMotion.Begin()を実行)します。

最小単位の動きクラスのうち、敵弾として使用可能な動きはIShootableクラスを継承するようにしました。
このクラスのSetVelocity()、GetVelocity()を実装することで、敵弾の初速の設定・取得ができるようになります。
弾幕を張る場合は弾それぞれの速度が異なるため、敵弾の発射者が柔軟に弾速を設定できるようにした方が望ましいからです。

そして、敵弾含め、移動する方向にスプライトを回転できるようにForwardRotationという動きクラスを置きました。
このクラスがIShootable.GetVelocity()を随時実行しながら速度を監視し、スプライトを動く向きに回転させる処理を行います。

 

今回この敵の動きクラスを設計して得た教訓は、Unityのインスペクタ上でクラス間の紐付けができることも考慮して設計すべきということです。
(理想はinterfaceクラスもUnityのシリアライザが扱えるようになることなのですが・・・笑)
逆にインスペクタ上での紐付けが必要ない場合はinterfaceクラスを積極的に活用した方が良いかもしれませんね。

[Departure from the Void] 追尾する敵を実装

今日は自機に向かって追尾する敵を実装しました。

自機に追尾する動きは、敵の速度ベクトルを自機の向きに回転させていく形で実装しました。
スクリプトは以下のような感じになります。

自機に追尾するとき、左右どちらに旋回するか選択する必要がありますが、これは自機への向きベクトルと自分の向きベクトルとの外積から求めることができます。

正の値なら左旋回、負の値なら右旋回すると自機の向きに近づけることができます。

自機の向きへ回転する速度(角速度)をangleSpeedとすると、以下の計算で次フレーム後の自分の速度ベクトルを算出できます。

この計算方法を使えば、例えばミサイルのような敵に追尾する動きにも応用出来ます。

[Departure from the Void] 敵配置エディタ完成

今日は丸一日かけて敵配置のためのレベルデザインエディタを実装しました。

レベルデザインエディタは以下のようにシーン上に設置した敵オブジェクトからJSONにシリアライズさせるところまでを実装しました。

20170219_1

Editor Stage ObjectというスクリプトがアタッチされたGameObjectをシリアライズ時に総取得し、これらをJSONシリアライザに渡す形で実装しました。

上記で作成されたデータを以下処理で保存します。

意外とあっさりと実装することが出来ました。
(あっさりと実装できるように簡潔な設計で片づけました・・・)

明日以降はステージに配置する敵の動きを実装していきたいと思います。