Unity格ゲー製作状況その3
前回の投稿から大分開いていますけどぼちぼち作業しています。
前回の投稿Unity格ゲー製作状況その2 - 進捗どうですか?を行ってから、キャラクターごとにカメラを別にしてレイヤーを重ねる手法だと、
ギルティギアXrdで行っているこのような表現ができないことに気づきました。
この空中ダッシュの衝撃波のエフェクトは奥のポチョムキンの後側にも回っています。キャラクターとエフェクトのレイヤーが分断されていれば(別カメラであれば)、通常このような表現はできません。
ギルティギアXrdではレイヤーを分けるのではなく、攻撃側のキャラクターを描画するとき、深度(=Z)値だけを3D空間上で視点側に約1メートルほどオフセットさせることで、同一レイヤー&同一軸上でもキャラクターが融合してしまうような重なりが発生しないようにしたとのことでした。
この「深度をオフセットさせて融合しないようにする」表現を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の場合
・片方のみ_ZOffsetを変化させた場合
これを自作のトゥーンシェーダに実装して以下のように表現可能になりました。
エフェクトが奥の青いキャラの後ろ側にも回っていることがわかります。
深度をリアルタイムで変化させたGIFアニメ
他にもスト4やXrdで実装しているハイブリッド投影(水平と垂直で投影方法が異なるというもの)を実装したり、キャラクターの奥側のパーツに陰が付きやすくなるようにしてみたり・・・。
ギルティギアXrdで行っていることはUnity上でも大まかにはやれたのではないかと思います。あとはハイライトの表示でしょうか。ギルティギアXrdはポストエフェクト処理も行っていますが、私が使用しているのは無料版のUnityなので無理です・・・。
自作シェーダも大分出来上がってきましたが、もう少しクオリティをあげられればいいなと思っています。