chronote

ゲーム創作活動の備忘録、日々の雑記など。

制作進捗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 を
ダウンロード、インポートする必要がありました。

前回の↓
f:id:chronote:20150309221845p:plain

今回の↓
f:id:chronote:20150316233304p:plain

どちらも好みなんですが。。実はUnity5のエフェクトになってから、
前回の見た目を再現できなくなってしまったというオチ。。


ライティングについては、
マテリアルを Standard シェーダーにすることでPBRにはなるけれど、
static ではないオブジェクトには「LightProbe」なるものを設置しないと、
リアルタイムにはライトが反映されない、ということがわかりました。

f:id:chronote:20150316233942p:plain
白い球体がLightProbe。これを置かないとライトが当たらず、真っ黒になる。


f:id:chronote:20150316234331p:plain
みごとに明るく表示されました。めでたし。