simplestarの技術ブログ

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

Unity:Gamepad として認識しない HID コントローラを XBox Controller として認識させよう

7日間のトライアルで試しただけですが
reWASD
https://www.rewasd.com/
をインストールして、HID(human interface device)として Gamepad として認識されない Logitech のコントローラも
プリセットの Switch to Xbox 360 設定を選んで、有効化することで Xbox Controller として Unity が認識するようになりました

Switch to XBox 360

ゲームが Gamepad のみ対応してリリースされていて
どうしてもユーザーが Xbox Controller や Playstation のコントローラを持ってなくて、不満をぶつけてきたら
reWASD の存在を教えてあげましょう

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

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

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

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

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

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

実装メモ:
やっぱりまだ実験的なコードな様子
動的に WebGL で読み込んで表示すると、影の出方が壊れているのでいったんオフに

さらに、Shadow に関しては 1 を返すところ、 0.35 を返すのが無難(明るくなりすぎない)

inline half GetMToonLighting_Shadow(const UnityLighting lighting, const half dotNL)
{
    if (MToon_IsPbrCorrectOn())
    {
        return lighting.directLightAttenuation.x * step(0, dotNL);
    }

    if (MToon_IsForwardBasePass())
    {
        return 0.35; // ココ 1 を 0.35 にした
    }

追記2
indirectLight が明るすぎて、暗がりにいても光ってしまうので 0.5 のところを 0.1 にしました

UnityLighting GetUnityLighting(const Varyings input, const half3 normalWS)
{
    MTOON_LIGHT_DESCRIPTION(input, atten, lightDir, lightColor);

    if (MToon_IsForwardBasePass())
    {
        UnityLighting output;
        output.indirectLight = MToon_SampleSH(half3(normalWS));
        output.indirectLightEqualized = (MToon_SampleSH(half3(0, 1, 0)) + MToon_SampleSH(half3(0, -1, 0))) * 0.1; // ココ0.5 を 0.1 にした

これで一応、明るすぎず、メインライトの影響を受ける見た目になりました

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 まだやってない人いましたら、こうやってアバターアップロードしているのかと
参考になれば良いなと思います。