首页 > 解决方案 > 你如何制作一个依赖于检查器中设置的变量的检查器元素?

问题描述

我正在尝试设置简单的检查器控件来调整最大值、最小值和当前变量,但我很难弄清楚如何防止将最大值设置为低于最小值,或者如何防止当前值被设置在 min-max 范围之外。我尝试将变量设置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;
}

标签: c#unity3d

解决方案


您可以使用 3 种不同的方法来做到这一点:

1.使用const,而不是静态变量。

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方法。


推荐阅读