20200602のUnityに関する記事は4件です。

【Unity】Motion Blurで勘違いしてたこと ~ゼノブレイドリメイク買いました~

ゼノブレイドのリメイク版 買いました。
Wii版、WiiU版積みゲーしてたので今度こそクリアするぞ。

で、原作と比べてたんですが、3Dのポリゴン数とかテクスチャがリッチになっただけでなく、 モーションブラー をふんだんに使ってることに気づきました。
特撮感が出てやっぱカッケェ~ってなったので、PVとかトレーラー作るときにモーションブラー使って"盛れ"ないかな~と思い、Post Processing Stack でお手軽に再現できないか試してみました。

ダメでした。

何がダメだったの?


▲たとえば、これはカメラの角度がブンブン動いて画面内のものがブレてます。

▲でもこっちはカメラの内でブロックがブンブン動いても全然ブレてくれません。

どうやら Post Processing Stack の Motion Blur は、カメラの角度や座標の変化によって画面はブレますが、カメラが不動・あるいはあまり動かないときに、 視野内でオブジェクトがどんなに激しく動こうとモノがブレない みたいです。

ゼノブレイドの場合

モーションブラー_1.jpg

モーションブラー_2.jpg

カメラ内で動くキャラクターがカッコよくブレてます。これがやりたいの!

↑を実現できる、お手軽に使えるアセットとか実装方法とか知ってる方いたら教えてください!
視認性が下がるからゲーム内では多分使わないので、負荷は度外視でいいかなと思ってます。

Motion Vectors というキーワードが何か握ってると思ってるので、このへんから調べてみようかな。。。
image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Unity]Motion Blurで勘違いしてたこと ~ゼノブレイドリメイク買いました~

ゼノブレイドのリメイク版 買いました。
Wii版、WiiU版積みゲーしてたので今度こそクリアするぞ。

で、原作と比べてたんですが、3Dのポリゴン数とかテクスチャがリッチになっただけでなく、 モーションブラー をふんだんに使ってることに気づきました。
特撮感が出てやっぱカッケェ~ってなったので、PVとかトレーラー作るときにモーションブラー使って"盛れ"ないかな~と思い、Post Processing Stack でお手軽に再現できないか試してみました。

ダメでした。

何がダメだったの?


▲たとえば、これはカメラの角度がブンブン動いて画面内のものがブレてます。

▲でもこっちはカメラの内でブロックがブンブン動いても全然ブレてくれません。

どうやら Post Processing Stack の Motion Blur は、カメラの角度や座標の変化によって画面はブレますが、カメラが不動・あるいはあまり動かないときに、 視野内でオブジェクトがどんなに激しく動こうとモノがブレない みたいです。

ゼノブレイドの場合

モーションブラー_1.jpg

モーションブラー_2.jpg

カメラ内で動くキャラクターがカッコよくブレてます。これがやりたいの!

↑を実現できる、お手軽に使えるアセットとか実装方法とか知ってる方いたら教えてください!
視認性が下がるからゲーム内では多分使わないので、負荷は度外視でいいかなと思ってます。

Motion Vectors というキーワードが何か握ってると思ってるので、このへんから調べてみようかな。。。
image.png

続きの記事を書きました

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

FBX,OBJ等の読み込みを低コストで出来るUniModelExport

UniModelExportとは

C++で3Dモデルのデータを読み込む上で避けては通れないFBX等のファイルを
Unityをローダーとして使うことによって一括の方法で管理することが出来るものです。

何ができるの?

Unityで読み込んだモデルを/形式として書き出したうえでC++で高速に読み込むことが出来ます。
(独自行列の実装が面倒で実際はDirectXMathに依存してます。バージョンアップで依存性無くなるはずです)
UnityのSceneをTransform情報を含めて書き出すことが出来ます。Unityで配置→書き出し→読み込みが出来ます。

使い方

ダウンロード

ここのリンクから最新のものをダウンロードし解凍します。
https://github.com/harayuu9/UniExportModel/releases

解凍して出来たものの「ModelExport」がUnityのプロジェクト
「DirectX」がDirectXで実装されたC++のサンプルになります。

Unityで書き出し

