LogicBricks

Plugins LogicBricks

Hi @MacGruber , thanks for the great plugins!!! It's a gamechanger. Currently using Counter a lot, but I'm looking for a way to trigger my counter when 2 specific colliders collide, meaning that any other collider would not trigger but those. Any idea which LogicBrick would help ?
 
Hi @MacGruber , thanks for the great plugins!!! It's a gamechanger. Currently using Counter a lot, but I'm looking for a way to trigger my counter when 2 specific colliders collide, meaning that any other collider would not trigger but those. Any idea which LogicBrick would help ?
If never used it but I think VaM's collision trigger system has a filter for that. Doesn't need any plugin? Basically you tell your CollisionTrigger that you only care about collisions with this one other atom.
 
If never used it but I think VaM's collision trigger system has a filter for that. Doesn't need any plugin? Basically you tell your CollisionTrigger that you only care about collisions with this one other atom.
Thanks, actually I managed to do it with a counter, 2 FrenquencyLoops (for incrementing and decrementing the scrubber count), a timeline and @SPQR 's ExtraTriggers
 
Hi @MacGruber , wonderful set of utilities you have given the community, thanks so much.

Quick question. When using a SequenceMachine brick, how can I trigger the “next” or “previous” state in the defined set of state sequences, from a UIButton trigger?

I have defined 3 states in my sequence, and for each one the “onEnter” trigger updates the UIIMage atom URL. Each state in my sequence is defined as “unlimited time” in length as I don’t want sequence to automatically progress until I click the UIButton manually.

FYI, my use case is: I want a single UIButton to cycle through a set of video URLs that display on a UIImage atom, each time I press the button, the next video URL in sequence is used for the UIImage atom.

Many thanks for the help.
 
Last edited:
@Tankshell SequenceMachine is a simplified StateMachine for the particular common case of just going forward through timed or trigger synced states.

