simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

URP MToon シェーダーで日陰で暗くならない問題を解決できている

次のコード、修正前は false を返していましたが、true を返すように書き換えました

// EXPERIMENTAL
inline bool MToon_IsPbrCorrectOn()
{
    return true;
}

修正前の課題感(日陰で暗くならない?)

修正後の改善案(日陰になじんでくれるようになりました)

まだ有効化前の機能の様子?
でも、いい感じです

Unityネットワークゲーム化:PhotonFusion2 共有モード開始手順

基本的にはドキュメント通り
https://doc.photonengine.com/ja-jp/fusion/current/tutorials/shared-mode-basics/1-getting-started

Prototype Network Start にて、Start Mode を User Interface から Automatic に変更する
Auto Start As を Shared に指定していることを確認

Fusion Bootstrap Debug GUI は非アクティブ化しておく

また Prototype Runner には Network Scene Manager Default と Network Object Provider Default のコンポーネントを追加しておくと
ランタイム時の警告ログを消すことが出来る
ついでに Player Count もデフォルトは 10 なので、ここはアプリ設定の最大と合わせておこう

最後に、Tools > Fusion > Network Project Config を開き Client Tick Rate を 32 に設定する
以上でランタイム時の警告ログを消すことが出来る

Prototype Runner の Network Events に、次のような関数を登録

    public class NetworkEvents : MonoBehaviour
    {
        public void PlayerJoined(NetworkRunner runner, PlayerRef playerRef)
		{
			if (playerRef == runner.LocalPlayer)
			{
				Debug.Log("Player Joined: " + playerRef.PlayerId);
			}

ゲームを起動して、上記のログだけ流れたら成功

情報ログが多くて邪魔な場合があったので
FusionUnityLogger ファイルを見つけ出し

      switch (logType) {
        case LogType.Error:
          Debug.LogError(fullMessage, IsInMainThread ? obj : null);
          break;
        case LogType.Warn:
          Debug.LogWarning(fullMessage, IsInMainThread ? obj : null);
          break;
        default:
          // Debug.Log(fullMessage, IsInMainThread ? obj : null);
          break;
      }

default のログ出力をコメントアウトしておくと、黙らせることができた(Info ログスキップ設定ないのか? 調べてみてもわからなかった)

Built-in シェーダーで Texture2DArray を使ってみた

unrecognized identifier 'sampler2DArray' で悩んだのだけど
次の書き方で一応 Texture2DArray は機能したので、メモします

Shader "Unlit/NewUnlitShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _BaseColor("Base Color", 2DArray) = "" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            Texture2DArray _BaseColor;
            SamplerState sampler_BaseColor;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 baseColorTex = _BaseColor.Sample(sampler_BaseColor, float3(i.uv, 0));
                return baseColorTex;
            }
            ENDCG
        }
    }
}

Built-inのポストエフェクトでキューブマップをサンプリング

解像度を与えておき、uv 値の 0~1 の値を使って
ピクセルにおけるカメラ位置から発せられる視線ベクトル viewDir を求めます
あとはキューブマップのサンプル処理につなげるだけです

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                half2 uvBase = i.uv - 0.5h;
                // Edge Screen Position
                float2 esp = float2(uvBase.x * _ScreenEdge.x, uvBase.y * _ScreenEdge.y);
                // ピクセルの視線ベクトル
                float3 viewDir = normalize(_CameraRight * esp.x + _CameraUp * esp.y + _CameraForward);
                // キューブマップ色
                half4 color = UNITY_SAMPLE_TEXCUBE(_CubeMap1, viewDir);
                // ブレンドした背景色に溶けるようにFogをかける
                return color;
            }

ゲームで使わなくなったので消すファイルなのですが
あとで使いたくなることもあるかもしれないので、記録しておきますね
しばらく動いてたので、ご参考にどうぞ

Unity 便利アセット Joystick Pack マルチタップに改造

https://assetstore.unity.com/packages/tools/input-management/joystick-pack-107631?locale=ja-JP

そう、すばらしいアセットと多くの方が賞賛してる
ただし、二つ配置すると、とたんにドラッグ操作が行えなくなり
使い物にならない

今回マルチタップ化できたので、改造方法を記録しておきます

編集するファイルは Base の
Assets\Joystick Pack\Scripts\Base\Joystick.cs
ファイルのみ

まず IDragHandler インタフェース継承をやめさせます
OnDrag イベントハンドラの引数の OnDrag(PointerEventData eventData) は OnDrag(Vector2 touchPosition) に書き換え
eventData.position を touchPosition に差し替えておきます