「ModelExport」をUnityで開きます。(比較的どのバージョンでも動くはずです2019以降なら確実です)
その後新しいSceneを作成します。(とりあえずSampleSceneでテストしたい方は不要です)
書き出し方法は目的によって多少ことなります。

アニメーション無し3Dモデル

image.png
画像のようにマテリアルの貼ってあるモデルを真ん中に合わせて配置します。
注意
マテリアルの情報がそのまま吐き出されます。のちに説明しますが基本的にはStandardシェーダーでマテリアルを作りましょう。

Unity内の原点がモデルの中心になります。
次にメニューバーから「ModelExport」→「Mesh」を選択します。

出てきたウィンドウの「Mesh」の所にSceneに配置したモデルを設定します
image.png

マテリアルの設定(後述)と頂点データの設定(後述)をした上で「Write」もしくは「WriteBinary」を押して出力します。
基本的にはBinaryを推奨してますがBinaryでない方も必要に応じて使ってください。

アニメーション付き3Dモデル

配置の仕方はアニメーション無しのモデルと同じです。
配置後アニメーション付きモデルに設定してあるAnimatorにAnimationController作成して設定します
image.png
この時AnimationControllerに設定されているアニメーションが全て吐き出されます。
このスクリーンショットではノードをつないでありますが繋ぐ必要はありません。

次にメニューバーから「ModelExport」→「SkinnedMesh」を選択します。

出てきたウィンドウの「SkinnedMesh」の所にSceneに配置したモデルを設定します。
マテリアルの設定(後述)と頂点データの設定(後述)をした上で「Write」もしくは「WriteBinary」を押して出力します。
基本的にはBinaryを推奨してますがBinaryでない方も必要に応じて使ってください。

マテリアルの設定

各出力をするときに指定する「Material Setting」では出力するマテリアルの情報を選択することが出来ます。
対応しているデータはTextureとColorになります。
初期で設定してあるのでお分かりかと思いますがここにはパラメータにアクセスするためのキーワードを記述します。

頂点データの設定

各出力をするときに指定する「Advance Setting」では出力するマテリアルの情報を選択することが出来ます。
Meshに格納してある様々な値を付けて出力することが出来ます。
デフォルトではPosition,Normal,UV1とSkinnedMeshについてはBone情報になってます。
必要に応じて増やしたり減らしたりするとデータ量を減らすことが出来て読み込み時間も減らすことが出来ます。

シーンまとめて書き出し

シーンにあるオブジェクトをまとめて書きだしたい場合は
「ModelExport」→「Mesh」を選択して「Write Scene」もしくは「Write Scene Binary」を押します。
Unity内でオブジェクトの配置をしたい場合これを使うと便利です。

C++で読み込み

C++のライブラリに関しては「UniExportModel\DirectX\DeferredRenderer\Source\UniExportModel.hpp」このファイルに集約されています。

アニメーション無し3Dモデル

アニメーション無し3Dモデルはuem::Model<T>が全てになります。
uem::Modelのテンプレートには頂点データの構造体を指定します。
例えば以下の設定で出力をした場合
image.png

struct.cpp
struct VertexData
{
    float position[3];
    float normal[3];
    float uv[2];
};

uem::Model<VertexData> modelData;

このような構造体を作れば良いことになります。AdvanceSettingの上から順番に構造体を定義するようにしてください。
例えば以下のような例はNGです

struct.cpp
struct VertexData
{
    float position[3];
    float uv[2]; //Normalが先じゃないとだめ
    float normal[3];
};

uem::Model<VertexData> modelData;

上記のコードのようにインスタンスを作成したらLoadBinaryもしくはLoadAscii関数を呼び出してファイルを読み込みます。
メッシュデータについてはmodelData.m_meshes.vertexDatasmodelData.m_meshes.indexes
マテリアルの情報についてはmodelData.m_materialsに入っているので必要な情報を抜き出して使います。
メッシュデータとマテリアルはmaterialNoで紐づいています
コーディングしたら大体以下のようになります。

source.cpp
struct VertexData
{
    float position[3];
    float normal[3];
    float uv[2];
};

uem::Model<VertexData> modelData;
modelData.LoadBinary(filename); //読み込みたいファイルの名前

