制作進捗3 ~この泥臭さの先に~
開発2週目の進捗です。
今回から、ゲームルール、ロジックの実装を本格的に進めていきます。
ユニットの動きを、ステートに応じて切り替える
エレガントな設計とか気にせず、まずは動くものを作る!
というわけで、delegate を使って、
関数ポインタ配列的なステート切り替えを作りました。
デリゲート配列の場合、static メソッドしか初期化子でセットできないため、
いったん static でメソッドを定義し、引数で this を受け取る、
という回り道をしているどうでもよいメモ。
public class UnitControl : MonoBehaviour { /// デリゲート:ステートマシン delegate void DlgStateMachine(UnitControl myUnit); /// ステートマシン用デリゲート配列 static DlgStateMachine[] onStateActionList = new DlgStateMachine[] { null, UnitControl.StateAction_FightLoss, UnitControl.StateAction_Idle, UnitControl.StateAction_Move, UnitControl.StateAction_Attack, UnitControl.StateAction_Defense, }; //---------------------------------------------------------------- /// ステート:待機 static void StateAction_Idle(UnitControl myUnit) { // this(myUnit)を使った処理 } //---------------------------------------------------------------- /// 更新 void Update() { onStateActionList[(int)state](this); // ステート別アクション } }
ダメージ計算
次は、敵ユニットに対する攻撃ステートと、
それにともなうダメージ計算を実装しました。
メッセージイベントを多用すると負荷的な心配があったので、
とりあえずダメージ処理はコールバックを呼ぶように対応しています。
そこはいいとして、、
ダメージ計算に必要なパラメータのバランスが難しい…(・・;)
本気調整をするなら、表計算シートにテーブル組んで、
数値変化をにらめっこするのが良いのかな?
今はそこに時間をかけるべきではないと判断し、勢いで乗り切る!
システム/ルールのフロー
ロジックまわりと並行して、システム、ルールの構築も進めます。
シーン上に決まったユニットが最初から置いてあるのではなく、
事前にセレクトしておいたユニットリストから、シーンに配置させます。
ここまで組んでくると、シーン上に実験用のモデルが
いなくなることになるので、モデルの調整なんかをする際は、
専用の調整シーンを用意するのが良さそうです。
特に、物理ベースレンダリングにおけるライティング調整をするには、
基準となるシーンを作ることが不可欠のようですね。
いよいよ本格的にプログラムのコーディングが必要となってまいりました。
たとえ便利なゲームエンジンといえども、ゲーム開発経験が少ないと、
ここら辺でグッと難易度が上がるのではないでしょうか。
なんせロジックやルールを組んでいる時は、ひたすら悩むことが多いです。
この泥臭さを乗り越えた先に、そのゲームにしかない「ハマり」を
生み出せるのですよね。
おまけ:ポストエフェクトとライティングお試し
息抜きがてら、新しいポストエフェクトを試してみました。
実は、今まで使ってたイメージエフェクトの処理はUnity4用だったので、
Unity5のダウンロードページから、Unity5用の StandardAssets を
ダウンロード、インポートする必要がありました。
前回の↓
今回の↓
どちらも好みなんですが。。実はUnity5のエフェクトになってから、
前回の見た目を再現できなくなってしまったというオチ。。
ライティングについては、
マテリアルを Standard シェーダーにすることでPBRにはなるけれど、
static ではないオブジェクトには「LightProbe」なるものを設置しないと、
リアルタイムにはライトが反映されない、ということがわかりました。
白い球体がLightProbe。これを置かないとライトが当たらず、真っ黒になる。
みごとに明るく表示されました。めでたし。