Tanoda
pb_Scene.cs
Go to the documentation of this file.
1using System;
2using UnityEngine;
3using System.Collections;
4using System.Collections.Generic;
5using System.Linq;
6using GILES.Interface;
7using Newtonsoft.Json;
9using JetBrains.Annotations;
11using UnityEngine.UI;
12#if !UNITY_WEBGL
13using Valve.VR.InteractionSystem;
14using System.IO;
15#endif
16
17namespace GILES
18{
23 [pb_JsonIgnore]
24 [RequireComponent(typeof(pb_MetaDataComponent))]
25 public class pb_Scene : pb_MonoBehaviourSingleton<pb_Scene>
26 {
27 #region Initialization & Singleton
28
29 protected override void Awake()
30 {
31 base.Awake();
32 this.name = "Level Editor SceneGraph Root";
33 }
34
35 IEnumerator Start()
36 {
37 pb_MetaDataComponent md = gameObject.GetComponent<pb_MetaDataComponent>();
38 if (md == null) md = gameObject.AddComponent<pb_MetaDataComponent>();
39 if (GameObject.Find("Iris asztal.Small"))
40 {
41 transform.SetParent(GameObject.Find("Iris asztal.Small").transform, true);
42 }
43
44 gameObject.AddComponent<StaticGO>();
45
46 yield return new WaitForSeconds(0.5f);
47 while (LoadingManager.instance.isLoading || LoadingManager.instance.MainLoading || !LoadingManager.instance.FilesLoaded)
48 {
49 yield return null;
50 }
51
53
54#if !UNITY_WEBGL
55 if (!SavedUser.instance.isEditor)
56 {
57 foreach (var rb in rigidList)
58 {
59 if (rb)
60 rb.isKinematic = false;
61 }
62 }
63#endif
64 }
65 #endregion
66
67 #region Members
68 internal static Vector3 rootLocalOffset = Vector3.zero;
69 private bool isEditingEnv, isEditingTools = false;
70 internal string currentLevelName = "";
71 private static List<Rigidbody> rigidList = new List<Rigidbody>();
72 public bool IsLoadingEnvNow = false;
73 #endregion
74
75 #region Delegate
76
81 public event Callback<GameObject> onObjectInstantiated;
82
86 public event Callback onLevelLoaded;
87
92
96 public static void AddOnObjectInstantiatedListener(Callback<GameObject> listener)
97 {
98 if (instance.onObjectInstantiated == null)
99 instance.onObjectInstantiated = listener;
100 else
101 instance.onObjectInstantiated += listener;
102 }
103
107 public static void AddOnLevelLoadedListener(Callback listener)
108 {
109 if (instance.onLevelLoaded == null)
110 instance.onLevelLoaded = listener;
111 else
112 instance.onLevelLoaded += listener;
113 }
114
118 public static void AddOnLevelClearedListener(Callback listener)
119 {
120 if (instance.onLevelCleared == null)
121 instance.onLevelCleared = listener;
122 else
123 instance.onLevelCleared += listener;
124 }
125
126 #endregion
127
133 public static UnityEngine.GameObject Instantiate(UnityEngine.GameObject original)
134 {
135 GameObject go = (GameObject)GameObject.Instantiate(original);
136
137 if (original.transform.parent != null)
138 go.transform.SetParent(original.transform.parent);
139 else
140 go.transform.parent = instance.transform;
141
143
144 if (instance.onObjectInstantiated != null)
145 instance.onObjectInstantiated(go);
146
147 AddHashHolder(go.transform);
148
149 return go;
150 }
151
152 private static void AddHashHolder(Transform t)
153 {
154 var hash = t.gameObject.AddComponent<HashHolder>().Hash;
155 foreach (Transform child in t)
156 {
157 AddHashHolder(child);
158 }
159 }
160
166 public static UnityEngine.GameObject Instantiate(UnityEngine.GameObject original, Vector3 position, Quaternion rotation)
167 {
168 GameObject go = (GameObject)GameObject.Instantiate(original, position, rotation);
169
170 if (original.transform.parent != null)
171 go.transform.SetParent(original.transform.parent);
172 else
173 go.transform.parent = instance.transform;
174
176
177 if (instance.onObjectInstantiated != null)
178 instance.onObjectInstantiated(go);
179
180 AddHashHolder(go.transform);
181
182 return go;
183 }
184
190 public static UnityEngine.GameObject Instantiate(UnityEngine.GameObject original, Vector3 position, Quaternion rotation, Transform parent)
191 {
192 GameObject go = (GameObject)GameObject.Instantiate(original, position, rotation, parent);
193
195
196 if (instance.onObjectInstantiated != null)
197 instance.onObjectInstantiated(go);
198
199 AddHashHolder(go.transform);
200
201 return go;
202 }
203
207 public static string SaveLevel()
208 {
209 //var currentAction = FindObjectOfType<StartAction>();
210 //if (currentAction)
211 //{
212 // Controller.Instance.ClickedOn(currentAction.name);
213 //}
214
215 pb_SceneNode rootNode = new pb_SceneNode(instance.gameObject);
216 string scenegraph = JsonConvert.SerializeObject(new[]
217 {
218 (object)rootNode,
219 (object)Controller.Instance,
222#if DANA
223 (object)TablePositionSetter.instance.showTable
224#else
225 (object)MiscLogicManager.instance.canTeleport,
226 (object)MiscLogicManager.instance.GetTeleportSize()
227#endif
228 },
229 Formatting.None, // Formatting.Indented -> t�l sok helyet foglal
230 pb_Serialization.ConverterSettings);
231 Debug.Log(scenegraph);
232 return scenegraph;
233 }
234
238 public static void LoadLevel(string levelJson, bool ssol = false)
239 {
240 //if(pb_Scene.nullableInstance != null)
241 // pb_Scene.instance.Clear();
242#if DANA
243 FindObjectOfType<StartCanvas>(true)?.canvas.SetActive(true);
244
245#endif
246 LoadingManager.instance.SetLoading();
247 LoadingManager.instance.ShowWindow();
248 LoadingManager.instance.MainLoading = true;
249 LoadingManager.instance.timeout = 90f;
250
251
252 var nscb = FindObjectOfType<pb_NewSceneButton>();
253 if (nscb)
254 nscb.OpenNewScene();
255 else
256 pb_Scene.instance.Clear();
257
258 pb_Scene scene = pb_Scene.instance;
259
260 //pb_SceneNode root_node = (pb_SceneNode) JsonConvert.DeserializeObject<pb_SceneNode>(levelJson, pb_Serialization.ConverterSettings);
261 var loaded_array = (object[])JsonConvert.DeserializeObject<object[]>(levelJson, pb_Serialization.ConverterSettings);
262 if (loaded_array == null)
263 {
264 Debug.LogWarning("Trying to load empty scene! Didn't save the course?");
265 instance.onLevelLoaded?.Invoke();
266 LoadingManager.instance.HideWindow();
267 LoadingManager.instance.MainLoading = false;
268 return;
269 }
270
271
272 //rootLocalOffset = pb_Scene.instance.transform.localPosition - root_node.localPos;
273 //try
274 //{
275 // pb_Scene.instance.transform.localPosition = root_node.localPos;
276 //}
277 //catch (Exception e)
278 //{
279 // // ignored
280 //}
281
282 Controller.Instance?.LoadJson((Controller)loaded_array[1]);
283
284 if (loaded_array.Length > 2)
285 {
286 ConveyorBeltManager.instance?.LoadCBM((ConveyorBeltManager)loaded_array[2]);
287 PanoramaManager.instance?.LoadPM((PanoramaManager)loaded_array[3]);
288 }
289#if DANA
290 if (loaded_array.Length > 3)
291 {
292 try
293 {
294 TablePositionSetter.instance.showTable = (bool)loaded_array[4];
295 TablePositionSetter.instance.SetTableVisibility((bool)loaded_array[4], false);
296 }
297 catch (Exception)
298 {
299 // ignored
300 }
301 }
302#else
303 if (loaded_array.Length > 3)
304 {
305 try
306 {
307 MiscLogicManager.instance.CanUseTeleport((bool) loaded_array[4]);
308 }
309 catch (Exception)
310 {
311 // ignored
312 }
313 }
314 if (loaded_array.Length > 4)
315 {
316 try
317 {
318 MiscLogicManager.instance.SetTeleportSize((Vector3) loaded_array[5]);
319 }
320 catch (Exception)
321 {
322 // ignored
323 }
324 }
325#endif
326 var spawn = GameObject.Find("SpawnPoint");
327
328 if (!spawn)
329 {
330 throw new Exception("SpawnPoint not found!");
331 }
332
333 if (LoadSceneNode(loaded_array[0] as pb_SceneNode, spawn, scene, ssol))
334 {
335 Debug.Log("LoadSceneNode returned true");
336 LoadingManager.instance.HideWindow();
337 LoadingManager.instance.MainLoading = false;
338 instance.onLevelLoaded?.Invoke();
339 return;
340 }
341
342 pb_Hierarchy.instance.RebuildInspector();
343 LoadingManager.instance.MainLoading = false;
344
345 if (instance.onLevelLoaded != null)
346 instance.onLevelLoaded();
347
348#if UNITY_WEBGL
349 LoadingManager.instance.HideWindow();
350#endif
351 }
352
353 public void ThisIsAReload() => StartCoroutine(AfterReloaded());
354 IEnumerator AfterReloaded()
355 {
356 yield return new WaitForSeconds(3f);
357 yield return null;
358 while (LoadingManager.instance.isLoading)
359 {
360 yield return null;
361 }
362
363 StartButton.instance?.gameObject.SetActive(true);
364 }
365
366
367 public void EnablePhysics()
368 {
369 if (!SavedUser.instance.isEditor)
370 {
371 foreach (var rb in rigidList)
372 {
373 if (rb)
374 rb.isKinematic = false;
375 }
376 }
377 }
378 private IEnumerator LateAllTCD()
379 {
380 yield return null;
381 Macro.allActiveTCD.Clear();
383 }
384 private static bool LoadSceneNode(pb_SceneNode root_node, GameObject spawn, pb_Scene scene, bool ssol, bool envOnly = false)
385 {
386 GameObject env = null;
387 if (envOnly)
388 {
389 var curenv = GameObject.Find("Environment");
390 if (curenv)
391 {
392 Destroy(curenv);
393 }
394
395 env = new GameObject("Environment");
396 }
397
398 SpawnAllSpawnable(root_node, spawn, scene, ssol, envOnly, env);
399
400 GameObject root = root_node.ToGameObject();
401
402 if (!root || !root.transform)
403 {
404 if (instance.onLevelLoaded != null)
405 instance.onLevelLoaded();
406
407 return true;
408 }
409
410 Transform[] children = new Transform[root.transform.childCount];
411
412 int i = 0;
413 foreach (Transform t in root.transform)
414 children[i++] = t;
415
416 foreach (Transform t in children)
417 t.SetParent(scene.transform);
418
419 pb_ObjectUtility.Destroy(root);
420 return false;
421 }
422
423 private static void SpawnAllSpawnable(pb_SceneNode root_node, GameObject spawn, pb_Scene scene, bool ssol, bool envOnly, GameObject env, GameObject lastSpawned = null)
424 {
425 foreach (var o in root_node.children)
426 {
427 if (root_node.name == instance.name)
428 lastSpawned = null;
429
430 if (o.name == "DobotRobot")
431 {
432 var robot = DobotEditorManager.instance?.GetRobot();
433 if (robot == null) continue;
434 robot.transform.localPosition = o.localPos;
435 robot.transform.localRotation = o.transform.rotation;
436 robot.transform.localScale = o.transform.scale;
437 continue;
438 }
439
440 var spawnable = pb_PrefabBrowser.instance.GetPrefabFromName(o.name);
441 if (spawnable)
442 {
443 var spawned = Instantiate(spawnable, spawn.transform.position, Quaternion.identity, scene.transform);
444 spawned.GetComponent<HashHolder>().oldLoadedHash = o.hash;
445 spawned.name = spawned.name.Replace("(Clone)", "");
446 try
447 {
448 spawned.GetComponent<RenameObject>().NewName = o.rename;
449 }
450 catch (Exception)
451 {
452 // ignored
453 }
454
455
456 if (o.transform.isRestArea)
457 spawned.AddComponent<RestArea>();
458
459 //if (o.transform.isTwoHandGrab)
460 // spawned.AddComponent<TwoHandGrab>().enabled = false;
461
462 //#if UNITY_WEBGL
463 var parentObject = HashingManager.instance.GetGOFromHash(root_node.hash);
464 spawned.transform.SetParent(parentObject ? parentObject.transform : scene.transform, true);
465 //#else
466 // spawned.transform.SetParent(scene.transform, true);
467 //#endif
468 if (spawned.GetComponent<RawImage>())
469 {
471 spawned.GetComponent<RawImage>().texture = GlobalTextureHolder.instance.GetFullRes(o.name);
472 GC.Collect();
473 }
474 spawned.transform.localPosition = o.localPos;
475 spawned.transform.localRotation = o.transform.rotation;
476 spawned.transform.localScale = o.transform.scale;
477 spawned.SetActive(o.transform.isEnabled);
478#if !UNITY_WEBGL
479 //if (o.name == "POI")
480 //{
481 // var showonhover = spawned.transform.GetChild(0);
482 // var O = o.children[0].children[0];
483 // var content = prefabBrowser.GetPrefabFromName(O.name);
484 //
485 // var spawned2 = Instantiate(content, showonhover);
486 // spawned2.transform.localPosition = O.localPos;
487 // spawned2.transform.localRotation = O.transform.rotation;
488 // spawned2.transform.localScale = O.transform.scale;
489 //}
490#endif
491 if (!o.transform.isStatic)
492 {
493 if (o.transform.isTool)
494 {
495 var blue = Instantiate(spawned, null);
496 blue.name += "_blue";
497#if !UNITY_WEBGL
498
499
500 Destroy(blue.GetComponent<ThrowableCanDisable>());
501 Destroy(blue.GetComponent<Interactable>());
502 Destroy(blue.GetComponent<Rigidbody>());
503 Destroy(blue.GetComponent<HashHolder>());
504 //blue.AddComponent<FindWhoDestroys>();
505 try
506 {
507 var bmrs = blue.GetComponentsInChildren<MeshRenderer>();
508 var bluemat = ToolPositioner.instance.RimLight;
509 foreach (var bmr in bmrs)
510 {
511 var bml = new List<Material>();
512 for (int i = 0; i < bmr.materials.Length; i++)
513 {
514 bml.Add(bluemat);
515 }
516
517 var currentcoll = bmr.gameObject.GetComponent<Collider>();
518 Destroy(currentcoll);
519 bmr.materials = bml.ToArray();
520 var coll = bmr.gameObject.AddComponent<MeshCollider>();
521 coll.convex = true;
522 coll.isTrigger = true;
523 }
524 }
525 catch (Exception)
526 {
527 Debug.LogError("Failed to get and set blue!");
528 }
529
530 blue.SetActive(false);
531#endif
532 spawned.AddComponent<ToolGO>().blue = blue;
533 spawned.AddComponent<Rigidbody>().isKinematic = true;
534 var offset = spawned.AddComponent<OffsetHolder>();
535 try
536 {
537 offset.Offset = o.transform.offset;
538 offset.Rotation = o.transform.rotoffset;
539 offset.LeftOffset = o.transform.leftoffset;
540 offset.LeftRotation = o.transform.leftrotoffset;
541 }
542 catch (Exception e)
543 {
544 // ignored
545 }
546 spawned.AddComponent<VisualOffset>();
547
548#if !UNITY_WEBGL
549 spawned.AddComponent<Interactable>();
550 var throwable = spawned.AddComponent<ThrowableCanDisable>();
551 throwable.delayEventSeconds = 2.5f;
552 if (throwable.onPickUp == null)
553 {
554 throwable.onPickUp = new UnityEvent();
555 }
556
557 if (throwable.DelayedOnPickUp == null)
558 {
559 throwable.DelayedOnPickUp = new UnityEvent();
560 }
561
562 throwable.onPickUp.AddListener(() =>
563 {
564 blue.SetActive(true);
565 blue.GetComponentInChildren<Collider>(true).enabled = false;
566 });
567
568 throwable.onDetachFromHand = new UnityEvent();
569
570 throwable.DelayedOnPickUp.AddListener(() => { blue.GetComponentInChildren<Collider>(true).enabled = true; });
571
572 var bcoll = blue.GetComponentInChildren<Collider>(true);
573 var ltm = blue.gameObject.AddComponent<LerpToMe>();
574 var ce = bcoll.gameObject.AddComponent<CollisionEvents>();
575 ce.collisions = new List<NamedCollisionEvents>();
576 ce.collisions.Add(new NamedCollisionEvents() { colliderName = bcoll.name, onTriggerEnter = new UnityEvent() });
577 ce.collisions[0].onTriggerEnter.AddListener(() => { throwable.ForceDrop(); });
578 ce.collisions[0].onTriggerEnter.AddListener(() => { ltm.DoTheLerp(spawned); });
579
580 ltm.skipDestroy = true;
581 ltm.onFinished = new UnityEvent();
582 ltm.onFinished.AddListener(() => { blue.SetActive(false); });
583 ltm.onFinished.AddListener(() => { spawned.GetComponentInChildren<Collider>().enabled = true; });
584#endif
585 }
586 else
587 {
588 var hasRigidbody = spawned.GetComponent<Rigidbody>();
589 var hasOffsetter = spawned.GetComponent<OffsetHolder>();
590 var hasVisualOffsetter = spawned.GetComponent<VisualOffset>();
591#if !UNITY_WEBGL
592 var hasInteractable = spawned.GetComponent<Interactable>();
593 var hasThrowable = spawned.GetComponent<ThrowableCanDisable>();
594#endif
595
596 if (!hasRigidbody)
597 {
598 var rb = spawned.AddComponent<Rigidbody>() /*.isKinematic = true*/;
599 rigidList.Add(rb);
600 rb.isKinematic = true;
601#if !UNITY_WEBGL
602 if (!ssol)
603#endif
604 {
605 rb.isKinematic = true;
606 }
607 }
608
609 if (!hasOffsetter)
610 {
611 var offset = spawned.AddComponent<OffsetHolder>();
612 offset.Offset = o.transform.offset;
613 offset.Rotation = o.transform.rotoffset;
614 offset.LeftOffset = o.transform.leftoffset;
615 offset.LeftRotation = o.transform.leftrotoffset;
616 }
617
618 if (!hasVisualOffsetter)
619 {
620 var visOffset = spawned.AddComponent<VisualOffset>();
621 }
622
623
624#if !UNITY_WEBGL
625 if (!hasInteractable)
626 {
627 spawned.AddComponent<Interactable>() /*.attachEaseIn = true*/;
628 }
629
630 //else
631 //{
632 // hasInteractable.attachEaseIn = true;
633 //}
634 if (!hasThrowable)
635 {
636 spawned.AddComponent<ThrowableCanDisable>().enabled = false;
637 }
638#endif
639 }
640 }
641 else
642 {
643 spawned.AddComponent<StaticGO>();
644
645
646 var hasOffsetter = spawned.GetComponent<OffsetHolder>();
647 var hasVisualOffsetter = spawned.GetComponent<VisualOffset>();
648
649 if (!hasOffsetter)
650 {
651 var offset = spawned.AddComponent<OffsetHolder>();
652 offset.Offset = o.transform.offset;
653 offset.Rotation = o.transform.rotoffset;
654 offset.LeftOffset = o.transform.leftoffset;
655 offset.LeftRotation = o.transform.leftrotoffset;
656 }
657
658 if (!hasVisualOffsetter)
659 {
660 var visOffset = spawned.AddComponent<VisualOffset>();
661 }
662 }
663
664 if (o.convex != null && spawned.GetComponentInChildren<MeshCollider>())
665 {
666 spawned.GetComponentInChildren<MeshCollider>().convex = (bool)o.convex;
667 if (o.trigger != null)
668 {
669 spawned.GetComponentInChildren<MeshCollider>().isTrigger = (bool)o.trigger;
670 }
671 }
672
673 SetChildrenPositions(spawned.transform, o);
674 if (envOnly)
675 {
676 spawned.transform.SetParent(env.transform, true);
677 }
678
679 if (o.children.Count > 0)
680 {
681 lastSpawned = spawned;
682 }
683 }
684 //#if UNITY_WEBGL
685 SpawnAllSpawnable(o, spawn, scene, ssol, envOnly, env, lastSpawned);
686 //#endif
687 }
688 }
689
690 private static void SetupMaterials(pb_SceneNode sn, GameObject spawned)
691 {
692 var mr = spawned.GetComponent<MeshRenderer>();
693 if (!mr) return;
694
695 try
696 {
697 foreach (var item in sn.components)
698 {
699 var comp = spawned.GetComponent(item.type);
700
701 var isEnabled = ((pb_SerializableObject<Component>)item).GetObject("enabled");
702 if (comp is Renderer r && isEnabled != null)
703 {
704 r.enabled = (bool)isEnabled;
705 }
706 }
707 }
708 catch (NullReferenceException)
709 {
710 //sn.components is NULL
711 }
712
713 int i = 0;
714 try
715 {
716 if (sn.changedTexture?.matSettings != null)
717 {
718 foreach (var mat in sn.changedTexture.matSettings)
719 {
720 var _material = mr.materials[i];
721
722 if (_material.HasProperty("_Metallic"))
723 _material.SetFloat("_Metallic", mat.metallic);
724 if (_material.HasProperty("_Glossiness"))
725 _material.SetFloat("_Glossiness", mat.smoothness);
726 if (_material.HasProperty("_Color") && mat.color != default)
727 _material.SetColor("_Color", mat.color);
728 if (_material.HasProperty("_MainTex") && !string.IsNullOrEmpty(mat.textureName) && GlobalTextureHolder.instance.HasTexture(mat.textureName))
729 _material.SetTexture("_MainTex", GlobalTextureHolder.instance.GetFullRes(mat.textureName));
730 if (_material.HasProperty("_MetallicGlossMap") && !string.IsNullOrEmpty(mat.metallicName))
731 _material.SetTexture("_MetallicGlossMap", pb_PrefabBrowser.instance.GetPrefabFromName(mat.metallicName)?.GetComponent<RawImage>().texture);
732 if (_material.HasProperty("_BumpMap") && !string.IsNullOrEmpty(mat.normalName))
733 _material.SetTexture("_BumpMap", pb_PrefabBrowser.instance.GetPrefabFromName(mat.normalName)?.GetComponent<RawImage>().texture);
734 if (_material.HasProperty("_OcclusionMap") && !string.IsNullOrEmpty(mat.occlusionName))
735 _material.SetTexture("_OcclusionMap", pb_PrefabBrowser.instance.GetPrefabFromName(mat.occlusionName)?.GetComponent<RawImage>().texture);
736
737 var cth = spawned.DemandComponent<ChangedTextureHolder>();
738 var matSettings = cth.matSettings.GetIndex(i);
739 matSettings.metallic = mat.metallic;
740 matSettings.smoothness = mat.smoothness;
741 matSettings.color = mat.color;
742 matSettings.textureName = mat.textureName;
743 matSettings.metallicName = mat.metallicName;
744 matSettings.normalName = mat.normalName;
745 matSettings.occlusionName = mat.occlusionName;
746
747 cth.matSettings[i] = matSettings;
748
749
750 i++;
751 }
752 }
753 }
754 catch (Exception e)
755 {
756 Debug.LogError(e);
757 }
758 }
760 {
761 if (isEditingTools) return;
762 var env = GameObject.Find("Environment");
763 if (!env) return;
764 isEditingEnv = !isEditingEnv;
765 var temp = new GameObject("TempHolder");
766 var count = instance.transform.childCount;
767 for (int i = 0; i < count; i++)
768 {
769 instance.transform.GetChild(0).SetParent(temp.transform, true);
770 }
771 count = env.transform.childCount;
772 for (int i = 0; i < count; i++)
773 {
774 env.transform.GetChild(0).SetParent(instance.transform, true);
775 }
776 count = temp.transform.childCount;
777 for (int i = 0; i < count; i++)
778 {
779 temp.transform.GetChild(0).SetParent(env.transform, true);
780 }
781 Destroy(temp);
782 pb_Hierarchy.instance.RebuildInspector();
783 if (isEditingEnv)
784 {
786 }
787 else
788 {
790 }
791
792 }
793
794 public void EditToolsToggle(GameObject[] tools)
795 {
796#if !UNITY_WEBGL
797 if (isEditingEnv) return;
798 var envs = new DirectoryInfo(Application.streamingAssetsPath)
799 .EnumerateFiles("*.env", SearchOption.AllDirectories)
800 /*.Select(d => d.FullName)*/.ToList();
801 var currentLoadedTool = envs.FirstOrDefault(x => x.Name == currentLevelName + "_tool.env");
802 isEditingTools = !isEditingTools;
803 GameObject temp = null;
804 if (isEditingTools)
805 {
806 temp = new GameObject("TempHolder");
807 var count = instance.transform.childCount;
808 for (int i = 0; i < count; i++)
809 {
810 instance.transform.GetChild(0).SetParent(temp.transform, true);
811 }
812 foreach (var tool in tools)
813 {
814 tool?.transform.SetParent(instance.transform, true);
815 }
817 }
818 else
819 {
820 temp = GameObject.Find("TempHolder");
821 var parent = GameObject.Find("iris_position_helper");
822 var savefile = "";
823 var lines = "";
824
825 if (currentLoadedTool != default(FileInfo))
826 {
827 if (File.Exists(Path.Combine(Application.streamingAssetsPath, currentLoadedTool.Name)))
828 {
829 lines = File.ReadAllText(Path.Combine(Application.streamingAssetsPath, currentLoadedTool.Name));
830 }
831 }
832 else
833 {
834 if (File.Exists(Path.Combine(Application.streamingAssetsPath, "tools.env")))
835 {
836 lines = File.ReadAllText(Path.Combine(Application.streamingAssetsPath, "tools.env"));
837 }
838 }
839 int j = 0;
840
841 foreach (var tool in tools)
842 {
843 if (tool == null) continue;
844 tool.transform.SetParent(parent.transform, true);
845 var blue = parent.transform.Find(tool.name + "_blue");
846 if (blue)
847 {
848 blue.transform.position = tool.transform.position;
849 blue.transform.rotation = tool.transform.rotation;
850 blue.transform.localScale = tool.transform.localScale;
851 }
852
853 if (TablePositionSetter.instance.showTable)
854 {
855 savefile += $"{tool.transform.position.x}:{tool.transform.position.y}:{tool.transform.position.z};";
856 savefile += $"{tool.transform.eulerAngles.x}:{tool.transform.eulerAngles.y}:{tool.transform.eulerAngles.z};";
857 savefile += $"{tool.transform.localScale.x}:{tool.transform.localScale.y}:{tool.transform.localScale.z};";
858 savefile += $"{tool.activeSelf};";
859 try
860 {
861 var line = lines.Split('\n')[j].Split(';');
862 var buffer = "";
863 buffer += $"{line[3]};";
864 buffer += $"{line[4]};";
865 buffer += $"{line[5]};\n";
866 savefile += buffer;
867 }
868 catch (Exception)
869 {
870 savefile += $"{tool.transform.position.x}:{tool.transform.position.y}:{tool.transform.position.z};";
871 savefile += $"{tool.transform.eulerAngles.x}:{tool.transform.eulerAngles.y}:{tool.transform.eulerAngles.z};";
872 savefile += $"{tool.transform.localScale.x}:{tool.transform.localScale.y}:{tool.transform.localScale.z};";
873 savefile += $"{tool.activeSelf};\n";
874 }
875 }
876 else
877 {
878 //try
879 //{
880 // var line = lines.Split('\n')[j].Split(';');
881 // var buffer = "";
882 // buffer += $"{line[0]};";
883 // buffer += $"{line[1]};";
884 // buffer += $"{line[2]};";
885 // savefile += buffer;
886 //}
887 //catch (Exception)
888 //{
889 // savefile += $"{tool.transform.position.x}:{tool.transform.position.y}:{tool.transform.position.z};";
890 // savefile += $"{tool.transform.eulerAngles.x}:{tool.transform.eulerAngles.y}:{tool.transform.eulerAngles.z};";
891 // savefile += $"{tool.transform.localScale.x}:{tool.transform.localScale.y}:{tool.transform.localScale.z};";
892 // savefile += $"{tool.activeSelf};";
893 //}
894 savefile += $"{tool.transform.position.x}:{tool.transform.position.y}:{tool.transform.position.z};";
895 savefile += $"{tool.transform.eulerAngles.x}:{tool.transform.eulerAngles.y}:{tool.transform.eulerAngles.z};";
896 savefile += $"{tool.transform.localScale.x}:{tool.transform.localScale.y}:{tool.transform.localScale.z};";
897 savefile += $"{tool.activeSelf};\n";
898 }
899 j++;
900 }
901 var count = temp.transform.childCount;
902 for (int i = 0; i < count; i++)
903 {
904 temp.transform.GetChild(0).SetParent(instance.transform, true);
905 }
906 Destroy(temp);
907 if (currentLoadedTool != default(FileInfo))
908 {
909 File.WriteAllText(Path.Combine(Application.streamingAssetsPath, currentLoadedTool.Name), savefile);
910 }
911 else
912 {
913 File.WriteAllText(Path.Combine(Application.streamingAssetsPath, "tools.env"), savefile);
914 }
915
917 }
918
919 pb_Hierarchy.instance.RebuildInspector();
920
921#endif
922 }
923
924
925 private static void SetChildrenPositions(Transform parent, pb_SceneNode node)
926 {
927 foreach (var t in node.children)
928 {
929 Transform child;
930 try
931 {
932 child = FindHash(parent, t.hash);
933 if (!child)
934 child = FindHashByName(parent, t, t.hash);
935 }
936 catch (Exception)
937 {
938 continue;
939 }
940 if (!child) continue;
941 child.gameObject.SetActive(t.transform.isEnabled);
942 child.localRotation = t.transform.rotation;
943 child.localPosition = t.localPos;
944 child.localScale = t.transform.scale;
945
946 if (t.transform.offset != default || t.transform.rotoffset != default)
947 {
948 var offset = child.gameObject.AddComponent<OffsetHolder>();
949 try
950 {
951 offset.Offset = t.transform.offset;
952 offset.Rotation = t.transform.rotoffset;
953 offset.LeftOffset = t.transform.leftoffset;
954 offset.LeftRotation = t.transform.leftrotoffset;
955 }
956 catch (Exception e)
957 {
958 // ignored
959 }
960 }
961
962 SetupMaterials(t, child.gameObject);
963
964 var coll = child.GetComponent<MeshCollider>();
965 if (coll)
966 {
967 if (t.convex != null)
968 {
969 coll.convex = (bool)t.convex;
970 }
971 if (t.transform.isRestArea)
972 {
973 child.gameObject.AddComponent<RestArea>();
974 }
975 //if (t.transform.isTwoHandGrab)
976 //{
977 // child.gameObject.AddComponent<TwoHandGrab>().enabled = false;
978 //}
979 }
980
981 SetChildrenPositions(child, t);
982 }
983 }
984
985 static Transform FindChildByRecursion(Transform aParent, string aName)
986 {
987 if (aParent == null) return null;
988 var result = aParent.Find(aName);
989 if (result != null)
990 return result;
991 foreach (Transform child in aParent)
992 {
993 result = FindChildByRecursion(child, aName);
994 if (result != null)
995 return result;
996 }
997 return null;
998 }
999
1000 public static void ReloadLevel(string levelJson)
1001 {
1002 Debug.LogError("DEPRECATED!");
1003 return;
1004 var remoteJson = JsonConvert.DeserializeObject<SceneNode>(levelJson);
1005
1006 var goList = GameObject.FindObjectsOfType<JSONPositioner>();
1007 foreach (var jsonPositioner in goList)
1008 {
1009 //jsonPositioner.PassData(FindHash(remoteJson, jsonPositioner.Hash));
1010 }
1011 }
1012
1013 [CanBeNull]
1014 static Transform FindHash(Transform root, string hash)
1015 {
1016 var hh = root.GetComponent<HashHolder>();
1017 if (!hh) return null;
1018 if (hash == hh.Hash) return root;
1019 foreach (Transform rootChild in root.transform)
1020 {
1021 var retval = FindHash(rootChild, hash);
1022 if (retval != null)
1023 {
1024 return retval;
1025 }
1026 }
1027 return null;
1028 }
1029
1030 [CanBeNull]
1031 static Transform FindHashByName(Transform root, pb_SceneNode node, string hash)
1032 {
1033 var hh = root.GetComponent<HashHolder>();
1034 if (!hh) return null;
1035 if (hash == hh.Hash) return root;
1036 if (node.name == root.name && string.IsNullOrEmpty(hh.oldLoadedHash))
1037 {
1038 hh.oldLoadedHash = hash;
1039 return root;
1040 }
1041 foreach (Transform rootChild in root.transform)
1042 {
1043 var retval = FindHashByName(rootChild, node, hash);
1044 if (retval != null)
1045 {
1046 return retval;
1047 }
1048 }
1049 return null;
1050 }
1051
1055 public void Clear()
1056 {
1059
1060 foreach (Transform t in transform)
1061 pb_ObjectUtility.Destroy(t.gameObject);
1062
1063
1064 //LoadEnvAndTools();
1065
1066 onLevelCleared?.Invoke();
1067 }
1068
1069 public void RepositionTools()
1070 {
1071 LoadEnvAndTools(true);
1072 }
1073
1074 public void LoadEnvAndTools(bool onlyTools = false)
1075 {
1076#if !DANA
1077 return;
1078#else
1079 var envs = new DirectoryInfo(Application.streamingAssetsPath)
1080 .EnumerateFiles("*.env", SearchOption.AllDirectories)
1081 /*.Select(d => d.FullName)*/.ToList();
1082 var currentLoadedMap = envs.FirstOrDefault(x => x.Name == currentLevelName + ".env");
1083 var currentLoadedTool = envs.FirstOrDefault(x => x.Name == currentLevelName + "_tool.env"); //tool loading
1084 var env_path = Path.Combine(Application.streamingAssetsPath, "environment.env");
1085 var tool_path = Path.Combine(Application.streamingAssetsPath, "tools.env");
1086 if (!onlyTools)
1087 {
1088 if (File.Exists(env_path) || currentLoadedMap != default(FileInfo))
1089 {
1090 var env = GameObject.Find("Environment");
1091 if (env)
1092 {
1093 Destroy(env);
1094 }
1095 IsLoadingEnvNow = true;
1096 if (currentLoadedMap != default(FileInfo))
1097 {
1098 var loaded_array = (object[])JsonConvert.DeserializeObject<object[]>(File.ReadAllText(currentLoadedMap.FullName),
1099 pb_Serialization.ConverterSettings);
1100 LoadSceneNode(loaded_array[0] as pb_SceneNode, GameObject.Find("SpawnPoint"), instance, false, true);
1101 }
1102 else
1103 {
1104 var loaded_array =
1105 (object[])JsonConvert.DeserializeObject<object[]>(File.ReadAllText(env_path),
1106 pb_Serialization.ConverterSettings);
1107 LoadSceneNode(loaded_array[0] as pb_SceneNode, GameObject.Find("SpawnPoint"), instance, false, true);
1108 }
1109 IsLoadingEnvNow = false;
1110 }
1111 }
1112 if (File.Exists(tool_path) || currentLoadedTool != default(FileInfo))
1113 {
1114 if (currentLoadedTool != default(FileInfo))
1115 {
1116 var loadedArray = File.ReadAllLines(currentLoadedTool.FullName);
1117 for (int i = 0; i < ToolPositioner.instance.tools.Length; i++)
1118 {
1119 try
1120 {
1121 var tool = ToolPositioner.instance.tools[i];
1122 var array = loadedArray[i].Split(';');
1123 var blue = GameObject.Find("iris_position_helper").transform.Find(tool.name + "_blue");
1124 var pos = array[0].Split(':');
1125 var rot = array[1].Split(':');
1126 var scl = array[2].Split(':');
1127
1128 //#if !DANA
1129 if (SavedUser.instance.isEditor)
1130 {
1131 if (bool.TryParse(array[3 + (TablePositionSetter.instance.showTable ? 0 : 3)], out var act))
1132 {
1133 tool.SetActive(act);
1134 }
1135 }
1136//#endif
1137 tool.transform.position = new Vector3(Macro.StoF(pos[0]), Macro.StoF(pos[1]), Macro.StoF(pos[2]));
1138 tool.transform.eulerAngles = new Vector3(Macro.StoF(rot[0]), Macro.StoF(rot[1]), Macro.StoF(rot[2]));
1139 tool.transform.localScale = new Vector3(Macro.StoF(scl[0]), Macro.StoF(scl[1]), Macro.StoF(scl[2]));
1140 blue.position = tool.transform.position;
1141 blue.eulerAngles = tool.transform.eulerAngles;
1142 blue.localScale = tool.transform.localScale;
1143 }
1144 catch (Exception e)
1145 {
1146 // ignored
1147 }
1148 }
1149 }
1150 else
1151 {
1152 var loadedArray = File.ReadAllLines(tool_path);
1153 for (int i = 0; i < ToolPositioner.instance.tools.Length; i++)
1154 {
1155 try
1156 {
1157 var tool = ToolPositioner.instance.tools[i];
1158 var array = loadedArray[i].Split(';');
1159 var blue = GameObject.Find("iris_position_helper").transform.Find(tool.name + "_blue");
1160 var pos = array[0 + (TablePositionSetter.instance.showTable ? 0 : 3)].Split(':');
1161 var rot = array[1 + (TablePositionSetter.instance.showTable ? 0 : 3)].Split(':');
1162 var scl = array[2 + (TablePositionSetter.instance.showTable ? 0 : 3)].Split(':');
1163 if (SavedUser.instance.isEditor)
1164 {
1165 if (bool.TryParse(array[3 + (TablePositionSetter.instance.showTable ? 0 : 3)], out var act))
1166 {
1167 tool.SetActive(act);
1168 }
1169 }
1170 tool.transform.position = new Vector3(Macro.StoF(pos[0]), Macro.StoF(pos[1]), Macro.StoF(pos[2]));
1171 tool.transform.eulerAngles = new Vector3(Macro.StoF(rot[0]), Macro.StoF(rot[1]), Macro.StoF(rot[2]));
1172 tool.transform.localScale = new Vector3(Macro.StoF(scl[0]), Macro.StoF(scl[1]), Macro.StoF(scl[2]));
1173 blue.position = tool.transform.position;
1174 blue.eulerAngles = tool.transform.eulerAngles;
1175 blue.localScale = tool.transform.localScale;
1176 }
1177 catch (Exception)
1178 {
1179 // ignored
1180 }
1181 }
1182 }
1183
1184 }
1185
1186
1187#endif
1188 }
1193 public static List<GameObject> Children()
1194 {
1195 return instance.GetChildren(instance.transform);
1196 }
1197
1202 private List<GameObject> GetChildren(Transform transform)
1203 {
1204 List<GameObject> children = new List<GameObject>();
1205
1206 foreach (Transform t in transform)
1207 {
1208 if (!t.gameObject.activeSelf)
1209 continue;
1210
1211 children.Add(t.gameObject);
1212 children.AddRange(GetChildren(t));
1213 }
1214
1215 return children;
1216 }
1217 }
1218}
UnityEngine.Debug Debug
Definition: TanodaServer.cs:19
List< MatSettings > matSettings
List< NamedCollisionEvents > collisions
void LoadJson(Controller controller)
Definition: Controller.cs:79
static Controller Instance
Definition: Controller.cs:16
static DobotEditorManager instance
GameObject GetPrefabFromName(string goName)
static pb_PrefabBrowser instance
ChangedTextureHolder changedTexture
Definition: pb_SceneNode.cs:26
List< pb_SceneNode > children
Definition: pb_SceneNode.cs:27
List< pb_ISerializable > components
Definition: pb_SceneNode.cs:30
static void StripEditorComponents(GameObject target)
void EnablePhysics()
Definition: pb_Scene.cs:367
static void AddOnLevelLoadedListener(Callback listener)
Definition: pb_Scene.cs:107
void EditEnvironmentToggle()
Definition: pb_Scene.cs:759
static List< GameObject > Children()
Definition: pb_Scene.cs:1193
void ThisIsAReload()
static void ReloadLevel(string levelJson)
Definition: pb_Scene.cs:1000
static string SaveLevel()
Definition: pb_Scene.cs:207
static UnityEngine.GameObject Instantiate(UnityEngine.GameObject original, Vector3 position, Quaternion rotation, Transform parent)
Definition: pb_Scene.cs:190
void RepositionTools()
Definition: pb_Scene.cs:1069
static void LoadLevel(string levelJson, bool ssol=false)
Definition: pb_Scene.cs:238
static UnityEngine.GameObject Instantiate(UnityEngine.GameObject original, Vector3 position, Quaternion rotation)
Definition: pb_Scene.cs:166
void Clear()
Definition: pb_Scene.cs:1055
Callback< GameObject > onObjectInstantiated
Definition: pb_Scene.cs:81
void LoadEnvAndTools(bool onlyTools=false)
Definition: pb_Scene.cs:1074
void EditToolsToggle(GameObject[] tools)
Definition: pb_Scene.cs:794
bool IsLoadingEnvNow
Definition: pb_Scene.cs:72
static UnityEngine.GameObject Instantiate(UnityEngine.GameObject original)
Definition: pb_Scene.cs:133
static void AddOnObjectInstantiatedListener(Callback< GameObject > listener)
Definition: pb_Scene.cs:96
Callback onLevelLoaded
Definition: pb_Scene.cs:86
static void AddOnLevelClearedListener(Callback listener)
Definition: pb_Scene.cs:118
override void Awake()
Definition: pb_Scene.cs:29
Callback onLevelCleared
Definition: pb_Scene.cs:91
static void Clear()
Definition: pb_Selection.cs:61
bool HasTexture(string filename)
Texture2D GetFullRes(string filename)
static GlobalTextureHolder instance
string oldLoadedHash
Definition: HashHolder.cs:30
Definition: Macro.cs:12
static void cacheAllTCD()
Definition: Macro.cs:430
static float StoF(string value)
Definition: Macro.cs:24
void EnviromentMode()
Definition: ModeSelect.cs:16
void ToolMode()
Definition: ModeSelect.cs:29
void StageManagerMode()
Definition: ModeSelect.cs:42
static ModeSelect instance
Definition: ModeSelect.cs:8
Vector3 Offset
Definition: OffsetHolder.cs:7
static StartButton instance
Definition: StartButton.cs:7
static TablePositionSetter instance
Definition: ToolGO.cs:6
Material RimLight
GameObject[] tools
static ToolPositioner instance
delegate void Callback()