for(const auto& mesh : modelData.m_meshes)
{
    //この中で読み込んだ頂点に対して様々な処理をする
    //mesh.vertexDatas[.....]
    //mesh.indexes[.....]
    modelData.m_materials[mesh.materialNo]; //このマテリアルがメッシュに対応しているマテリアル
}

for(const auto& material : modelData.m_materials)
{
    //この中でマテリアルに関する様々な処理をする
    string mainTexName = material.GetTexture("_MainTex"); //テクスチャパスも加工無しで扱えるようになっている
    XMFLOAT4 color = material.GetColor("_Color");
}

アニメーション付き3Dモデル

アニメーション付き3Dモデルはuem::SkinnedModel<T>が全てになります。
使い方はアニメーション無しとあまり変わりません。同じように頂点データの構造体を指定して作成してください。
Mesh,Materialの取得方法は同じです。
ただ描画するときに各ボーンの行列を取得して正しく設定してあげなければなりません。
ボーン行列の取得方法は以下のようになります。

source.cpp
struct VertexData
{
    float position[3];
    float normal[3];
    float uv[2];
    unsigned int boneIndex[4];
    float boneWeight[4];
};

uem::SkinnedModel<VertexData> modelData;
modelData.LoadBinary(filename); //読み込みたいファイルの名前

for(const auto& mesh : modelData.m_meshes)
{
    XMMATRIX boneMtx[200]; //XM依存してます
    for(int i=0; i < mesh.bones.size(); i++)
    {
        XMMATRIX boneMat = model.bones[i].second->LocalToWorldMatrix(); //これが現在のボーンのTransform
        boneMtx[i] = model.bones[i].first * mat; //firstが初期ボーン行列の逆行列になっているのでかけて正しい値を求める
    }
}

ソースコードに書いてある通りです。model.bonesに必要な情報が入ってます。
firstには初期ボーン行列の逆行列(XMMATRIX)
secondにはボーン本体(Transform)
これを使って描画するとSkinnedMeshとして描画することが出来ます。

アニメーション

ボーンに沿って描画出来るようになっただけでアニメーションはまだしてくれません。
アニメーションはuem::SkinnedAnimationになります
ソースコードで説明します。

source.cpp
struct VertexData
{
    float position[3];
    float normal[3];
    float uv[2];
    unsigned int boneIndex[4];
    float boneWeight[4];
};

uem::SkinnedModel<VertexData> modelData;
modelData.LoadBinary(filename); //読み込みたいファイルの名前

uem::SkinnedAnimation animation;
animation.LoadBinary(filename, modelData.m_root.get()); //アニメーションの対象のモデルのルートを設定

float animTime = 0.0f;
while(true)
{
    animation.SetTransform(animTime); //指定した秒数にアニメーションを設定する
    animTime += 0.05f;
    if(animTime > animation.GetMaxAnimationTime()) //アニメーションの最大時間を取得
        animTime = 0;
}

読み込み、設定、最大時間取得の関数を用意しています。
割とこの辺りは実装依存なんでhppで公開してることですし適当に変更して使うと良いかもしれません。(ちゃんと整備しろ)

まとめ

こんな雰囲気で使えば雰囲気でどんなモデルも読み込めるようになりテクスチャパス周りも楽出来ると思います。
後GitHubにUnity上と同じレイアウトで配置出来てるよっていうスクショあるので見てみると
こんなの出来るよーってのが分かります。あれはシーン丸ごと吐き出しをすれば出来ます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VRChat にアバターをアップロードしようとして詰まったこと[Unity]

はじめてのアバターアップロードを試してみたところ、詰まるところが何箇所かあったので、忘れないうちに書き残しておきます。

前提条件

https://astoness.com/blogs/times/how-to-upload-avatar-vrchat
こちらの記事のような手順で準備を進め、
【5】カスタムアバターの導入
この辺りまでやってみたけど、下記のような症状が出ている、という方向けです。

  • 何故かアップロードできない
  • エラーが出る
  • アップロードできてもアバター一覧に出てこない

アップロードに挑む

unsupported platform: couldn't get group name for target %i

image.png

unsupported platform: couldn't get group name for target %i

こんな感じのエラーがコンソールに出ている場合は Unity のバージョンを合わせる ことでエラーを解決できます。

Unity のバージョンを合わせる

image.png

VRchat SDK いわく、 2018.4.20f1 が必要らしいので、これを使えるようにします。

