Exemplo n.º 1
0
    public void Setup(SyncObject syncObject)
    {
        obj = syncObject;

        meshFilter   = gameObject.AddComponent <MeshFilter>();
        meshRenderer = gameObject.AddComponent <MeshRenderer>();

        obj.RegisterFieldUpdateHandler("vertices", HandleUpdate);
        obj.RegisterFieldUpdateHandler("indices", HandleUpdate);

        HandleUpdate();
    }
Exemplo n.º 2
0
    public void Setup(SyncObject syncObject)
    {
        obj = syncObject;

        skyboxMaterial = new Material(Shader.Find("Skybox/Panoramic"));

        obj.RegisterFieldUpdateHandler("skyboxTexture", HandleSkyboxTextureUpdate);
        obj.RegisterFieldUpdateHandler("skyboxType", HandleUpdate);

        HandleUpdate();
        HandleSkyboxTextureUpdate();
    }
Exemplo n.º 3
0
    public void Setup(SyncObject syncObject)
    {
        obj = syncObject;

        lineRenderer = gameObject.AddComponent <LineRenderer>();
        lineRenderer.useWorldSpace = false; // points are specified in local coordinate

        obj.RegisterFieldUpdateHandler("points", HandlePointsUpdate);
        obj.RegisterFieldUpdateHandler("width", HandleUpdate);

        HandlePointsUpdate();
        HandleUpdate();
    }
Exemplo n.º 4
0
    public void Setup(SyncObject obj)
    {
        this.obj = obj;

        lastPosition = transform.position;
        lastRotation = transform.rotation;

        obj.BeforeSync += OnBeforeSync;
        obj.RegisterFieldUpdateHandler("velocity", HandleUpdate);
        obj.RegisterFieldUpdateHandler("angularVelocity", HandleUpdate);

        HandleUpdate();
    }
Exemplo n.º 5
0
    public void Setup(SyncObject obj)
    {
        this.obj          = obj;
        textMesh          = gameObject.AddComponent <TextMesh>();
        textMesh.richText = false;
        // Replace shader to Z-test enabled one (slightly modified version of standard font shader)
        // See: https://kan-kikuchi.hatenablog.com/entry/TextMesh_Transparent
        GetComponent <MeshRenderer>().material.shader = Resources.Load <Shader>("Shaders/Font_ZTest");

        obj.RegisterFieldUpdateHandler("text", HandleUpdate);
        obj.RegisterFieldUpdateHandler("fontSize", HandleUpdate);
        obj.RegisterFieldUpdateHandler("useRichText", HandleUpdate);
        HandleUpdate();
    }
Exemplo n.º 6
0
    public void Setup(SyncObject obj)
    {
        this.obj = obj;
        material = new PhysicMaterial();

        if (obj.HasTag("cube"))
        {
            var collider = gameObject.AddComponent <BoxCollider>();
            collider.sharedMaterial = material;
            RegisterCollider(collider);
        }
        else if (obj.HasTag("sphere"))
        {
            var collider = gameObject.AddComponent <SphereCollider>();
            collider.sharedMaterial = material;
            RegisterCollider(collider);
        }
        else if (obj.HasTag("model"))
        {
            GetComponent <ModelSync>().LoadComplete += AddMeshCollidersForModel;
        }
        else if (obj.HasTag("plane") || obj.HasTag("cylinder"))
        {
            // For primitives that use MeshCollider
            var collider = gameObject.AddComponent <MeshCollider>();
            collider.sharedMaterial = material;
            RegisterCollider(collider);
        }
        else if (GetComponent <Collider>() != null)
        {
            // If the object already has a Unity Collider component (e.g. hands, player avatar)
            // Note:
            //  At this time, the default Collider created by CreatePrimitive may not destroyed.
            //  To ignore this collider, "GetComponent<Collider() != null" has to be the last of else-if.
            var collider = GetComponent <Collider>();
            collider.sharedMaterial = material;
            RegisterCollider(collider);
        }

        // TODO: support mesh tag

        obj.RegisterFieldUpdateHandler("friction", HandleUpdate);
        obj.RegisterFieldUpdateHandler("restitution", HandleUpdate);
        obj.RegisterFieldUpdateHandler("isTangible", HandleUpdate);
        obj.RegisterFieldUpdateHandler("isStatic", HandleUpdate);

        HandleUpdate();
    }
