c# - 你如何制作一个依赖于检查器中设置的变量的检查器元素?
问题描述
我正在尝试设置简单的检查器控件来调整最大值、最小值和当前变量,但我很难弄清楚如何防止将最大值设置为低于最小值,或者如何防止当前值被设置在 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;
}
解决方案
您可以使用 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
方法。
推荐阅读
- javascript - 具有共享名称的 Javascript 对象
- arrays - 通过对象数组映射在 React 中不起作用
- regex - 我想使用正则表达式匹配 Python 中的两个 Url,但是下面的代码给出了错误。我不知道为什么
- c# - 无法从 WPF WebBrowser 访问生成的 DOM
- neo4j - 如何过滤查询中相对于其他节点的多个日期?
- c++ - 我可以在 C++ 上做什么来做一个数字的倒数?
- php - cURL 输入到 DOMDocument UTF-8
- javascript - 500 行对于 React 组件来说太大了吗?
- codenameone - 在 CSS 和不需要的文件中添加数据文件
- bazel - 如何使用 bazel 查询获取 BUILD 文件中的所有测试规则类型?