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