Я бы не рекомендовал , используя Отражение здесь, как предлагают другие!
Отражение всегда довольно медленное, особенно когда вы собираетесь получить доступ и изменить значения вваш список на основе фреймов - это не лучшая идея.
Единственное (и единственное) преимущество курса: (После того, как вы наконец-то реализовали необходимое отражение и дополнительный EditorScript!), параметры заполняются автоматически для каждогосписок в классе.
Огромный недостаток: вы должны повторять это и реализовывать новый скрипт редактора каждый раз, когда MonoBehaviour нуждается в этой функциональности.
Вы можете использовать простой enum
и Dictionary
вместо этого, который идет с минимальными затратами на добавление соответствующих имен списков к enum
и к Dictionary
как
[Serializable]
public class BOAT
{
public enum ListType
{
DefendInventory,
AssistInventory,
MiscInventory
}
public List<BlockScriptableObject> DefendInventory = new List<BlockScriptableObject>();
public List<BlockScriptableObject> AssistInventory = new List<BlockScriptableObject>();
public List<BlockScriptableObject> MiscInventory = new List<BlockScriptableObject>();
public Dictionary<ListType, List<BlockScriptableObject>> ListByType;
// Initialize the Dictionary in the default constructor
public BOAT()
{
ListByType = new Dictionary<ListType, List<BlockScriptableObject>>
{
{ListType.DefendInventory, DefendInventory},
{ListType.AssistInventory, AssistInventory},
{ListType.MiscInventory, MiscInventory}
};
}
}
Затем для доступа и изменения определенного списка, который вы установилитип enum через инспектора в вашем скрипте
// gives you a Dropdown for available ListType values
// in the Inspector
public BOAT.ListType listToChange;
...
var listToBeChanged = someBoat.ListByType[listToChange];
Используя это, инспектор обрабатывает все это автоматически, и этоrks в редакторе и во время выполнения без каких-либо дополнительных затрат.
Маленький демонстрационный код
public class blarf : MonoBehaviour
{
public BOAT.ListType listToChange;
public BOAT boat;
public List<BlockScriptableObject> currentList;
// only for the demo (later you would rather do this in a Property)
// update the current accessed and changed list according to the
// selected ListType
private void Update()
{
currentList = boat.ListByType[listToChange];
}
}
![enter image description here](https://i.stack.imgur.com/iTDqD.gif)