yoship1639 / Player2VRM

クラフトピアでプレイヤーモデルを任意のVRMモデルに差し替えるMOD
MIT License
101 stars 10 forks source link

プレイヤーによって複数VRMアバターを使い分けできるように #14

Closed yoship1639 closed 3 years ago

frakiaongithub commented 3 years ago

すでに御存知でしたら無視してください。 プレイヤー名を取得して名前でアバターを切り替える試作を行うのに次のようなコードでプレイヤー名を取得しました。 コードの配置場所はcharaChangeSteupのパッチコードの部分です。 これを使ってキャラ選択によってアバターが変わるのを確認したものが次の動画です。 https://www.nicovideo.jp/watch/sm37586172 実際のところマルチプレイでも動作するかは不明なのですが、OcPlMng にgetNetPlIdがあるので現状はOcPlでマルチプレイヤーも処理しているのでいけるかなと予想しています。

        OcPlMng plmng = null;
        OcNetMng ntmng = null;
        var gameObjects = (GameObject[])UnityEngine.Object.FindObjectsOfType(typeof(GameObject));
        foreach (var obj in gameObjects)
        {
            if (plmng == null)
            {
                plmng = obj.GetComponent<OcPlMng>();
            }
            if (ntmng == null)
            {
                ntmng = obj.GetComponent<OcNetMng>();
            }
        }

        string playername = null;
        if(ntmng != null && plmng != null)
        {
            int netid = plmng.getNetPlId(__instance);
            if (netid == -1)
            {
                playername = __instance.CharaMakeData.Name;
            }
            else {
                playername = ntmng.getPlName(netid);
            }
        }
yoship1639 commented 3 years ago

@frakiaongithub 助言ありがとうございます!存じ上げていますが別の対応をしているので、こちらの実装は後回しにしています。 もしよろしかったらプルリクを投げていただければこちらの実装の手間が省けるのでお気軽にどうぞ!

frakiaongithub commented 3 years ago

お返事ありがとうございます。 1.2.1ベースでプレイヤーごとの設定ファイルを指定できるように修正したものを作ったのですが、gitの使い方が詳しくないのでプルリクエストの方法がわからないので変更したファイルと設定のサンプルをアップします。 SampleSettingsに設定のサンプルが入っています。 avators.txt にプレイヤー名と設定ファイルの対応を記述しています。

frakia20200929.zip

frakiaongithub commented 3 years ago

残念ながらマルチプレイ環境を持っていないのでマルチプレイした場合に他人のアバターの表示がさし変わるかについては確認できていません。

yoship1639 commented 3 years ago

@frakiaongithub ソースと設定サンプルありがとうございます!こちらで少し確認しましたが概ね問題なさそうです。 マルチで使用してみると元の頭が残るようですが、少し改変加えて、マルチの設定の反映等確認できればそのままマルチプレイ(α)としてver1.3.0で公開できそうです。

こちらの実装の手間が省けました。ありがとうございます!

frakiaongithub commented 3 years ago

致命的な問題ではないのですが設定パラメータを読むたびにファイルを読んでいたのが気になったので初回参照のときに変数に積むようにSettings.csを改修してみました。 Settings.zip

frakiaongithub commented 3 years ago

プレイヤー名取れない場合対策.zip さっきdiscordで話していた件のファイルです。 1.3.3ベースなのでそのまま適用できるはずです。 変更の概要は以下の通りです。

  1. OcPlVRMでプレイヤー名が取れなかった場合は遅延実行オブジェクトを作る。
  2. OcPlHeadPrefabSettingVRM側はVRMなしと判断してしまうのでOcPlVRM側でも生首を消す。
yoship1639 commented 3 years ago

@frakiaongithub 動確しました!少し修正が必要でしたが、マルチプレイで安定した表示が確認できたので、ver1.3.4に組み込みました。 設定のキャッシュ化もありがとうございます。