//Add a child object to the doppleganger public void AddChild(GameObject gameObject) { GameObject newObject = new GameObject("NewDopplegangerPart"); newObject.transform.parent = PortalUtils.FindAnalogousTransform(gameObject.transform.parent, root, doppleganger.transform, true); CloneNonVisuals(newObject, gameObject, newObject.transform.parent); }
public void Initialize(Teleportable teleportable) { this.teleportable = teleportable; originalParent = transform.parent; try { otherTransform = PortalUtils.FindAnalogousTransform(transform, teleportable.root, teleportable.doppleganger.transform, true); otherTransformParent = otherTransform.parent; } catch (System.NullReferenceException e) { Debug.LogError("Teleportablescript on " + name + "had a problem:" + e.Message); } originalPosition = transform.localPosition; originalRotation = transform.localRotation; originalScale = transform.localScale; }
// IEnumerator void SpawnDoppleganger() { //Wait for any initializing behaviors //yield return new WaitForSeconds(2); //Spawns the doppleganger game object doppleganger = new GameObject("doppleganger"); //yield return new WaitForEndOfFrame(); doppleganger = CloneNonVisuals(doppleganger, root.gameObject, null); //doppleganger.transform.parent = transform.parent; //yield return new WaitForEndOfFrame(); //Transfers bone references to doppleganger bones if (dSkinnedRendList.Count > 0) { dSkinnedRenderers = (SkinnedMeshRenderer[])dSkinnedRendList.ToArray(typeof(SkinnedMeshRenderer)); //Copies over correct bones and sets the root bone for (int i = 0; i < dSkinnedRenderers.Length; i++) { SkinnedMeshRenderer rend = dSkinnedRenderers[i]; Transform oRootBone = rend.rootBone; Transform dRootBone = PortalUtils.FindAnalogousTransform(oRootBone, root, doppleganger.transform); Transform[] originalBones; Transform[] duplicateBones; originalBones = rend.bones; duplicateBones = new Transform[rend.bones.Length]; for (int u = 0; u < rend.bones.Length; u++) { duplicateBones[u] = PortalUtils.FindAnalogousTransform(rend.bones[u], root, doppleganger.transform); } rend.rootBone = dRootBone; rend.bones = duplicateBones; } } originalTransforms = (Transform[])oTransformList.ToArray(typeof(Transform)); duplicateTransforms = (Transform[])dTransformList.ToArray(typeof(Transform)); //Exchanges material for cullable oTeleportRends = (Renderer[])oRendererList.ToArray(typeof(Renderer)); dTeleportRends = (Renderer[])dRendererList.ToArray(typeof(Renderer)); if (replacementMaterial) { //yield return new WaitForEndOfFrame(); foreach (Renderer renderer in oTeleportRends) { if (renderer.GetType() == typeof(ParticleSystemRenderer)) { continue; } Material[] newMats = new Material[renderer.materials.Length]; for (int i = 0; i < renderer.materials.Length; i++) { Material oNewMat = new Material(replacementMaterial); Material m = renderer.materials[i]; oNewMat.CopyPropertiesFromMaterial(m); newMats[i] = oNewMat; } renderer.materials = newMats; } //yield return new WaitForEndOfFrame(); foreach (Renderer renderer in dTeleportRends) { Material[] newMats = new Material[renderer.materials.Length]; if (renderer.GetType() == typeof(ParticleSystemRenderer)) { continue; } for (int i = 0; i < renderer.materials.Length; i++) { Material dNewMat = new Material(replacementMaterial); Material m = renderer.materials[i]; dNewMat.CopyPropertiesFromMaterial(m); newMats[i] = dNewMat; } renderer.materials = newMats; } } //Saves teleportable scripts to array teleportableScripts = (TeleportableScript[])teleportableScriptList.ToArray(typeof(TeleportableScript)); //Initializes teleportable scripts foreach (TeleportableScript t in teleportableScripts) { t.Initialize(this); } ResetDoppleganger(); initialized = true; doppleganger.name = doppleganger.name + " (Doppleganger)"; }
public void RemoveChild(GameObject gameObject) { Destroy(PortalUtils.FindAnalogousTransform(gameObject.transform, root, doppleganger.transform, false).gameObject); }