// This code is part of the Fungus library (http://fungusgames.com) maintained by Chris Gregan (http://twitter.com/gofungus). // It is released for free under the MIT open source license (https://github.com/snozbot/fungus/blob/master/LICENSE) using UnityEngine; using MoonSharp.Interpreter; using System.Collections.Generic; namespace Fungus { /// /// Wrapper for a prime Lua table that persists across scene loads. /// This is useful for transferring values from one scene to another. One one LuaStore component may exist /// in a scene at a time. /// public class LuaStore : LuaBindingsBase { protected Table primeTable; protected bool initialized; protected static LuaStore instance; protected virtual void Start() { Init(); } /// /// Initialize the LuaStore component. /// This component behaves somewhat like a singleton in that only one instance /// is permitted in the application which persists until shutdown. /// protected virtual bool Init() { if (initialized) { return true; } if (instance == null) { // This is the first instance of the LuaStore, so store a static reference to it. instance = this; } else if (instance != this) { // This is an extra instance of LuaStore. We only need one in the scene, so delete this one. Destroy(gameObject); return false; } // We're now guaranteed that this instance of LuaStore is the first and only instance. primeTable = DynValue.NewPrimeTable().Table; // DontDestroyOnLoad only works for root objects transform.parent = null; DontDestroyOnLoad(this); initialized = true; return true; } #region Public members /// /// A Lua table that can be shared between multiple LuaEnvironments. /// public virtual Table PrimeTable { get { return primeTable; } } #endregion #region LuaBindingsBase implementation public override void AddBindings(LuaEnvironment luaEnv) { if (!Init()) { return; } MoonSharp.Interpreter.Script interpreter = luaEnv.Interpreter; Table globals = interpreter.Globals; if (globals == null) { Debug.LogError("Lua globals table is null"); return; } // If the fungus global table is defined then add the store to it Table fungusTable = globals.Get("fungus").Table; if (fungusTable != null) { fungusTable["store"] = primeTable; } else { // Add the store as a global globals["store"] = primeTable; } } public override List BoundObjects { get { return null; } } #endregion } }