Exemplo n.º 7
0
    public void Setup(SyncObject obj)
    {
        this.obj = obj;

        audioSource              = gameObject.AddComponent <AudioSource>();
        audioSource.spatialize   = true;
        audioSource.spatialBlend = 1.0f;

        obj.RegisterFieldUpdateHandler("audioFile", HandleFileUpdate);
        obj.RegisterFieldUpdateHandler("audioVolume", HandleUpdate);
        obj.RegisterFieldUpdateHandler("audioPlaying", HandleUpdate);
        obj.RegisterFieldUpdateHandler("audioLoop", HandleUpdate);

        obj.BeforeSync += OnBeforeSync;

        HandleFileUpdate();
        HandleUpdate();
    }
Exemplo n.º 8
0
    public void Setup(SyncObject obj)
    {
        this.obj = obj;
        if (GetComponent <Rigidbody>() == null)
        {
            gameObject.AddComponent <Rigidbody>();
        }
        var rb = GetComponent <Rigidbody>();

        rb.isKinematic = false;

        obj.BeforeSync += OnBeforeSync;
        obj.RegisterFieldUpdateHandler("mass", HandleMassUpdate);
        obj.RegisterFieldUpdateHandler("velocity", HandleUpdate);
        obj.RegisterFieldUpdateHandler("angularVelocity", HandleUpdate);

        obj.SetField("isTangible", new Primitive <int>(1));  // physics object is always tangible

        HandleMassUpdate();
        HandleUpdate();
    }
Exemplo n.º 9
0
    public void Setup(SyncObject obj)
    {
        this.obj    = obj;
        theRenderer = GetComponent <Renderer>();
        UpdateBaseMaterial();

        obj.RegisterFieldUpdateHandler("color", HandleUpdate);
        obj.RegisterFieldUpdateHandler("alpha", HandleUpdate);
        obj.RegisterFieldUpdateHandler("metallic", HandleUpdate);
        obj.RegisterFieldUpdateHandler("smoothness", HandleUpdate);
        obj.RegisterFieldUpdateHandler("texture", HandleTextureUpdate);
        obj.RegisterFieldUpdateHandler("shader", HandleShaderUpdate);
        obj.RegisterFieldUpdateHandler("renderMode", HandleRenderModeUpdate);

        HandleUpdate();
        HandleTextureUpdate();
        HandleShaderUpdate();
        HandleRenderModeUpdate();
    }