既存の利用箇所 OnPointerDown での呼び出しをつぎのようにし
OnDrag(eventData.position);

まずはビルドを通します。

次に OnPointerDown にて
this.pointerId = eventData.pointerId;
こんな感じで pointerId (Touch の fingerId) を記録しておき

	void Update()
	{
		foreach (var touch in Input.touches)
		{
			if (touch.fingerId == this.pointerId)
			{
				OnDrag(touch.position);
				break;
			}
		}
	}

Update にて fingerId が一致する touch の position を OnDrag に流します
OnPointerUp で this.pointerId を -1 などに初期化することで
既存の OnDrag の機能を残しつつ、複数の fingerId を識別し、マルチタップに対応した Joystick が完成します

実機で確認して動作を確認できたため
これにて完成と思います

エディタ実行では touches は得られないですが
何かエミュレートする案を適用して置くのも良いかもしれませんね

Unity2022.3対応VRChatアバターアップロード手順

VCC→詳細 【コラム】VCCにこれは入れておけ! アバター改変の便利ツール紹介 | メタカル最前線
をお手元に準備したら

テンプレートは Avatars 2022 を選択

Manage Packages から

を選択します

ここまでセットしたらプロジェクトを開きます
VRChat > Show Control Panel メニューから VRChat のログイン画面を開いて
ログインしておきます。

まずはアバターをインポートします。

今回例で使用するのはライムです。(例の半額セールだったので…)
komado.booth.pm

シーンに Lime Prefab を配置したら、メニューの Tools > Gesture Manager Emulator を選択
次の通りシーン内に Gesture Manager を追加します

これまたセール中のクリスマス服
rihyaco.booth.pm
を導入します(衣装Prefabをアバタールートオブジェクト直下に配置)

衣装 Prefab のコンテキストメニューの Modular Avatar > SetupOutfit を選択して衣装合わせをします。

ハイヒール用の衣装のため Body_Base の Blend Shapes から Foot_HighHeel の値を 100 に設定します。

備え付けの衣装が重なるものは取り払うか、着せ替え用の Prefab に差し替えておきます。

ひとまずこれだけで、衣装変えアバターで VRChat を楽しむことができます。

写真

続いて、シンプル眼鏡ギミックを導入します。

まずは無料の丸眼鏡アセット
0123.booth.pm
をインポートします

続いてシンプル眼鏡ギミック
simplestar-game.booth.pm
を購入してインポートします


眼鏡を装着しました
導入手順は以上です

実際に動かしてみた結果www.youtube.com

はじめて Unity 2022.3 で VRChat アバターアップロードしてみましたが
手順はこんな感じで良いでしょうか?
慣れないもので、覚えやすいように記録してみました。

もし VRChat まだやってない人いましたら、こうやってアバターアップロードしているのかと
参考になれば良いなと思います。

他人に渡せるギフトコンテナ「SimpleGiftContainer」【VRChat アバターギミック】の導入手順

なんでも掴んでワールドに配置できるよ(特にすごいのが、フレンドもツリーを掴めちゃう!)

前回の記事で紹介した
他人に渡せるギフトコンテナ「SimpleGiftContainer」【VRChat アバターギミック】booth.pm

こちらを VRChat アバターに組み込む手順を解説します

自分のアバターを用意・アップロード

この記事を書いている今日、セール中でして、大人気アバターが半額という
ほんとにすごい時期なので、買ってみました

【11/24-26限定SALE】『カリン』-Karin-【オリジナル3Dモデル】komado.booth.pm

手順は以前紹介したこちらの記事の通りで、アバター作成部分を、インポートした prefab のシーン配置に置き換えれば完成です。
simplestar-tech.hatenablog.com

まずはカリンちゃんのアバターでワールドを周遊できるようになりました
(Gesture Manger で簡易動作チェックしている様子)

ギミックの導入

他人に渡せるギフトコンテナ「SimpleGiftContainer」【VRChat アバターギミック】booth.pm
を入手して、パッケージ内の SimpleGiftContainer.unitypackage をプロジェクトにインポート

次の画像のように Prefab をアバター内直下に配置します

以上です。

動作確認

Gesture Manager を使ってメニュー操作をすると Gift という項目が選べるようになります
その下の Item00, Item01, Item02 のトグルを有効にすると、プレゼントボックスがプレイヤー正面に現れます

フレンドが掴んで移動できるオブジェクトとなっています
あとはプレゼントボックスモデルをツリーに置き換えてみたりすると、冒頭の画像のようなことができます。