解説をもうちょっと詳しく書くようにしました。
初心者のアクションゲーム製作に役立つかもしれないぞ……。
熟練者からすると「この仕組みは浅すぎる……」という感じかもしれない。しかしある程度浅いほうが初心者向きなんですよ。
.
●2016/05/17
内部処理をかなりいじった。
エフェクト用に平面ポリゴンを生成できるようにした。
でかい建物作った。
blenderを最新バージョン2.77にアップデートしました。
設定ファイルが全部消えて泣けた。
今時のソフトなら設定ファイルをユーザフォルダに保存してあると思ったけど、展開したフォルダにそのまま保存してるっぽいぞ……。しかし、zip展開で即実行というのはすっきりしていていい。
キー設定をあまりいじるのはよくないと思ったので、マウスボタンの左右を変えて、3Dビューの操作だけを慣れたものに変えました。
カスタマイズは悪だといえよう。特にこういう癖の強いソフトは推奨設定に慣れたほうがいい……。
最新版ではfbxのエクスポートでテクスチャのループ関連が反映されるようになっていました。これはうれしい。
しかしモデルが変形するようになっていた……。
顔面が頭頂部のほうにぐちゃっと飛び出てますよ。
どうしようもないので前バージョン同梱のエクスポータに戻しました。
.
ゲーム本体は、内部的な処理もだいぶ複雑化してきて動作が重くなってきました。
エフェクト関係がけっこう重くて200枚出すと処理落ちします。どこかに大きなミスがあるような気も。
あと、キャラ同士の接触判定もかなり重い。
今時のPCなら敵500体でも余裕だろうとか思ってましたが、この調子だと64体でもきつくなりそうだぞ……。
地球防衛軍みたいな画面を埋め尽くす大群と戦うステージは無理かもしれない。
とりあえず僕の環境で敵64体を基準に調整していき、最終的に32体での60FPS動作は確保していきたいところです。
それよりエフェクトが重いのが困る。半透明が問題なのかな。
そしてまだ解決できない透明問題があるのだった……。
モデルの中に透明要素がある場合は、そのメッシュだけ後に描画しないといけないのか。
髪の毛や動物の毛を透明要素使って表現するのはどうするんだろうな……。
装備品扱いにして後から描画するとかかな。
.
平面ポリゴンを生成しエフェクト等に使える様にしました。
ショットと魔法陣で使っています。
これがかなりめんどくさくて、自由自在にエフェクトを出すには行列をちゃんと理解しないといけない予感がします。
ホーミングレーザーとか相当めんどくさそうです。
しかし3Dのエフェクトというとこれが基本なので、先人達はみんなこれを乗り越えてきたんだと畏怖を感じるのだった……。
.
マップをでかくして巨大建物も作りました。
blenderって建築物とか工業物のモデリングに向いていないのではないと思ったのだった。
辺の長さを数値入力で指定することができないのですよ。
オブジェクトモードでなら指定できますが、いちいち別オブジェクトにしてサイズ変更して結合させるなどの手間が必要です。
拡大縮小で辺選択後「/辺の長さ」(「s」「/」「長さ入力」)で長さを1にしてから、再びSで変更したい長さにするという方法もあります。
数値入力のアドオンもありましたがこれもいまいち使い勝手が悪くて、CADみたいには扱えないようです。
あらかじめ建築素材のような感じで壁や柱のモデルを作っておいて、それをコピーして建築していくといいんだろうか。
.
ようやくテクスチャのループが出来るようになりました。長かった……。
こんな当たり前のことにどれだけの時間を費やしたのか。
結局、「UV/画像エディタ」で展開したUVを「S」で拡大するだけだった。
ループのチェックを入れると表示がおかしくなるけど、これは見た目だけのものでチェックを外してもいいらしい。
.
カメラの地形接触判定もつけたけどかなり適当なのでガタガタします。
けっこうややこしそうな問題なのであとでなおそう……。
.
キャラの状態遷移関連の処理を夜光蛾7から移植しはじめました。
これを使えばアクションを増やすのが楽になるぞ……。
ただ、アニメーション関連の仕組みが全然違ったりするので、きちんと作るにはそれなりに手間がかかりそう。
.
●2016/05/21
敵キャラのモデルを作った。
敵キャラを作りました。
でかい胸を作るのが思いのほか難しいです。胸部のポリゴン数が少なくて接合部は八角形になっている。
そして接合部付近のモデリングが相当難しい。非表示を駆使したりしたけど、うまくいかない。
なにかコツがあるのかな……。
形状も、若干垂れつつ外側を向くリアル志向の乳房にしたいんだけど、なかなか思うように垂れてくれない。
資料も見るべきか。ここ数年エロ画像の収集なんてやってないぞ……。
服のデザインは、教会の女戦士の標準装備でもあるベルト型魔装具。
ツクユが着けてるやつです。
特殊な魔獣の革でできていて、魔力を溜めることができます。
普段これを着て生活することで少しずつ魔力が充填でき、戦闘時にはそれを使って戦うというわけですよ。
背中の部分はテントのポールみたいな構造(中空のポールにゴムが入っている)になっていて、引っ張れば伸び、縮めたときは一定長さでつっぱる(後ろに引かれすぎないように)という形になっています。
さらにベルトや股間パーツにも粘着性があり激しいアクションでもぴたりと張り付いたままになります。
美しい姿勢と魔力の管理を同時に行える優れものですよ。
腕の部分とブーツの下の部分はテクスチャを描いてるときに急に思いついたので、ボディペインティングみたいになってます。
あとでちゃんと段差を付けたいところ。
胴体の装備が貧相で手足は重装備というデザインが好きなので、上位キャラとして鎧装備も作りたい。
ベヨネッタ感のある爆乳巨尻足太女にするつもりだったけど、ほどほどな感じの巨乳の少女になってしまいました。
しかしこれでも身長175cmはあるのだった。顔を小さくして相対的な等身を下げるべきなんだろうな。
ポニーテールはプログラムによるリアルタイム演算で動かしたいところです。
.
転倒、寝そべり、起き上がりモーションを作りました。
夜光蛾7のキャラ管理処理のおかげでこのあたりは簡単に追加できるようになった。
.
天球を作り空と雲の画像を貼り付けました。
手持ちの画像にいいのがなくテクスチャは荒いんですが、思ったより見た目がよかったです。
アフリカの空ですよ。
フォグを使うと天球まで見えなくなってしまうのが困りました。
フォグに高度の指定がほしいところだけど、そういうのは自分でシェーダをいじらないといけないのか。
.
●2016/05/24
影をつけた。
カメラのめり込み問題をある程度解決した。
近接攻撃、連続攻撃できるようになった。
影が付いてだいぶ3Dゲームっぽくなりました。
シャドウマップを使った影表示はDXライブラリの機能を使えばものすごく簡単でした。ほんの数行追加するだけです。頭を使う部分はほぼないと言える。これはかなりすごい。
でもギザギザをぼかす方法がないので、なんとかしたかったら自分でシェーダをいじらないといけないらしいです。
まぁ今のところはギザギザのままでもいいかな……。
けっこう重い処理らしいので、キャラの影は10メートル以内、建物の影の更新は1秒に一回にしました。
.
プログラム中で生成したポリゴンによるエフェクトがなぜか真っ黒になっていました。
シャドウマップ関係だと思っていろいろ試したものの、直りません。
いったい何が起こったんだ……。
グローバルアンビエント光を設定したり、生成したポリゴンのディフューズ、スペキュラの値を変更しても変わりません。
じっくり調べたところ、デフォルト以外のライトを使う場合はマテリアルの設定をしないといけないようでした。
SetMaterialParam( Material ) ;でemmisiveの値を大きくすればきちんと表示されます。
.
草オブジェクトをつけてみました。板ポリを十字や*型に配置して草のテクスチャを張るやつです。
しかしこれがうまくいかない。透明部分の問題が出てきてどうにもなりません。
同じモデル内に透明部分があるとだめなのか。
そして、バックカリングもオフにできないのでした。
Blender上の設定をどういじってもだめで、プログラムでメッシュごとの設定をしてもだめです。
どうすればいいんだ……。
結局どうにもならなかったので草を生やすのはやめました。
もっと知識が付けばなんとかなるだろう……。
.
カメラのめり込み問題を解決しました。
これがなかなかめんどくさかったです。
カメラの地形めり込み時に、カメラを注視点方向に押し出すだけじゃだめな状況が多々あるのでした。
TPSなので注視点はキャラの右横に設定してあるため、壁の右横に立つと視点だけめり込むわけですよ。
このときにカメラを注視点方向に寄せてしまうと、視界がおかしなことになります。
下手に注視点を動かすと照準の狙ってる場所が変わったりもする。
結局、注視点とカメラの間に何らかの物体があるときは、注視点を頭の位置に移動させることにしました。
主観視点に近くなるわけですね。
まぁ、これがごく当たり前の解決策なんだろうな……。また車輪の再発明をしてしまった。
キャラ本体は地形に対し大き目の当たり判定を持っているため、注視点が地形に埋まることはなく、カメラとの距離も当たり判定半径程度に保たれるわけです。キャラの頭の位置というのは、自動的にちょうどいい具合になる安全地帯だった……。
ただ、距離調整を常に行ってると、「カメラ接触→カメラ押し出し」が繰り返され、さらに接触タイミングごとに注視点も移動するため画面がガタガタ揺れてしまいます。
キャラの場合は小さなガタつきはそれほど気にならないけど、視界に関する部分は小さな動きも目立ってしまう。
今回は、「カメラ&キャラ移動がないときは注視点とキャラの距離を変えない」、「カメラの地形接触解除から6フレームは注視点の位置を変えない」という方法でガタガタを軽減しています。
しかしまだ若干不具合があるので後で直す。
.
近接攻撃できるようになりました。
ボーンの位置を関数で取得できるので、それを弾オブジェクトの座標にすることで打撃攻撃を表現しています。
MV1GetFramePosition( int MHandle, int FrameIndex ) で一発ですよ。すごい。
当たり判定の設定は、ボーンの番号と判定球の半径の二つの数字だけでできる。すごい。
Mhandleがモデルのハンドルで、FrameIndexはボーンの番号です。DXライブラリ付属のモデルビューワで調べることができます。
キャラの行動については、歩く、飛ぶ、パンチ、キックなど各種行動用の構造体を作り、アニメーションの速度や弾の生成タイミング、消滅タイミングを設定しています。
攻撃アニメーションが指定時間になったら弾オブジェクトを生成し、弾オブジェクトには本体へのポインタを持たせそれを通じて自分の位置を取得させる感じです。
コンボもできます。
コンボリストという配列変数に攻撃の番号を入れておき、技を出すたびにコンボポインタを加算、コンボタイマーを設定してます。
コンボタイマーが切れるかリストの最後に来たらコンボポインタがゼロ(最初の攻撃の位置)になる。
前述の構造体には割り込み時間(格闘ゲームで言うキャンセルの可能になるタイミング)も設定してあるので、そこを過ぎた時に攻撃入力があれば次の攻撃に移ります。
回し蹴りから蹴り上げへの移行が強引ですが、回し蹴りはコンボ用ではなくふっとばし攻撃用に作ったためです。
三段目はモーションの小さなローキックかなにかに変更する予定。
しかしモーションの出来はよくないとはいえ、なんだかはじめて3D格闘ゲームをみたときのような感動がある。
まさか自分でこういうのを作れるとはなぁ……。