サポートされているバージョンの Unity をインストールする

https://unity3d.com/jp/get-unity/download/archive
このページにアクセスして、

image.png

ここをクリック。

image.png

Unity Hub でインストールの一覧に対象のバージョンが表示されていればOK。

指定したバージョンの Unity でプロジェクトを作成する

image.png

プロジェクトタブで 新規作成 の右側にある矢印をクリックし、

image.png

対象のバージョンを選択することで

image.png

指定したバージョンでプロジェクトが作成できる。

(エラーはまだまだ続く。)

File Not Found Exception

Build & Publish をクリックして、処理が始まったのに、なぜか止まった…
そして、Unity の下のほうには赤い文字。

image.png

よく見てみると、

FileNotFoundException: XXXXXXXXXXX/AppData/Local/Temp/DefaultCompany/New Unity Project/prefab-id-v1_avtr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.prefab.unity3d does not exist

みたいなことが書いてある。

コンソールを開いて詳しく見てみるとこんな感じ。

image.png

これは、Dynamic Bone 関連でエラーが起きていると表示される警告です。

解決方法としては、下記の3つくらいが考えられるのではないかと思います。

  • Dynamic Bone を導入する
  • Dynamic Bone の使われていないアバターを使う
  • Dynamic Bone 関連のスクリプトを削除する

Dynamic Bone を導入する

※ Dynamic Bone をまだ購入していないため、未検証。購入後追記予定。

Dynamic Bone についての詳しい話はこのあたりの記事を。
https://pikali.hatenablog.com/entry/2019/01/14/101628

インポートしたアバターに Dynamic Bone 関連の設定が入っている場合、有料アセットの Dynamic Bone 本体 を別途インポートしてあげる必要があります。
別記事で見かけた記述に、『Dynamic Bone はアバターより前にインポートすべし』というものもありました。
(該当記事は紛失しました…すみませんm(_ _)m)

Dynamic Bone の使われていないアバターを使う

入手したアバターパッケージの中に、Dynamic Bone が使われていない Scene が用意されている場合があります。
見つかった場合は、その Scene のインポートを試してみてください。

image.png

上のファイルは Dynamic Bone あり。下のファイルは Dynamic Bone なし。

Dynamic Bone 関連のスクリプトを削除する

Dynamic Bone でエラーが出ているのであればそのスクリプトを削除してやればスッキリ!
するんじゃないかなとは思うのですが、 削除しても正常に動くのか という問題 や、 そんなことができる人は、こんなところで詰まっていない問題 があります。

そんなことができる人は、こんなところで詰まっていない問題 は、こちらの

Missing Remover
https://booth.pm/ja/items/1969758

で解決できるかもしれません。
使用することで、 missing script のエラーが出ている箇所を一括削除できます。(すごい!)

ただ、余計な箇所も削除されてしまう可能性があると思うので、自己責任&治ったらラッキー くらいの気持ちで使ってみてください。

Error saving blueprint.

image.png

アップロードを実行すると、 Error saving blueprint. のポップアップが表示されることがあります。
この問題は、空の BlueprintID を設定してアップロードしなおすことで解決できます。

BluePrintID を空にする

image.png

アバターの Prefab にアタッチされている PipelineManager を探して Detach をクリックすることで、BlueprintID を空にすることができます。

アバターのアップロードに成功しても、一覧に表示されない

アップロードには成功していて、

image.png

Content Manager から確認できるし、

image.png

VRChat のマイページからでも確認できるけど、

肝心の VRChat 内ではアバターが一覧に表示されない という場合は、アバターの名前を変更する ことで問題を解決できるかもしれません。

アバターの名前を変更する

この方法は、有用なのかいまいちはっきりしていません。
再現できたのは最初の一度だけで、それ以降は、時間経過によって自動的にアバター一覧に表示されるようになりました。

image.png

もしかすると、誰かがすでに使っているアバター名だと使用できない、というようなことがあるのかもしれません。
一度、『誰もそんな名前は付けないだろう』というような名前を入力してアップロードしてみてください。

成功

image.png

まとめ

自分でアップロードを行おうとして詰まったところを一通り書いてみました。
なにかおかしな点、その他関連する情報などがあれば教えていただけると幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む