From 8168956d1d5747a8ec841858d22a16f076e20bf9 Mon Sep 17 00:00:00 2001 From: Lyuma Date: Wed, 15 Apr 2020 17:04:44 -0700 Subject: [PATCH 1/2] Permit Emu_Trigger components to be created prior to entering play mode. --- .../Assets/iwsd_vrc/Tools/OnEditorEmu/Scripts/Emu_Trigger.cs | 4 ++-- .../Assets/iwsd_vrc/Tools/OnEditorEmu/Scripts/InUnityDebug.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/unity/DigAndAnnotate/Assets/iwsd_vrc/Tools/OnEditorEmu/Scripts/Emu_Trigger.cs b/unity/DigAndAnnotate/Assets/iwsd_vrc/Tools/OnEditorEmu/Scripts/Emu_Trigger.cs index d63420e..523844c 100644 --- a/unity/DigAndAnnotate/Assets/iwsd_vrc/Tools/OnEditorEmu/Scripts/Emu_Trigger.cs +++ b/unity/DigAndAnnotate/Assets/iwsd_vrc/Tools/OnEditorEmu/Scripts/Emu_Trigger.cs @@ -23,7 +23,7 @@ internal Val_Trigger(VRCSDK2.VRC_Trigger vrcTrigger) } - class Emu_Trigger : MonoBehaviour + public class Emu_Trigger : MonoBehaviour { // [SerializeField] // TODO Make trigger definition visible with Unity inspector to debug scene. Val_Trigger vrcTrigger; @@ -739,7 +739,7 @@ private ActionResult Execute_SpawnObject(GameObject receiver, VRCSDK2.VRC_EventH // true: includeInactive foreach (var comp in newOne.GetComponentsInChildren(true)) { - comp.gameObject.AddComponent(); + comp.gameObject.GetOrAddComponent(); } foreach (var comp in newOne.GetComponentsInChildren(false)) diff --git a/unity/DigAndAnnotate/Assets/iwsd_vrc/Tools/OnEditorEmu/Scripts/InUnityDebug.cs b/unity/DigAndAnnotate/Assets/iwsd_vrc/Tools/OnEditorEmu/Scripts/InUnityDebug.cs index 436780b..ec21e45 100644 --- a/unity/DigAndAnnotate/Assets/iwsd_vrc/Tools/OnEditorEmu/Scripts/InUnityDebug.cs +++ b/unity/DigAndAnnotate/Assets/iwsd_vrc/Tools/OnEditorEmu/Scripts/InUnityDebug.cs @@ -116,7 +116,7 @@ static private void Setup_TriggersComponents() } // Emu_Trigger find brother VRC_Trigger by itself - var emu_trigger = triggerComp.gameObject.AddComponent(); + var emu_trigger = triggerComp.gameObject.GetOrAddComponent(); emu_trigger.debugString = triggerComp.gameObject.name; } From 9e0a0aa145b60bfd8775f06c33c85a477855b629 Mon Sep 17 00:00:00 2001 From: Lyuma Date: Wed, 15 Apr 2020 18:13:25 -0700 Subject: [PATCH 2/2] Fix SpawnObject with in-scene references. --- .../iwsd_vrc/Tools/OnEditorEmu/Scripts/Emu_Trigger.cs | 8 ++++++-- .../Tools/OnEditorEmu/Scripts/LocalPlayerContext.cs | 6 +++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/unity/DigAndAnnotate/Assets/iwsd_vrc/Tools/OnEditorEmu/Scripts/Emu_Trigger.cs b/unity/DigAndAnnotate/Assets/iwsd_vrc/Tools/OnEditorEmu/Scripts/Emu_Trigger.cs index 523844c..abfea83 100644 --- a/unity/DigAndAnnotate/Assets/iwsd_vrc/Tools/OnEditorEmu/Scripts/Emu_Trigger.cs +++ b/unity/DigAndAnnotate/Assets/iwsd_vrc/Tools/OnEditorEmu/Scripts/Emu_Trigger.cs @@ -355,7 +355,7 @@ private LayerMask GetLayerMaskOf(VRCSDK2.VRC_Trigger.TriggerType triggerType) { if (vrcTrigger == null) { - Iwlog.Error(gameObject, "vrcTrigger == null"); + Iwlog.Trace(gameObject, "vrcTrigger == null"); return Enumerable.Empty(); } @@ -741,7 +741,11 @@ private ActionResult Execute_SpawnObject(GameObject receiver, VRCSDK2.VRC_EventH { comp.gameObject.GetOrAddComponent(); } - + // In-scene prefab references are spawned as inactive game objects. + // Usually the root object has an OnSpawn -> SetGameObjectActive true, + // but the Emu_Trigger cannot execute before the object is Awake(). + // To workaround this, we force the newly spawned object active. + newOne.SetActive(true); foreach (var comp in newOne.GetComponentsInChildren(false)) { comp.ExecuteTriggers(VRCSDK2.VRC_Trigger.TriggerType.OnSpawn); diff --git a/unity/DigAndAnnotate/Assets/iwsd_vrc/Tools/OnEditorEmu/Scripts/LocalPlayerContext.cs b/unity/DigAndAnnotate/Assets/iwsd_vrc/Tools/OnEditorEmu/Scripts/LocalPlayerContext.cs index a4f3471..803c81a 100644 --- a/unity/DigAndAnnotate/Assets/iwsd_vrc/Tools/OnEditorEmu/Scripts/LocalPlayerContext.cs +++ b/unity/DigAndAnnotate/Assets/iwsd_vrc/Tools/OnEditorEmu/Scripts/LocalPlayerContext.cs @@ -65,7 +65,11 @@ private static Dictionary makeAssetPathMap(List objects) #if UNITY_EDITOR // This implementation requires UnityEditor. foreach (T obj in objects) { - var p = UnityEditor.AssetDatabase.GetAssetPath(obj); + var p = UnityEditor.AssetDatabase.GetAssetPath(obj); + if (p == null || p.Length == 0) { + // in-scene prefab references use the object name. + p = obj.name; + } Iwlog.Trace("asset path='" + p + "'"); if (map.ContainsKey(p)) { Iwlog.Warn("Duplicate?: path='" + p + "'");