Options:
  1. Use a SequenceMachine with "Wait for TriggerSync" enabled for all your states. Also "Use Loop". You can then go through the states by triggering "TriggerSync". There is no way to go backward, though.
  2. Easier alternative is using SequenceChoice, you likely want "Use Loop" enabled here as well. Just trigger the "Trigger" action from your button. However, this can't go backward either.
  3. If you really need both directions, you would need a StateMachine. Enable "Show Advanced Options" and use the multiple choice system. From each state setup a "Choice A" transition to the next state and a "Choice B" transition to the previous one. You can then trigger "SetChoiceA" or "SetChoiceB" from your buttons accordingly. (Yes, somewhat annoying to setup, but it's what I can offer you...)
 
@MacGruber many thanks for the rapid answer. I will try your suggestions.

Is there any chance of a “direction” for SequenceMachine in future that can be set programtically ( ie forward or reverse). That would be quite useful. Keep up the amazing work. Thanks again!
 
@MacGruber many thanks for the rapid answer. I will try your suggestions.

Is there any chance of a “direction” for SequenceMachine in future that can be set programtically ( ie forward or reverse). That would be quite useful. Keep up the amazing work. Thanks again!
If you can stomach the extra setup you can achieve that with a StateMachine. Simply set the ChoiceA transitions to the next state and ChoiceB to the previous. If you need to toggle the direction you could do that with a SelectChoice or two Relays.
 
Hi @MacGruber ! Thanks for such a powerful plugin! love it!
How i can change duration value in State Machine from UI slider? I'm sure it possibly but I still dont have full understanding how all scripts works together. In demo i dont find anything for this.
5445445.JPG
 
Hi @MacGruber ! Thanks for such a powerful plugin! love it!
How i can change duration value in State Machine from UI slider? I'm sure it possibly but I still dont have full understanding how all scripts works together. In demo i dont find anything for this.
No, this can't be set via triggers, meaning it can't be hooked up to a slider. However, you could do the timing externally, say using a Delay brick. THAT you can set by trigger.

Quick steps:
  1. Add a Delay brick to your atom (can be elsewhere, too).
  2. Have the Delay brick trigger the "TriggerSync" signal on the state machine.
  3. Have your UISlider control the "Time" slider on the Delay.
  4. In StateMachine go to your State. Set "Min/Max Duration" to zero and enable "Wait for TriggerSync".
  5. In the OnEnter action of the state, trigger the Delay brick.
You can use the same Delay brick for multiple states, you don't have to duplicate it. (Unless you want multiple UISliders for different durations or something like that)
 
No, this can't be set via triggers, meaning it can't be hooked up to a slider. However, you could do the timing externally, say using a Delay brick. THAT you can set by trigger.

Quick steps:
  1. Add a Delay brick to your atom (can be elsewhere, too).
  2. Have the Delay brick trigger the "TriggerSync" signal on the state machine.
  3. Have your UISlider control the "Time" slider on the Delay.
  4. In StateMachine go to your State. Set "Min/Max Duration" to zero and enable "Wait for TriggerSync".
  5. In the OnEnter action of the state, trigger the Delay brick.
You can use the same Delay brick for multiple states, you don't have to duplicate it. (Unless you want multiple UISliders for different durations or something like that)
Ok. Thank you very much, I will try this solition today! (y)
 
Does anyone know how to do a conditional trigger with this plugin (or others)?

For example, only turn on a light when a certain segment is being played in Timeline. Any help is greatly appreciated!
 
Does anyone know how to do a conditional trigger with this plugin (or others)?

For example, only turn on a light when a certain segment is being played in Timeline. Any help is greatly appreciated!
You could probably use StateMachine LogicBrick, or you could use VUML, combined with the ActionGrouper, its also great!
 
Last edited:
You could probably use StateMachine LogicBrick, or you could use VUML, combined with the ActionGrouper, its also great!

Thanks for the reply! I've tried VUML + ActionGrouper, the problem with that combo is that I can't set the condition to a certain animation. The only conditions that existed for Timeline is "Is playing" "Paused" etc. There is no option to condition it to something like "If Segment 3 is playing".

For example, if i have a scene with 10 animation segments. Now I have to add a trigger action to all 10 of them to specify the state of an atom (ex. only have light no.2 turned on when animation 2 is playing), I am trying to find an easier way to accomplish that. Hope that makes sense. Thank you!
 
Does anyone know how to do a conditional trigger with this plugin (or others)?

For example, only turn on a light when a certain segment is being played in Timeline. Any help is greatly appreciated!
For turning on/off a light you don't need any additional plugins. Add a trigger track to your Timeline and just turn the light on at the beggining of the sequence and turn it off at the end?
However, if you want to make it a condition whether a trigger signal (e.g. from a button) is used or not, you can use a Relay brick. Same here, at the at the begining of the sequence you have Timeline enable "AcceptTrigger" on the Relay and disable again at the end. Your button (or whatever) would trigger the Relay's "Trigger", the Relay then whatever action you wanna do.
 
For turning on/off a light you don't need any additional plugins. Add a trigger track to your Timeline and just turn the light on at the beggining of the sequence and turn it off at the end?
However, if you want to make it a condition whether a trigger signal (e.g. from a button) is used or not, you can use a Relay brick. Same here, at the at the begining of the sequence you have Timeline enable "AcceptTrigger" on the Relay and disable again at the end. Your button (or whatever) would trigger the Relay's "Trigger", the Relay then whatever action you wanna do.
It's the man himself! Thanks for replying~

I've been using trigger track in Timeline, but it's very cumbersome. For example, if i have 10 different animation segments, and I only want a light to turn on during one of them. Then I have to add a trigger to all 10 of them (1 for On, and the other 9 to turn it off, otherwise when I switch between the animations it's going to be kept on). The workload goes up exponentially if I have more lights or animations. So I am trying to figure out if there is a conditional trigger like Only IF "PluginTimeline" Segment XX is playing, THEN turn on "Light No.2".

Hope this clarifies things a bit, I don't think the Relay brick can solve this issue since I also have to use trigger in all 10 animation segments.
 
So I am trying to figure out if there is a conditional trigger like Only IF "PluginTimeline" Segment XX is playing, THEN turn on "Light No.2".
Unlikely, Timeline plugin would need to provide that info in a way other plugins can access it.

Potenial ideas...depends on what you need exactly:
  • Use a StateMachine brick as central controller. Basically one State per Timeline sequence. Use the Enter/Exit triggers to trigger the sequence in Timeline and also turn on/off your light. Because StateMachine gives you that guranteed Enter/Exit, you need less triggers?
  • Add a trigger to the beginning AND end of each sequence to turn on/off your light. If you are guranteed to reach the end trigger (and not somehow exit early) that way you also would need less triggers.
  • Use IdlePoser instead of Timeline, it has a StateMachine and reliable Enter/Exit triggers build-in. Of course IdlePoser is only suited to some types of animation. (It blends from pose to pose...so, no mocap, etc.)
 
Unlikely, Timeline plugin would need to provide that info in a way other plugins can access it.

Potenial ideas...depends on what you need exactly:
  • Use a StateMachine brick as central controller. Basically one State per Timeline sequence. Use the Enter/Exit triggers to trigger the sequence in Timeline and also turn on/off your light. Because StateMachine gives you that guranteed Enter/Exit, you need less triggers?
  • Add a trigger to the beginning AND end of each sequence to turn on/off your light. If you are guranteed to reach the end trigger (and not somehow exit early) that way you also would need less triggers.
  • Use IdlePoser instead of Timeline, it has a StateMachine and reliable Enter/Exit triggers build-in. Of course IdlePoser is only suited to some types of animation. (It blends from pose to pose...so, no mocap, etc.)
Ya that makes sense!

I haven't used StateMachine Brick. I am going to watch your tutorial and get a better understanding of it.

I tried the trigger and beginning and end approach. It works for some, but not for others. Reason being a lot of my animations are short loop (penetration), and it will create a flashing effect.

Thanks again for those potential ideas! Really appreciate your help man :)
 
Ya that makes sense!

I haven't used StateMachine Brick. I am going to watch your tutorial and get a better understanding of it.

I tried the trigger and beginning and end approach. It works for some, but not for others. Reason being a lot of my animations are short loop (penetration), and it will create a flashing effect.

Thanks again for those potential ideas! Really appreciate your help man :)

