Проблема с атрибутом в Unity

Я написал атрибут который принимает параметр типа bool, и когда я использую этот атрибут передавая туда либо true, либо false, то всё работает, но когда я передаю в качестве параметра переменную типа bool, то редактор пишет ошибку "Для нестатического поля, метода или свойства "Director.InteractableObjectConfiguration.d" требуется ссылка на объект. [Assembly-CSharp]csharp(CS0120)", я понимаю что он просит конкретный объект для чтения, но не понимаю как ему его предоставить. Подскажите пожалуйста как я можно это сделать.

пример 1 попытка использовать атрибут передавая в качестве параметра false

пример 2 попытка использовать атрибут передавая в качестве параметра переменную "_Listen"

атрибут атрибут

using System;
using System.Collections.Generic;
using UnityEngine;

public class Director : MonoBehaviour
{
    [SerializeField]
    private Task[] _Task;

    [SerializeField]
    private TaskDisplay _TaskDisplay;

    [SerializeField]
    private List<ComponentsPreviousTask> _ComponentsPreviousTasks = new List<ComponentsPreviousTask>();

    [SerializeField]
    private int _CurrentTaskIndex;

    private void Start()
    {
        _ComponentsPreviousTasks.Add(new ComponentsPreviousTask());
        _ComponentsPreviousTasks.Add(new ComponentsPreviousTask());
        _TaskDisplay = FindObjectOfType<TaskDisplay>();
        // ActivateTaks();
    }

    private void Update() {
        if(Input.GetKeyDown(KeyCode.Tab))
        {
            ActivateTaks();
        }
    }

    //Метод переключающий задачи
    public void SwitchTask(int taskIndex = 0, bool disactivateTaskInteractableObjects = false, bool destoryTaksObjects = false)
    {
        Task task = _Task[_CurrentTaskIndex];
        //Отписка от событий предыдущей задачи
        foreach (InteractableObjectConfiguration interactableObjectConfiguration in task._InteractableObjectConfigurations)
        {
            if (interactableObjectConfiguration._Listen)
            {
                foreach (InteractableObject interactableObject in interactableObjectConfiguration._InteractableObjects)
                {
                    interactableObject._Report -= InteractReport;
                }
            }
        }
        //Проверка на нужность удаления объектов предыдущей задачи
        if (disactivateTaskInteractableObjects)
        {
            //Уничтожение объектов предыдущей задачи
            foreach (InteractableObject taskInteractableObject in _ComponentsPreviousTasks[_CurrentTaskIndex]._InteractableObjects)
            {
                taskInteractableObject.SetInteractable(false);
            }
        }
        //Проверка на нужность отключения интерактивных объектов предыдущей задачи
        if (destoryTaksObjects)
        {
            foreach (GameObject taskObject in _ComponentsPreviousTasks[_CurrentTaskIndex]._TaskObjects)
            {
                Destroy(taskObject);
            }
        }
        if (taskIndex == 0)
        {
            _CurrentTaskIndex++;
            Debug.Log("P");
        }
        else
        {
            _CurrentTaskIndex = taskIndex;
            Debug.Log("P");
        }
        ActivateTaks();
    }

    //Метод активирующий задачи
    public void ActivateTaks()
    {
        if (_CurrentTaskIndex + 1 > _Task.Length)
        { return; }
        Task task = _Task[_CurrentTaskIndex];
        //Создание объектов требуемых для задачи
        foreach (GameObject taskObject in task._TaskObjects)
        {
            GameObject obj = Instantiate(taskObject);
            _ComponentsPreviousTasks[_CurrentTaskIndex]._TaskObjects.Add(obj);
        }
        foreach (InteractableObjectConfiguration interactableObjectConfiguration in task._InteractableObjectConfigurations)
        {
            //Активация интерактивных объектов требуемых для задачи
            foreach (InteractableObject interactableObject in interactableObjectConfiguration._InteractableObjects)
            {
                interactableObject.SetInteractable(true);
                _ComponentsPreviousTasks[_CurrentTaskIndex]._InteractableObjects.Add(interactableObject);
            }
            //Подписка на события
            if (interactableObjectConfiguration._Listen)
            {
                foreach (InteractableObject interactableObject in interactableObjectConfiguration._InteractableObjects)
                {
                    interactableObject._Report += InteractReport;
                }
            }
        }
        //Выбод на экран текста задачи
        _TaskDisplay.SetTaskText(task._TaskText);
    }
    public void InteractReport()
    {
        Task task = _Task[_CurrentTaskIndex];
        SwitchTask(task._NextTusk, task._DisactivateInteractableObject, task._DestroyTaskObject);
    }

    [Serializable]
    class Task
    {
        public InteractableObjectConfiguration[] _InteractableObjectConfigurations;
        public GameObject[] _TaskObjects;
        public string _TaskText;
        public int _NextTusk;
        public bool _DisactivateInteractableObject;
        public bool _DestroyTaskObject;
    }
    [Serializable]
    class InteractableObjectConfiguration
    {
        public InteractableObject[] _InteractableObjects;

        [ShowIf(false)]
        public bool _Listen;
    }

    [Serializable]
    class ComponentsPreviousTask
    {
        public List<GameObject> _TaskObjects;
        public List<InteractableObject> _InteractableObjects;
    }
}

код атрибута

using UnityEngine;

public class ShowIf : PropertyAttribute
{
    public bool _Show;

    public ShowIf(bool show)
    {
        _Show = show;
    }
}

Ответы (0 шт):