using MacGruber; using UnityEngine; using UnityEngine.XR; using System.Collections.Generic; using SimpleJSON; namespace XD { public class CustomUnityAssetLoad : MVRScript { private JSONStorableBool myTriggerVR; private JSONStorableBool myTriggerDesktop; private JSONStorableBool myTriggerCleared; private EventTrigger myEventTrigger; private CustomUnityAssetLoader _loader; private bool myQueueTrigger = false; public override void Init() { if (containingAtom?.type != "CustomUnityAsset") { SuperController.LogError($"This plugin only works on CustomUnityAsset atoms"); DestroyImmediate(this); return; } _loader = containingAtom.GetComponentInChildren(); Utils.SetupInfoText(this, "CustomUnityAssetLoad\nthat triggers after a CustomUnityAsset loaded/cleared.", 200.0f, true ); myTriggerVR = Utils.SetupToggle(this, "Trigger in VR-Mode", true, false); myTriggerDesktop = Utils.SetupToggle(this, "Trigger in Desktop-Mode", true, false); myTriggerCleared = Utils.SetupToggle(this, "Trigger in CustomUnityAsset cleared", false, false); myEventTrigger = new EventTrigger(this, "OnTrigger"); Utils.SetupButton(this, "Actions OnTrigger", myEventTrigger.OpenPanel, false); Utils.SetupButton(this, "Test Trigger", Trigger, false); SuperController.singleton.onAtomUIDRenameHandlers += OnAtomRename; _loader.RegisterAssetLoadedCallback(OnCustomUnityAssetLoaded); _loader.RegisterAssetClearedCallback(OnCustomUnityAssetCleared); SimpleTriggerHandler.LoadAssets(); } private void OnAtomRename(string oldid, string newid) { myEventTrigger.SyncAtomNames(); } public override JSONClass GetJSON(bool includePhysical = true, bool includeAppearance = true, bool forceStore = false) { JSONClass jc = base.GetJSON(includePhysical, includeAppearance, forceStore); if (includePhysical || forceStore) { needsStore = true; jc[myEventTrigger.Name] = myEventTrigger.GetJSON(base.subScenePrefix); } return jc; } public override void LateRestoreFromJSON(JSONClass jc, bool restorePhysical = true, bool restoreAppearance = true, bool setMissingToDefault = true) { base.LateRestoreFromJSON(jc, restorePhysical, restoreAppearance, setMissingToDefault); if (!base.physicalLocked && restorePhysical && !IsCustomPhysicalParamLocked("trigger")) { myEventTrigger.RestoreFromJSON(jc, base.subScenePrefix, base.mergeRestore, setMissingToDefault); } if (_loader.isAssetLoaded && !myTriggerCleared.val) myQueueTrigger = true; // Work around OnCustomUnityAssetLoaded already being triggered before the plugin runs in case it was not yet allowed to run by the user. } private void OnDestroy() { _loader.DeregisterAssetLoadedCallback(OnCustomUnityAssetLoaded); _loader.DeregisterAssetClearedCallback(OnCustomUnityAssetCleared); SuperController.singleton.onAtomUIDRenameHandlers -= OnAtomRename; myEventTrigger.Remove(); } private void OnCustomUnityAssetLoaded() { if (!myTriggerCleared.val) myQueueTrigger = true; } private void OnCustomUnityAssetCleared() { if (myTriggerCleared.val) myQueueTrigger = true; } private void Update() { myEventTrigger.Update(); if (myQueueTrigger) Trigger(); } private void Trigger() { myQueueTrigger = false; bool isDesktopMode = !XRSettings.isDeviceActive || string.IsNullOrEmpty(XRSettings.loadedDeviceName); if (isDesktopMode && myTriggerDesktop.val) myEventTrigger.Trigger(); else if (!isDesktopMode && myTriggerVR.val) myEventTrigger.Trigger(); } } }