Exemplo n.º 10
0
    // Called by ObjectSync when become ready
    async void OnSyncReady()
    {
        Debug.Log("OnSyncReady");

        SyncObject obj  = GetComponent <ObjectSync>().SyncObject;
        SyncNode   node = GetComponent <ObjectSync>().Node;

        obj.BeforeSync += OnBeforeSync;
        obj.AfterSync  += OnAfterSync;
        obj.RegisterFieldUpdateHandler("leftHand", OnLeftHandUpdated);
        obj.RegisterFieldUpdateHandler("rightHand", OnRightHandUpdated);
        obj.RegisterFieldUpdateHandler("mouseGrabber", OnMouseGrabberUpdated);

        OnLeftHandUpdated();
        OnRightHandUpdated();
        OnMouseGrabberUpdated();

        Blob vrmBlob;

        if (GetComponent <ObjectSync>().IsOriginal)
        {
            byte[] vrmData = File.ReadAllBytes(Settings.Instance.AvatarPath);
            // Use MIME type for GLTF binary https://www.iana.org/assignments/media-types/model/gltf-binary
            vrmBlob = new Blob(vrmData, "model/gltf-binary");
            BlobHandle vrmHandle = vrmBlob.GenerateHandle();
            node.WriteBlob(vrmHandle, vrmBlob);
            obj.SetField("vrm", vrmHandle);
        }
        else
        {
            while (!obj.HasField("vrm") || !(obj.GetField("vrm") is BlobHandle))
            {
                obj.WriteDebugLog("PlayerAvatar", "Field vrm not ready");
                await UniTask.WaitForFixedUpdate();
            }
            BlobHandle blobHandle = (BlobHandle)obj.GetField("vrm");
            vrmBlob = await node.ReadBlob(blobHandle);
        }

        // Disable collision detection (and character control) during VRM load
        // When the avatar collides with something during creation,
        // it goes to wrong position (e.g. floating).
        // Note: CharacterController inherits Collider.
        //  (See https://docs.unity3d.com/2019.3/Documentation/ScriptReference/CharacterController.html )
        GetComponent <CharacterController>().enabled = false;

        // Load VRM from byte array
        // https://github.com/vrm-c/UniVRM/wiki/Runtime-import
        // https://qiita.com/sh_akira/items/8155e4b69107c2a7ede6
        ctx      = new VRMImporterContext();
        ctx.Root = new GameObject();    // VRM is loaded as a separate object
        ctx.ParseGlb(vrmBlob.Data);

        var meta = ctx.ReadMeta();

        obj.WriteLog("PlayerAvatar", $"Loading VRM {meta.Title} created by {meta.Author} ({meta.ContactInformation})");
        obj.WriteLog("PlayerAvatar", $"AllowedUser={meta.AllowedUser}, ViolentUsage={meta.ViolentUssage}");
        obj.WriteLog("PlayerAvatar", $"SexualUsage={meta.SexualUssage}, CommercialUsage={meta.CommercialUssage}");
        obj.WriteLog("PlayerAvatar", $"OtherPermissionUrl={meta.OtherPermissionUrl}");
        obj.WriteLog("PlayerAvatar", $"LicenseType={meta.LicenseType}");
        obj.WriteLog("PlayerAvatar", $"OtherLicenseUrl={meta.OtherLicenseUrl}");

        await ctx.LoadAsyncTask();

        ctx.EnableUpdateWhenOffscreen();
        ctx.ShowMeshes();

        // Enable collision (and character controller) again (see the disabling line above)
        GetComponent <CharacterController>().enabled = true;

        // Move VRM avatar inside this gameObject
        ctx.Root.transform.SetParent(transform);
        ctx.Root.transform.localPosition = Vector3.zero;
        ctx.Root.transform.localRotation = Quaternion.identity;

        GetComponent <Animator>().avatar = ctx.Root.GetComponent <Animator>().avatar;

        obj.WriteLog("PlayerAvatar", $"VRM loaded");

        if (GetComponent <ObjectSync>().IsOriginal)
        {
            // Set up first person view (do not display avatar of the player)
            //  https://vrm.dev/en/univrm/components/univrm_firstperson/
            //  https://vrm.dev/en/dev/univrm-0.xx/programming/univrm_use_firstperson/
            var fp = GetComponentInChildren <VRMFirstPerson>();
            fp.Setup();
            if (XRRig != null)
            {
                XRRig.transform.position = fp.FirstPersonBone.position + fp.FirstPersonBone.rotation * fp.FirstPersonOffset;
                XRRig.transform.rotation = transform.rotation;  // face forward
                // Do not render layer "VRMThirdPersonOnly" on first person camera
                xrCamera.cullingMask &= ~LayerMask.GetMask("VRMThirdPersonOnly");
                SetHeadShadow();
            }
            if (ThirdPersonCamera != null)
            {
                // Do not render layer "VRMFirstPersonOnly" on third person camera
                ThirdPersonCamera.cullingMask &= ~LayerMask.GetMask("VRMFirstPersonOnly");
            }

            // Left hand
            if (leftController.HasValue)
            {
                // If left hand device is present
                var leftId = await node.CreateObject();

                leftHandObj = node.Objects[leftId];
                leftHandObj.SetField("parent", obj.GetObjectRef());
                leftHandObj.SetField("tags", new Sequence(new IValue[] {
                    new Primitive <string>("constantVelocity"),
                    new Primitive <string>("collider")
                }));
                obj.SetField("leftHand", leftHandObj.GetObjectRef());
            }
            // Right hand
            if (rightController.HasValue)
            {
                // If right hand device is present
                var rightId = await node.CreateObject();

                rightHandObj = node.Objects[rightId];
                rightHandObj.SetField("parent", obj.GetObjectRef());
                rightHandObj.SetField("tags", new Sequence(new IValue[] {
                    new Primitive <string>("constantVelocity"),
                    new Primitive <string>("collider")
                }));
                obj.SetField("rightHand", rightHandObj.GetObjectRef());
            }
            // Mouse
            var mouseGrabberId = await node.CreateObject();

            mouseGrabberObj = node.Objects[mouseGrabberId];
            mouseGrabberObj.SetField("parent", obj.GetObjectRef());
            mouseGrabberObj.SetField("tags", new Sequence(new IValue[] {
                new Primitive <string>("constantVelocity"),
                new Primitive <string>("collider")
            }));
            obj.SetField("mouseGrabber", mouseGrabberObj.GetObjectRef());
        }
    }