Use VUML + ActionGrouper + LogicBricks.SelectChoice
  • Create all your segments in LogicBricks.SelectChoice as choices
    • Set your triggers you want for each Segment in the choices
  • Create STRING1 variable in VUML
  • In Timeline, when an animation plays set the STRING1 variable to "Segment 1" or whatever segment
  • ActionGrouper -> Execute when STRING1 changes
    • Actions
      • Set LogicBicks.SelectChoice = VUML.STRING1
      • (Optional) Turn off all lights (will be turned on in the trigger below)
      • LogicBricks.SelectChoice -> Trigger
This way it wont trigger unless the segment changes.

EDIT: Just read your other note, you can easily do this by just having 2 SelectChoices: LightON and LightOFF
 
Use VUML + ActionGrouper + LogicBricks.SelectChoice
  • Create all your segments in LogicBricks.SelectChoice as choices
    • Set your triggers you want for each Segment in the choices
  • Create STRING1 variable in VUML
  • In Timeline, when an animation plays set the STRING1 variable to "Segment 1" or whatever segment
  • ActionGrouper -> Execute when STRING1 changes
    • Actions
      • Set LogicBicks.SelectChoice = VUML.STRING1
      • (Optional) Turn off all lights (will be turned on in the trigger below)
      • LogicBricks.SelectChoice -> Trigger
This way it wont trigger unless the segment changes.

EDIT: Just read your other note, you can easily do this by just having 2 SelectChoices: LightON and LightOFF

Thanks for the reply!!! Really appreciate it.

I tried the approach above over the weekend and ran into two issues:

- It seems ActionGrouper can not execute based on the stats of STRING (there is no such option), it can only do conditional execution based on Boolean True/false.
- Even in the case this can work, it's actually a LOT more work than just adding a trigger to each timeline segment, which kind of defeats the purpose. (or maybe I'm misunderstanding the whole process)

