Playmaker Forum

Bug Reporting => PlayMaker Bug Reporting => Topic started by: djinni68 on April 16, 2011, 06:10:06 AM

Title: LoadLevel and BroadcastEvent Action Bug [FIXED]
Post by: djinni68 on April 16, 2011, 06:10:06 AM
I have a script that reloads the same level if certain goals have been achieved.  However, once the level reloads (via Application.LoadLevel) the first FSM that executes a Broadcast Event Action gets the following debug log entries (the last one is the error):

BroadcastToAll
UnityEngine.Debug:Log(Object)
HutongGames.PlayMaker.Actions.BroadcastEvent:BroadcastToAll() (at Assets/PlayMaker/Actions/BroadcastEvent.cs:42)
HutongGames.PlayMaker.Actions.BroadcastEvent:OnEnter() (at Assets/PlayMaker/Actions/BroadcastEvent.cs:34)
HutongGames.PlayMaker.FsmState:OnEnter()
HutongGames.PlayMaker.Fsm:Continue()
HutongGames.PlayMaker.Fsm:Update()
PlayMakerFSM:Update()

to: FSM
UnityEngine.Debug:Log(Object)
HutongGames.PlayMaker.Actions.BroadcastEvent:BroadcastToAll() (at Assets/PlayMaker/Actions/BroadcastEvent.cs:48)
HutongGames.PlayMaker.Actions.BroadcastEvent:OnEnter() (at Assets/PlayMaker/Actions/BroadcastEvent.cs:34)
HutongGames.PlayMaker.FsmState:OnEnter()
HutongGames.PlayMaker.Fsm:Continue()
HutongGames.PlayMaker.Fsm:Update()
PlayMakerFSM:Update()

to: FSM
UnityEngine.Debug:Log(Object)
HutongGames.PlayMaker.Actions.BroadcastEvent:BroadcastToAll() (at Assets/PlayMaker/Actions/BroadcastEvent.cs:48)
HutongGames.PlayMaker.Actions.BroadcastEvent:OnEnter() (at Assets/PlayMaker/Actions/BroadcastEvent.cs:34)
HutongGames.PlayMaker.FsmState:OnEnter()
HutongGames.PlayMaker.Fsm:Continue()
HutongGames.PlayMaker.Fsm:Update()
PlayMakerFSM:Update()

MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
HutongGames.PlayMaker.Actions.SendMessage.DoSendMessage (UnityEngine.GameObject go) (at Assets/PlayMaker/Actions/SendMessage.cs:56)
HutongGames.PlayMaker.Actions.SendMessage.OnEnter () (at Assets/PlayMaker/Actions/SendMessage.cs:36)
HutongGames.PlayMaker.FsmState.OnEnter ()
HutongGames.PlayMaker.Fsm.EnterState (HutongGames.PlayMaker.FsmState state)
HutongGames.PlayMaker.Fsm.SwitchState (HutongGames.PlayMaker.FsmState toState)
HutongGames.PlayMaker.Fsm.DoTransition (HutongGames.PlayMaker.FsmTransition transition, Boolean isGlobal)
HutongGames.PlayMaker.Fsm.ChangeState (System.String eventName)
HutongGames.PlayMaker.Fsm.Event (HutongGames.PlayMaker.FsmEvent fsmEvent)
HutongGames.PlayMaker.Actions.BoolTest.OnEnter () (at Assets/PlayMaker/Actions/BoolTest.cs:26)
HutongGames.PlayMaker.FsmState.OnEnter ()
HutongGames.PlayMaker.Fsm.EnterState (HutongGames.PlayMaker.FsmState state)
HutongGames.PlayMaker.Fsm.SwitchState (HutongGames.PlayMaker.FsmState toState)
HutongGames.PlayMaker.Fsm.DoTransition (HutongGames.PlayMaker.FsmTransition transition, Boolean isGlobal)
HutongGames.PlayMaker.Fsm.ChangeState (System.String eventName)
HutongGames.PlayMaker.Fsm.Event (System.String fsmEventName)
HutongGames.PlayMaker.Actions.BroadcastEvent.BroadcastToAll () (at Assets/PlayMaker/Actions/BroadcastEvent.cs:49)
HutongGames.PlayMaker.Actions.BroadcastEvent.OnEnter () (at Assets/PlayMaker/Actions/BroadcastEvent.cs:34)
HutongGames.PlayMaker.FsmState.OnEnter ()
HutongGames.PlayMaker.Fsm.Continue ()
HutongGames.PlayMaker.Fsm.Update ()
PlayMakerFSM.Update ()
Title: Re: LoadLevel and BroadcastEvent Action Bug
Post by: djinni68 on April 16, 2011, 06:20:27 AM
Quick Followup - If I debug the FSM using the PlayMaker Editor, during the LoadLevel command, I do not experience this issue.  Is this a case of a static variable within the Huton Games framework losing its connection to the various FSMs in the scene?  I'm guessing its Fsm.FsmList?
Title: Re: LoadLevel and BroadcastEvent Action Bug
Post by: djinni68 on April 16, 2011, 09:06:24 AM
I may have found my own solution for this issue.  I've written a simple class that checks the Fsm.FsmList, and puts the count into a static variable.  Each time the scene resets, this variable is compared to the actual count, and if they are different, we reset the FsmList using the SanityCheck function (at least, I think that's what it does!).  Here's the code, and you just have to add it to a single object in your scene.

Code: [Select]
using UnityEngine;
using System.Collections;
using HutongGames.PlayMaker;

public class PlayMakerStatics : MonoBehaviour {
private static int fsmCount = 0;
private int fsmCurrentCount = 0;

// Use this for initialization
void Awake () {
if(fsmCount == 0) { // First time executing the script!
fsmCount = Fsm.FsmList.Count;
fsmCurrentCount = fsmCount;
}
else if (fsmCurrentCount != fsmCount) {
Fsm.SanityCheckFsmList();
fsmCount = Fsm.FsmList.Count;
fsmCurrentCount = fsmCount;
}
}

// Update is called once per frame
void Update () {

}
}
Title: Re: LoadLevel and BroadcastEvent Action Bug
Post by: Alex Chouls on April 16, 2011, 02:13:45 PM
Thanks! I need to do a similar check within playmaker - will add it to the next update.

SanityCheck does what you think it does. There are some editor events that are hard to catch in Unity, so SanityCheck is the fallback to make sure the FsmList is good...
Title: Re: LoadLevel and BroadcastEvent Action Bug
Post by: djinni68 on April 16, 2011, 05:36:53 PM
Happy to lend a hand, Alex.  Thanks for getting this into PlayMaker!

*EDIT* I'm an idiot and somehow thought someone named "Chris" responded.  My bad!