英文:
Why I cant access a new attribute I created in a propertydrawer script from mono script?
问题
using UnityEditor;
using UnityEngine;
public class GapRangeDrawer : PropertyDrawer
{
float minRange;
float maxRange;
float sensitivity;
public GapRangeDrawer(float minRange, float maxRange, float sensitivity)
{
this.minRange = minRange;
this.maxRange = maxRange;
this.sensitivity = sensitivity;
}
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
if (property.propertyType == SerializedPropertyType.Float)
{
EditorGUI.BeginProperty(position, label, property);
EditorGUI.Slider(position, property, minRange, maxRange, label);
property.floatValue = RoundValue(property.floatValue);
EditorGUI.EndProperty();
}
else
{
EditorGUI.LabelField(position, label.text, "只能用于浮点数属性!");
}
}
private float RoundValue(float value)
{
return Mathf.Round(value / sensitivity) * sensitivity;
}
}
在一个脚本中:
public class CubeSpawner : MonoBehaviour
{
public GameObject cubePrefab;
[GapRangeDrawer(0.1f, 10.0f, 0.01f)]
public float gap;
}
但是 GapRangeDrawer 还不存在。
我尝试创建了自己的属性,但无法访问它。我想要创建一个自定义的范围属性。
PropertyDrawer 脚本位于 Assets > Editor 文件夹下,但我仍然无法访问新的属性。
英文:
using UnityEditor;
using UnityEngine;
public class GapRangeDrawer : PropertyDrawer
{
float minRange;
float maxRange;
float sensitivity;
public GapRangeDrawer(float minRange, float maxRange, float sensitivity)
{
this.minRange = minRange;
this.maxRange = maxRange;
this.sensitivity = sensitivity;
}
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
if (property.propertyType == SerializedPropertyType.Float)
{
EditorGUI.BeginProperty(position, label, property);
EditorGUI.Slider(position, property, minRange, maxRange, label);
property.floatValue = RoundValue(property.floatValue);
EditorGUI.EndProperty();
}
else
{
EditorGUI.LabelField(position, label.text, "Use [GapRangeDrawer] with float values only!");
}
}
private float RoundValue(float value)
{
return Mathf.Round(value / sensitivity) * sensitivity;
}
}
then in a mono script:
public class CubeSpawner : MonoBehaviour
{
public GameObject cubePrefab;
[Gap
but GapRangeDrawer is not exist.
i tried to create my own attribute but I can't access it.
i wanted to make a custom range attribute.
the propertydrawer script is under Assets > Editor folder but still I can't access the new attribute.
答案1
得分: 2
将CustomPropertyDrawer属性应用于你的PropertyDrawer类。确保此类定义在一个名为Editor的文件夹内。
[CustomPropertyDrawer(typeof(GapRangeAttribute))]
public class GapRangeDrawer : PropertyDrawer
{
...
}
你还需要创建一个`PropertyAttribute`。Unity在[Property Drawer文档页面](https://docs.unity3d.com/ScriptReference/PropertyDrawer.html)中提供了一个示例。
你的属性将类似于这样。
public class GapRangeAttribute : PropertyAttribute
{
float minRange;
float maxRange;
float sensitivity;
public GapRangeAttribute(float minRange, float maxRange, float sensitivity)
{
this.minRange = minRange;
this.maxRange = maxRange;
this.sensitivity = sensitivity;
}
}
现在你可以按照你的意图使用它。
[GapRange(0, 100, 3)]
public float someValue;
英文:
Apply the CustomPropertyDrawer attribute to your PropertyDrawer class. Make sure this class is defined inside of an Editor folder.
[CustomPropertyDrawer(typeof(GapRangeAttribute))]
public class GapRangeDrawer : PropertyDrawer
{
...
}
You also need to create a PropertyAttribute
. Unity provides an example further down the Property Drawer Documentation Page.
Your attribute will look something like this.
public class GapRangeAttribute : PropertyAttribute
{
float minRange;
float maxRange;
float sensitivity;
public GapRangeAttribute(float minRange, float maxRange, float sensitivity)
{
this.minRange = minRange;
this.maxRange = maxRange;
this.sensitivity = sensitivity;
}
}
Now you can use it in the way you intended.
[GapRange(0, 100, 3)]
public float someValue;
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论