That being said, it's awesome to see how selectChoice can work together with VUML/ActionGrouper! Mind opener!
 
Thanks for the reply!!! Really appreciate it.

I tried the approach above over the weekend and ran into two issues:

- It seems ActionGrouper can not execute based on the stats of STRING (there is no such option), it can only do conditional execution based on Boolean True/false.
- Even in the case this can work, it's actually a LOT more work than just adding a trigger to each timeline segment, which kind of defeats the purpose. (or maybe I'm misunderstanding the whole process)

That being said, it's awesome to see how selectChoice can work together with VUML/ActionGrouper! Mind opener!

Yes it is overkill for what you need.
VUML is very powerful though.
You could create a BOOL in VUML to constantly monitor when a STRING changes, and setup action grouper to execute when that BOOL changes for example.
 
Such a great set of plugins I haven't even tried most of them yet but I do have just a small suggestion maybe for next update with random animation, the sliders for speed only go up to 5 which was a bit slow for what I wanted to do so I changed them to 50 in the script:

mySpeedMin = Utils.SetupSliderFloat(this, "Speed Min (cm/s)", 0.5f, 0.01f, 50.0f, false);
mySpeedMax = Utils.SetupSliderFloat(this, "Speed Max (cm/s)", 1.0f, 0.01f, 50.0f, false);

VaM seemed to easily handle this being set at the higher level and it allows for a bit faster movement when required.

Thanks again and look forward to using these great utilities to do even more stuff!
 
@MacGruber
I'd like to suggest an update that changes the behavior of all logic bricks slightly.
If the plugin is disabled with the Enabled-toggle it should stop whatever it's doing.

I went through all bricks added a if (!enabled) return; to functions that I think are relevant.
Then tested them all with your example scenes to confirm they stop their behavior. For most bricks it's easy to change.
There may be a few checks to much or to few. Did this very fast. It does not "brick" (lol) anything with the example scenes.

I skipped the SoundFromAB brick because I wasn't sure how to stop it from triggering sound playback.
The more complex bricks like the StateMachine may need more changes stop absolutely everything if disabled.

Why change this?
  • to make it possible for a scene creator in intentionally disable a behavior temporary
  • to potentially save CPU cycles and avoid triggering a chain of things when they should be disabled anyway
It could in theory break compatibility under these (unlikely?) conditions:
  • a scene was saved with a LogicBrick plugin disabled and ...
  • things get triggered and ...
  • the old LogicBricks version the scene did depend on gets manually deleted by the user and replaced with this newer one
*link removed by me*

"if (!enabled) return;" added to...

MacGruber_Blend.cs:
Update()
Trigger()
SetValue(float v)

MacGruber_Counter.cs:
Update()
CountUp()
CountDown()
SetUp()
SetDown()

MacGruber_Delay.cs:
Update()
Trigger()

MacGruber_EventAudioQueueEmpty.cs:
Update()
Trigger()

MacGruber_EventSceneLoad.cs:
*no change* can't think of a scenario where disabling the plugin here would make sense

MacGruber_FrequencyLoop.cs
Update()
OnSettingsChanged()
UpdateNextTick()
Trigger()
SetStartToEndFrequency()
SwapFrequency()
SetFinished()

MacGruber_LinearAnimation.cs:
SetPositionA()
SetPositionB()
SetTransition(float t)

MacGruber_LoadingDelay.cs:
Update()
Trigger()

MacGruber_Loop.cs:
Update()
Trigger()

MacGruber_RandomAnimation.cs:
ResetAnchor()
Update()

MacGruber_RandomBlend.cs:
Update()
Trigger()
SetValue(float v)

MacGruber_RandomChoice.cs:
Update()
TriggerAction()

MacGruber_RandomDelay.cs:
Update()
Trigger()

MacGruber_RandomLoop.cs:
Update()
Trigger()

MacGruber_RandomSound.cs:
Update()
Trigger()

