Cubeの位置・回転・サイズとマテリアルの色を自動同期するサンプルの解説

同期とは?

VRChatでワールドを巡っていると「このミラーはローカルだからこのボタンを押して表示してね」とか「これはグローバルオブジェクトだね」というやり取りがあると思います。グローバルオブジェクトは表示・非表示の値をワールドにいるユーザー全員に共有している処理があるため全員が同じ見え方になるようになっています。この処理を同期と言います。

Udonスクリプト作成

サンプルのSyscPickupColorをU#に書き直し

スクリプトで同期する値はマテリアルの色だけで、位置・回転・大きさは後述の方法で同期します。

Udon Graph

U#

同期したい値に[UdonSynced]属性を付与するだけです。

public class SyscPickupColor : UdonSharpBehaviour
{
    public Color fromColor = Color.black;

    public Renderer targetRenderer;

    public Color toColor = Color.black;

    [UdonSynced]
    private Color syncColor = Color.black;

    public VRC_Pickup pickup;

    void Update()
    {
        targetRenderer.material.SetColor("_Color", syncColor);

        // オブジェクトのオーナーが掴んでいる状態に色を変化させる。
        if (Networking.IsOwner(pickup.gameObject) && pickup.IsHeld)
        {
            syncColor = Color.LerpUnclamped(fromColor, toColor, Mathf.Sin(Time.time));
        }
    }

    public override void OnOwnershipTransferred(VRCPlayerApi player)
    {
        Debug.Log($"new owner is {player.playerId}");
    }
}

シーン作成

VRC Object Syncコンポーネントを追加すると位置・回転・サイズ(Transform)と物理特性(Rigidbody)が自動同期されます。同期されるタイミングは指定できませんが、手軽に同期処理を作成できます。

補足

[UdonSynced]という属性には付加情報があり、[UdonSynced(UdonSyncMode.***)]という感じで同期設定を変更できます。

UdonSyncMode.NotSynced ・・・同期しない
UdonSyncMode.None ・・・・・補間なし
UdonSyncMode.Linear ・・・・・線形補間
UdonSyncMode.Smooth ・・・・スムース補間

デバッグログの確認方法

ゲーム中に「RShift + @ + 3」を押すとログ表示画面が出現するので、Debug.Logによるログ書き込みはここで確認できます。

自動同期を作成する

投稿ナビゲーション


コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)