// Use this for initialization
    // This is given custom execution order before default time so
    // PersistentObjects are set before anything else initializes
    void Start()
    {
        player = FindObjectOfType <Controller>();
        Dialogue.DialogueActor playerActor = player.GetComponent <Dialogue.DialogueActor>();

        OnBusyStart.AddListener(player.Freeze);
        OnBusyEnd.AddListener(player.Unfreeze);

        // Have dialogue manager make this busy
        Dialogue.DialogueManager dialogue = FindObjectOfType <Dialogue.DialogueManager>();
        if (dialogue != null)
        {
            dialogue.OnConversationStart.AddListener(SetBusy);
            dialogue.OnConversationEnd.AddListener(ClearBusy);
            // add player
            dialogue.actors["Player"] = playerActor;
        }
        persistentObjects = new List <PersistentObject>(FindObjectsOfType <PersistentObject>());
        foreach (PersistentObject po in persistentObjects)
        {
            po.controller = this;
        }

        // If this scene has dictionary, load from it
        sceneKey = gameObject.scene.path;
        Dictionary <string, JObject> objectData;

        if (SceneLoader.Instance.persistentSceneData.TryGetValue(sceneKey, out objectData))
        {
            LoadPersistentObjects(objectData);
        }
        else
        {
            // If dictionary not found, create it
            SceneLoader.Instance.persistentSceneData[sceneKey] = new Dictionary <string, JObject>();
        }

        // TODO move player to entrypoint set
        int entryIndex = SceneLoader.Instance.EntrypointIndex;

        if (entryIndex >= 0 && entryIndex < Entrypoints.Count)
        {
            // HACK move player to indicated location
            Transform entryPoint = Entrypoints[entryIndex];
            player.transform.position = entryPoint.position;
            player.transform.rotation = entryPoint.rotation;
        }
    }
 private void Awake()
 {
     actor = GetComponent <Dialogue.DialogueActor>();
 }