MacGruber_RandomSoundFromAB.cs:
Update()
Trigger()

MacGruber_RandomTimer.cs:
Update()

MacGruber_Relay.cs:
Update()
Trigger()

MacGruber_RelayOnce.cs:
Update()
Trigger()
Reset()

MacGruber_ScreenFade.cs:
*no change*

MacGruber_SelectChoice.cs:
Update()
TriggerAction()

MacGruber_SequenceChoice.cs:
Update()
TriggerAction()

MacGruber_SequenceMachine.cs:
Update()
UpdateCurrentStateInfo()
UpdateCurrentStateValue()

MacGruber_SoundFromAB.cs:
*no change - not sure how to disable playing sounds here if plugin disabled*

MacGruber_StateMachine.cs:
Update()
SwitchState(State newState)
// more needed?

MacGruber_Timer.cs:
Update()

MacGruber_Utils.cs:
*no change*

MacGruber_ValueEaseIn.cs:
Update()
Trigger(float v)

MacGruber_ValueEaseOut.cs:
Update()
Trigger(float v)

MacGruber_ValueInvert.cs:
Update()
Trigger(float v)

MacGruber_ValueRandom.cs:
Update()
Trigger()

MacGruber_ValueRelay.cs:
Update()
Trigger(float v)

MacGruber_ValueSmoothStep.cs:
Update()
Trigger(float v)

MacGruber_ValueThreshold.cs:
Update()
Trigger(float v)

MacGruber_ValueUpDown.cs:
Update()
PauseUp()
PauseDown()
PauseAt(bool pauseDirection)
Unpause()
Speed(float v)
Trigger(float v)
 
Last edited:
@MacGruber
I'd like to suggest an update that changes the behavior of all logic bricks slightly.
If the plugin is disabled with the Enabled-toggle it should stop whatever it's doing.
Hey. Thanks for the suggestion, but there is a reason things are this way ;)

In the VaM trigger system the caller (= my LogicBrick) is responsible for keeping to update triggers every frame. Stopping to do that could leave you with dangling Float-Timer-Triggers (not the LogicBrick, I mean those VaM-things that change values over time), which might cause issues later when you reenable the plugin 10min later, with the user not expecting there still being an active Timer-Trigger still doing things.

The intended way here is to use the "AcceptTrigger" checkbox, which of course can be set by trigger. This prevents LogicBricks from accepting new trigger signals. Many LogicBricks implement this, for those that don't you can just put a Relay brick in front.
1701796732365.png


to potentially save CPU cycles and avoid triggering a chain of things when they should be disabled anyway
Sure, theoretically you save a few cycles and cause a few cache misses. However, when there isn't actually a Timer-Trigger to update, these updates for LogicBricks are very cheap. Compared to cost of physics you will likely not even be able to measure it. If you have so many bricks (200? 1000?) so that this may become a problem, you probably should not use LogicBricks, but code your own custom plugin doing the same logic just in code. Keep in mind that disabling/reenabling a 1000 bricks all the time also would have cost.
 
@MacGruber

First of all, thank you for your genius creation. LogicBricks allows us creators to unleash our imagination almost without limits. However, I would like to report to you a bug that is very likely caused by the SoundFromAB component, which can lead to the malfunction of VAM's native UI.

When a character is equipped with SoundfromAB and Timeline, everything appears normal on the surface when the Timeline animation plays and the CUA audio file loaded by SoundFromAB is changed using triggers. However, afterwards, if another preset is loaded onto the character atom through the trigger system by reading plugin presets, the UI interface in VAM's native UI for functions such as reading plugin presets, clothing presets, etc., gets damaged and VAM must be restarted.

In case my description of this problem is not very clear, I have prepared a screen recording for you,

https://mega.nz/file/wbwjzaCb#qnBC4qkHcQpwu7LdzM2s9Cks9kzH8c743HMQfj8eMho

and you can also reproduce this bug directly in my scene.


Currently, there is a temporary workaround for this problem: before using the trigger system to replace the plugin preset on the character atom, manually open the character atom's control panel. This allows the plugin preset UI to display normally at least once, which seems to avoid the aforementioned issue.

