進捗どうですか?

Unityで2D格闘ゲームを作っています。

Unity格ゲー製作状況その3

前回の投稿から大分開いていますけどぼちぼち作業しています。

前回の投稿Unity格ゲー製作状況その2 - 進捗どうですか?を行ってから、キャラクターごとにカメラを別にしてレイヤーを重ねる手法だと、

f:id:yrkhnshk:20150112225218j:plain

ギルティギアXrdで行っているこのような表現ができないことに気づきました。

この空中ダッシュの衝撃波のエフェクトは奥のポチョムキンの後側にも回っています。キャラクターとエフェクトのレイヤーが分断されていれば(別カメラであれば)、通常このような表現はできません。

ギルティギアXrdではレイヤーを分けるのではなく、攻撃側のキャラクターを描画するとき深度(=Z)値だけを3D空間上で視点側に約1メートルほどオフセットさせることで同一レイヤー&同一軸上でもキャラクターが融合してしまうような重なりが発生しないようにしたとのことでした。

(西川善司の「試験に出るゲームグラフィックス」(2)「GUILTY GEAR Xrd -SIGN-」で実現された「アニメにしか見えないリアルタイム3Dグラフィックス」の秘密,後編 - 4Gamer.net参照)

 

この「深度をオフセットさせて融合しないようにする」表現をUnityで行う場合は、頂点/フラグメントシェーダ(Vertex/Fragment Shaders)でポリゴンの頂点を直接操作することで実現することができます。

実装するにあたりCG - [Unity] Vertex/Fragment shaderで通常のライティングとシャドウを適用するサンプル - Qiitaを参考にしました。

ここであげられているシェーダの以下の部分を改造します(関係ある部分のみ記述)。

// Vertex shader function.
v2f vert(appdata_tan v) {
 v2f o;

 o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
 o.pos.z += _ZOffset;//追加
 return o;
}

シェーダのプロパティに_ZOffsetを追加します。

これにより以下のようにすることが可能になりました。

・双方_ZOffset=0の場合

f:id:yrkhnshk:20150112233911j:plain

・片方のみ_ZOffsetを変化させた場合

f:id:yrkhnshk:20150112233922j:plain

 

これを自作のトゥーンシェーダに実装して以下のように表現可能になりました。

f:id:yrkhnshk:20150113004657j:plain

エフェクトが奥の青いキャラの後ろ側にも回っていることがわかります。

f:id:yrkhnshk:20150115031100g:plain

深度をリアルタイムで変化させたGIFアニメ

 

他にもスト4やXrdで実装しているハイブリッド投影(水平と垂直で投影方法が異なるというもの)を実装したり、キャラクターの奥側のパーツに陰が付きやすくなるようにしてみたり・・・。

ギルティギアXrdで行っていることはUnity上でも大まかにはやれたのではないかと思います。あとはハイライトの表示でしょうか。ギルティギアXrdはポストエフェクト処理も行っていますが、私が使用しているのは無料版のUnityなので無理です・・・。

自作シェーダも大分出来上がってきましたが、もう少しクオリティをあげられればいいなと思っています。