public void Setup(SyncObject syncObject) { obj = syncObject; meshFilter = gameObject.AddComponent <MeshFilter>(); meshRenderer = gameObject.AddComponent <MeshRenderer>(); obj.RegisterFieldUpdateHandler("vertices", HandleUpdate); obj.RegisterFieldUpdateHandler("indices", HandleUpdate); HandleUpdate(); }
public void Setup(SyncObject syncObject) { obj = syncObject; skyboxMaterial = new Material(Shader.Find("Skybox/Panoramic")); obj.RegisterFieldUpdateHandler("skyboxTexture", HandleSkyboxTextureUpdate); obj.RegisterFieldUpdateHandler("skyboxType", HandleUpdate); HandleUpdate(); HandleSkyboxTextureUpdate(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
// 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()); } }