And below is the error message generated after reading the plugin preset through triggers, obtained via the DevTools plugin. (In the native environment without DevTools, although the UI is damaged, no error messages appear.)

Code:
!> Exception NullReferenceException: Object reference not set to an instance of an object JayJayWon.ActionGrouper.OnEnable ()
UnityEngine.GameObject:AddComponent(Type)
DynamicCSharp.ScriptType:CreateBehaviourInstance(GameObject)
DynamicCSharp.ScriptType:CreateInstance(GameObject)
MVRPluginManager:CreateScriptController(MVRPlugin, ScriptType)
MVRPluginManager:SyncPluginUrlInternal(MVRPlugin, Boolean)
MVRPluginManager:SyncPluginUrl(MVRPlugin)
<CreatePluginWithId>c__AnonStorey0:<>m__0(String)
JSONStorableString:InternalSetVal(String, Boolean)
JSONStorableString:set_val(String)
JSONStorableUrl:set_val(String)
JSONStorableUrl:RestoreFromJSON(JSONClass, Boolean, Boolean, Boolean)
MVRPluginManager:LateRestoreFromJSON(JSONClass, Boolean, Boolean, Boolean)
Atom:LateRestore(JSONClass, Boolean, Boolean, Boolean, Boolean, Boolean, Boolean)
<LoadCo>c__Iterator1:MoveNext()
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)

!> Exception NullReferenceException: Object reference not set to an instance of an object MacGruber.ParentHoldLink.OnEnable ()
UnityEngine.GameObject:AddComponent(Type)
DynamicCSharp.ScriptType:CreateBehaviourInstance(GameObject)
DynamicCSharp.ScriptType:CreateInstance(GameObject)
MVRPluginManager:CreateScriptController(MVRPlugin, ScriptType)
MVRPluginManager:SyncPluginUrlInternal(MVRPlugin, Boolean)
MVRPluginManager:SyncPluginUrl(MVRPlugin)
<CreatePluginWithId>c__AnonStorey0:<>m__0(String)
JSONStorableString:InternalSetVal(String, Boolean)
JSONStorableString:set_val(String)
JSONStorableUrl:set_val(String)
JSONStorableUrl:RestoreFromJSON(JSONClass, Boolean, Boolean, Boolean)
MVRPluginManager:LateRestoreFromJSON(JSONClass, Boolean, Boolean, Boolean)
Atom:LateRestore(JSONClass, Boolean, Boolean, Boolean, Boolean, Boolean, Boolean)
<LoadCo>c__Iterator1:MoveNext()
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)

!> Exception NullReferenceException: Object reference not set to an instance of an object JayJayWon.ActionGrouper.OnEnable ()
UnityEngine.GameObject:AddComponent(Type)
DynamicCSharp.ScriptType:CreateBehaviourInstance(GameObject)
DynamicCSharp.ScriptType:CreateInstance(GameObject)
MVRPluginManager:CreateScriptController(MVRPlugin, ScriptType)
MVRPluginManager:SyncPluginUrlInternal(MVRPlugin, Boolean)
MVRPluginManager:SyncPluginUrl(MVRPlugin)
<CreatePluginWithId>c__AnonStorey0:<>m__0(String)
JSONStorableString:InternalSetVal(String, Boolean)
JSONStorableString:set_val(String)
JSONStorableUrl:set_val(String)
JSONStorableUrl:RestoreFromJSON(JSONClass, Boolean, Boolean, Boolean)
MVRPluginManager:LateRestoreFromJSON(JSONClass, Boolean, Boolean, Boolean)
Atom:LateRestore(JSONClass, Boolean, Boolean, Boolean, Boolean, Boolean, Boolean)
<LoadCo>c__Iterator1:MoveNext()
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)

