Nanashi-soft

Nanashi-softの活動状況とか雑談です。 Unity3Dでゲーム作っています。

うちで制作しているゲームには,背景全般に Unity標準シェーダー,キャラ全般にこの人形シェーダーを使用しています
Unity2018でプロジェクトを開くと,この人形シェーダーの一行にエラーが出てしまい。動作しなくなっていることがわかりました
たった一行の問題なので,なんとか自力で修正できないものか? という話です

エラーが出るのは,NINGYOU_INC.cgincファイルの,以下の行です
float attenuation = saturate(LIGHT_ATTENUATION( i ));

この LIGHT_ATTENUATIONマクロが削除されてしまったことが原因です
マクロならそのまま残しとけやボヶェと思うのは私だけでしょうか?(´・ω・`)
しかもUnityCG.cgincのマニュアルがありません。説明しろやボ(ry

海外掲示板を見ると,UNITY_LIGHT_ATTENUATIONになったらしい事がわかります
ただし,引数が異なり,第三引数がわかりません
UNITY_LIGHT_ATTENUATION(attenuation, i, 『ここに書く内容がわからない』);

マニュアルも無いので,世界中のシェーダーソースを手当たり次第に眺めていくと言う,自前ディープラーニングをした結果
頂点シェーダーからワールド座標のベクトルを引き回して来て突っ込まばいいのだろうという結論に至りました(合っているかどうかは不明。なにせマニュアルが無いので)

恐らく vert内にある,worldPosが演算内容的にそうだろうと予想
この内容を引き回す為に,struct v2fに変数を追加します
なぜか2つあるのですが,
・上側
float3 worldPosition : TEXCOORD6; //Unity2018対応
・下側
float3 worldPosition : TEXCOORD8; //Unity2018対応(未検証)
をそれぞれ追記します。この下側は未検証です

で,vertメソッド内に
o.worldPosition = worldPos; //Unity2018対応
を追記します

最後に,この引き回した値を使って,LIGHT_ATTENUATIONをUNITY_LIGHT_ATTENUATIONに置き換えます
// float attenuation = saturate(LIGHT_ATTENUATION( i )); //Unity2018対応
UNITY_LIGHT_ATTENUATION(attenuation, i, i.worldPosition); //Unity2018対応
attenuation=saturate(attenuation); //Unity2018対応

これで一応Unity2018.1で動作を確認しました(他にも色々問題があって2017.4に戻しましたが)


●NINGYOU_INC.cginc変更箇所まとめ
変更する箇所の前後数行を書いていきます
//Unity2018対応 とある行を修正して下さい

・構造体変更箇所
#ifndef BUMP_SET
struct v2f
{
~~省略~~
float3 lightDir : TEXCOORD5;
float3 worldPosition : TEXCOORD6; //Unity2018対応
};
#else
sampler2D _BumpMap;
struct v2f
{
~~省略~~
float3 binormal : TEXCOORD7;
float3 worldPosition : TEXCOORD8; //Unity2018対応(未検証)
};
#endif

・頂点シェーダー変更箇所
#ifndef BUMP_SET
v2f vert( appdata_base v )
#else
v2f vert( appdata_tan v )
#endif
{
~~省略~~
float4 worldPos =  mul( unity_ObjectToWorld, v.vertex );
o.eyeDir = normalize( _WorldSpaceCameraPos - worldPos );
o.lightDir = WorldSpaceLightDir( v.vertex );

o.worldPosition = worldPos; //Unity2018対応

・フラグメントシェーダー変更箇所
float4 frag( v2f i ) : COLOR
{
~~省略~~
float3 shadowColor = _ShadowColor.rgb * texcol2.rgb;
// float attenuation = saturate(LIGHT_ATTENUATION( i )); //Unity2018対応
UNITY_LIGHT_ATTENUATION(attenuation, i, i.worldPosition); //Unity2018対応
attenuation=saturate(attenuation); //Unity2018対応
float sint = pow(saturate(dot(reflect(-ltDir, n), i.eyeDir)), _Sharpness);

なぜか,ほとんど一発で審査が通ってしまったので(審査落ちしましたネタにするつもりだったw)
カップメンクイのiOS版が配布されました

Appストアで『カップメンクイ』や『かっぷめんくい』で検索すると出てきます

↓直リンクはココです。
iOS 9.0以降の iPhone,iPad,iPod Touchで動きます


ここは開発ブログなので,カメラアプリの審査時の注意点を書いておきます

○カメラ使用許諾のダイアログに,正しい理由が書かれていなければいけない
具体的に言うと,Unity設定の話です

Unityのメニュー→Edit→Project Settings→Playerを開いて
Camera Usage Descriptionのところにカメラを使う理由をきちんと書く
ちなみに,日本語のみでも通りました。何と書いたかは各自カップメンクイをダウンロードして確認して下さい('-'*)

○カメラで使用する画像が必要
読み込ませるバーコード画像を用意する必要がありました
アメリカに日本のカップ麺は無いだろうしw
審査提出時に,添付しておく欄があります(ログイン情報などを書く下にね)

色々と使い勝手の悪い所を修正しました

バーコードやタイマーを入力する時に,数値モードにいちいち切り替えるのが面倒臭かったのですが
インプットボックスの Inspector→Input Field (Script)→Content Typeを Decimal Numberにすれば数値入力パッド表示になりました

バーコード読み込みを起動させると,キャンセル事ができない問題の対処をしました
全体にパネルをかぶせて,そこを2回タッチするとキャンセルされます
1回だけだと,ボタン押した時にうっかりもう1回触れていて,バーコードリーダー起動しねぇ! 状態に自分が鳴ったので,2回にしましたw

あと 50ぐらいのカップ麺データを追加しました


Playストアで『カップメンクイ』や『カップめん』とかで検索すると出てきます

↓直リンクはココです。PCでもページ自体は見れます(PC版は作っていないので)

ただ VR用ゲームを作る! と言うだけの話であれば,もう何年も前に他の人がやってるので,そっちを見た方が早いです('-'*)
今回,制作中のゲームを Goに対応した時のメモがこれです

Unity 2017.4.2f2での話です
バージョンによって,表記が XRでは無く VRだったりするみたいです

●ビルドを VR対応に設定する
1.メニューの Edit→Project Settings→Playerを選択
Inspectorの タブを Settings for Androidにする(というか,ビルドのPlatformがAndroidね)
XR Settingsを選択
2.Virtual Reality Supportedにチェックを入れる
3.右下の+をクリックして,Oculusを追加する
ここに Noneも追加すると,VRボタンなどを実装してそれを押すと VRモードになる。という対応もできるそうです

○その他の Oculus Go用設定
Other Settingsを選択

・Rendering
Color Space:Linear (の方がいいらしいです)
Auto Graphics APIのチェックを外して,OpenGLES3だけに設定する(Vulkanはまだ検証していません)
Require ES3.1:入れる(GoのGPUはGLES3.2対応だから)
Require ES3.1+AEP:入れる(同上)
Multithreaded Rendering:必ず外す(やってみたら動かなかった)
Static Batching:入れる
Dynamic Batching:入れる
GPU Skinning:入れる(VR用の設定です)
Graphics Job (Experimental):入れる
Protect Graphics Memory:外す(この設定の意味わからんから)

・Identification
Minimum API Level:Android 4.4 'Kit Kat' (API level 19) (これ以降に設定しろと警告が出たから)
Target API Level:Auto

・Configuration
特に問題が無いのであれば,.NET 4.6に設定した方が良いです
Device Filter:ARMv7 (x86機でもこれで動いていたので)

●クオリティを Forwardの MSAAをオンに設定する
Goはそうした方が良いらしいです

・MSAA(アンチエイリアシング)をオンにする設定
メニューの Editor→Project Settings→Quality
※Add Quality Levelで,StandaloneVRなどを追加して,専用設定を作る方が良いかと思います
Anti Aliasing:2x Multi Sampling

余談ですが,VSyncはオフにした方が首を動かした時の追従がスムーズなようでした。絶対常時60fps(72fps)に自信がある人以外はオフにした方が良いでしょう

・カメラの MSAAをオンにする
シーン上のカメラ設定で,Allow MSAAにチェックを入れる

●レンダーモードを Forwardに設定する
シーン上のカメラ設定で,Rendering Pathを Forwardに設定する


この設定で VR対応になったはずです


●ビルドしてインストールする
普通にメニュー File→Build Settingsで Build Settings画面を開いて,Buildボタンを押すだけ

Dosコマンドでインストール
adb install -r test.apk

コンソールログも見ることができます
adb logcat

○VR上で起動
Goを装着して,左下のライブラリでトリガーを引く
左上のマイアプリの下にある提供元不明でトリガーを引く
正面の1/9と表示されている左のボタンでトリガーを引いて,最終ページを表示
そこにインストールしたアプリがあるはずです

○アプリ終了
ホームボタンを押して,停止でトリガーを引く

○アプリがフリーズした
電源ボタンを長押しするとリセットできます

○音がうるさい
電源ボタンの左にあるのが音量ボタンです

私が他のハードで知りたいやつだから,Go実機で取得した値を貼っておく

operatingSystem : Android OS 7.1.2 / API-25 (N2G48H/271300090200004)
processorType : ARMv7 VFPv3 NEON
processorCount : 4
systemMemorySize : 2771
graphicsMemorySize : 1024
graphicsDeviceName : Adreno (TM) 530
graphicsDeviceVendor : Qualcomm
graphicsDeviceID : 0
graphicsDeviceVendorID : 0
graphicsDeviceVersion : OpenGL ES 3.2 V@283.0 (GIT@e86a0cc, I83a540a04a) (Date:12/21/17)
graphicsShaderLevel : 50
graphicsPixelFillrate : -1
supportsShadows : True
supportsRenderTextures : True
supportsImageEffects : True
deviceUniqueIdentifier : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
deviceModel : Oculus Pacific
maxTextureSize : 16384
Now display : 2560 x 1440 @ 72Hz
Screen Width : 2560
Screen Height : 1440
Screen.dpi : 480

*2018/05現在の最新ファームウェアにて
*SystemInfo.このプロパティね
*deviceUniqueIdentifierはこれだけのケタ数があるという参考

↑このページのトップヘ