Как сделать элемент инспектора, который зависит от переменных, установленных в инспекторе? - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь настроить простые элементы управления инспектора для настройки максимальной, минимальной и текущей переменных, но мне трудно разобраться, как можно предотвратить установку максимального значения ниже минимальной или как не допускайте установки текущего значения вне диапазона минимальных и максимальных значений. Я попытался установить переменные на static, чтобы избавиться от проблемы «ссылка на объект не установлена ​​для экземпляра объекта», но это только заменило ошибку новой: «Аргументом атрибута должно быть константное выражение, typeof выражение или создание массива выражения типа параметра атрибута ". Вот код, который у меня есть:

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

[CreateAssetMenu(fileName = "NewOptic", menuName = "ScriptableObjects/Optic", order = 1)]
public class Optics : ScriptableObject
{
    [Min(0)]
    public float minFOV;
    [Min(minFOV)]
    public float maxFOV;
    [Range(minFOV, maxFOV)]
    public float currentFOV;
}

1 Ответ

0 голосов
/ 15 марта 2020

Вы можете сделать это с 3 различными подходами:

1.Используйте const , вместо stati c переменных.

public class Optics : ScriptableObject
{
    public const float minFOV = 0;
    [Min(minFOV)]//this Min() doesn't really makes sense now, but anyway
    public const float maxFOV = 5;
    [Range(minFOV, maxFOV)]
    public float currentFOV;
}

2.Используйте свойства , чтобы увидеть ошибки во время выполнения:

public class Optics : ScriptableObject
{
    public const float minFOV = 0;
    public const float maxFOV = 5;
    [Range(minFOV, maxFOV)]
    private float _currentFOV;
    public float currentFOV
    {
        get => _currentFOV;
        set
        {
            if (value > maxFOV || value < minFOV)
                Debug.Log("ERROR");
            else
                _currentFOV = value;
        }
    }
}

3. Идея Эмануэля, которая является правильной, за исключением одной вещи, вам не нужно MonoBehaviour, потому что ScriptableObjects также есть OnValidate метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...