private void Setup(Canvas parentCanvas, string pickerPrompt, bool allowOffstageActors, OnActorGroupPickerResult callback)
    {
        this.parentCanvas        = parentCanvas;
        this.callback            = callback;
        this.pickerPrompt        = pickerPrompt;
        this.allowOffstageActors = allowOffstageActors;

        if (!string.IsNullOrEmpty(pickerPrompt))
        {
            pickerPromptField.text = pickerPrompt;
        }
        Util.FindIfNotSet(this, ref engine);
        tagsPanel.SetActive(false);
        noneButton.onClick.AddListener(OnNoneButtonClicked);
        playerButton.onClick.AddListener(OnPlayerButtonClicked);
        byTagButton.onClick.AddListener(OnByTagButtonClicked);
        specificActorButton.onClick.AddListener(OnSpecificActorButtonClicked);
        anyActorButton.onClick.AddListener(OnAnyActorButtonClicked);
        closeButton.onClick.AddListener(OnCloseButtonClicked);
        backFromTagsButton.onClick.AddListener(OnBackFromTagsButtonClicked);
        tagButtonTemplate.gameObject.SetActive(false);
    }
    public static ActorGroupPickerDialog Launch(Canvas parentCanvas, string pickerPrompt, bool allowOffstageActors, OnActorGroupPickerResult callback)
    {
        GameObject obj = GameObject.Instantiate(Resources.Load <GameObject>(PREFAB_PATH));

        if (parentCanvas != null)
        {
            obj.transform.SetParent(parentCanvas.transform, false);
        }
        ActorGroupPickerDialog dialog = obj.GetComponent <ActorGroupPickerDialog>();

        dialog.Setup(parentCanvas, pickerPrompt, allowOffstageActors, callback);
        return(dialog);
    }