!> Exception NullReferenceException: Object reference not set to an instance of an object JayJayWon.ActionGrouper.OnEnable ()
UnityEngine.GameObject:AddComponent(Type)
DynamicCSharp.ScriptType:CreateBehaviourInstance(GameObject)
DynamicCSharp.ScriptType:CreateInstance(GameObject)
MVRPluginManager:CreateScriptController(MVRPlugin, ScriptType)
MVRPluginManager:SyncPluginUrlInternal(MVRPlugin, Boolean)
MVRPluginManager:SyncPluginUrl(MVRPlugin)
<CreatePluginWithId>c__AnonStorey0:<>m__0(String)
JSONStorableString:InternalSetVal(String, Boolean)
JSONStorableString:set_val(String)
JSONStorableUrl:set_val(String)
JSONStorableUrl:RestoreFromJSON(JSONClass, Boolean, Boolean, Boolean)
MVRPluginManager:LateRestoreFromJSON(JSONClass, Boolean, Boolean, Boolean)
Atom:LateRestore(JSONClass, Boolean, Boolean, Boolean, Boolean, Boolean, Boolean)
<LoadCo>c__Iterator1:MoveNext()
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)

!> Exception NullReferenceException: Object reference not set to an instance of an object JayJayWon.ActionGrouper.OnEnable ()
UnityEngine.GameObject:AddComponent(Type)
DynamicCSharp.ScriptType:CreateBehaviourInstance(GameObject)
DynamicCSharp.ScriptType:CreateInstance(GameObject)
MVRPluginManager:CreateScriptController(MVRPlugin, ScriptType)
MVRPluginManager:SyncPluginUrlInternal(MVRPlugin, Boolean)
MVRPluginManager:SyncPluginUrl(MVRPlugin)
<CreatePluginWithId>c__AnonStorey0:<>m__0(String)
JSONStorableString:InternalSetVal(String, Boolean)
JSONStorableString:set_val(String)
JSONStorableUrl:set_val(String)
JSONStorableUrl:RestoreFromJSON(JSONClass, Boolean, Boolean, Boolean)
MVRPluginManager:LateRestoreFromJSON(JSONClass, Boolean, Boolean, Boolean)
Atom:LateRestore(JSONClass, Boolean, Boolean, Boolean, Boolean, Boolean, Boolean)
<LoadCo>c__Iterator1:MoveNext()
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)

!> Exception NullReferenceException: Object reference not set to an instance of an object JayJayWon.ActionGrouper.OnEnable ()
UnityEngine.GameObject:AddComponent(Type)
DynamicCSharp.ScriptType:CreateBehaviourInstance(GameObject)
DynamicCSharp.ScriptType:CreateInstance(GameObject)
MVRPluginManager:CreateScriptControll

<Truncated>

!> Exception NullReferenceException: Object reference not set to an instance of an object SpeechBlendControl.SyncVisemeUIs ()
SpeechBlendControl.InitUI (UnityEngine.Transform t, Boolean isAlt)
JSONStorable.InitUI ()
JSONStorable.SetUI (UnityEngine.Transform t)
UIConnector.Connect ()
UIConnectorMaster.InitInstance ()
UIConnectorMaster.CreateInstance ()
UIConnectorMaster.OnEnable ()
UnityEngine.GameObject:SetActive(Boolean)
FreeControllerV3:ShowGUI()
FreeControllerV3:set_guihidden(Boolean)
SuperController:SyncActiveUI()
SuperController:set_activeUI(ActiveUI)
SuperController:SelectController(FreeControllerV3, Boolean, Boolean, Boolean, Boolean)
SuperController:SelectController(String, String, Boolean, Boolean, Boolean, Boolean)
SuperController:SelectFreeController(String)
UIPopup:SetCurrentValue(String, Boolean, Boolean, Boolean)
UIPopup:set_currentValue(String)
SuperController:CycleSelectAtomOfType(String)
UnityEngine.EventSystems.ExecuteEvents:Execute(GameObject, BaseEventData, EventFunction`1)
LookInputModule:ProcessMousePressAlt(MouseButtonEventData)
LookInputModule:ProcessMouseAlt(Boolean)
SuperController:ProcessUI()
SuperController:Update()
 
Last edited:

Similar threads

Back
Top Bottom