- Home /
Custom Editor Vector3Field not working
Hello!
This is the first time I am trying to build a custom inspector and honestly I am overwhelmed by the many classes and definitions. EditorGUI, EditorGUILayout, EditorWindow... I followed a few different tutorials, e.g. this one but I can't get it to work.
I am trying to display two Vector3 fields from a certain class as Vector3Fields like in the default transform inspector. So not exactly complicated (I thought...).
Here is my class:
using UnityEngine;
using System.Collections;
[System.Serializable]
public class VectorAndMod : MonoBehaviour {
public Vector3 vector;
public Vector3 mod;
}
And here is my Editor class:
using UnityEngine;
using UnityEditor;
using System.Collections;
[CustomEditor(typeof(VectorAndMod))]
class VectorAndModEditor : Editor {
public override void OnInspectorGUI () {
VectorAndMod vectorAndMod = (VectorAndMod) target;
vectorAndMod.vector = EditorGUILayout.Vector3Field ("Vector", vectorAndMod.vector);
vectorAndMod.mod = EditorGUILayout.Vector3Field ("Mod", vectorAndMod.mod);
if (GUI.changed)
EditorUtility.SetDirty (vectorAndMod);
}
}
What am I missing? Thanks in advance!!!
Answer by Jessespike · Dec 16, 2014 at 06:23 PM
Look at PropertyDrawers http://docs.unity3d.com/Manual/editor-PropertyDrawers.html
Ok, thanks so far! I tried it with PropertyDrawers and am making progress.
However now I get the error:
$$anonymous$$ismatched types in SetValue
UnityEditor.SerializedProperty:set_vector3Value(Vector3)
VectorAnd$$anonymous$$odDrawer:OnGUI(Rect, SerializedProperty, GUIContent) (at Assets/Editor/VectorAnd$$anonymous$$odDrawer.cs:26)
UnityEditor.DockArea:OnGUI()
Also my layout looks really messed up:
This is my code for the PropertyDrawer class code:
using UnityEngine;
using UnityEditor;
using System.Collections;
[CustomPropertyDrawer(typeof(VectorAnd$$anonymous$$od))]
public class VectorAnd$$anonymous$$odDrawer : PropertyDrawer {
// Draw the property inside the given rect
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
// Using BeginProperty / EndProperty on the parent property means that
// prefab override logic works on the entire property.
EditorGUI.BeginProperty(position, label, property);
// Draw label
position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);
// Don't make child fields be indented
int indent = EditorGUI.indentLevel;
EditorGUI.indentLevel = 0;
// Calculate rects
Rect vectorRect = new Rect(position.x, position.y, position.width, position.height);
Rect modRect = new Rect(position.x, position.y, position.height, position.height);
property.vector3Value = EditorGUI.Vector3Field(vectorRect, "Vector", property.FindPropertyRelative("vector").vector3Value);
// Set indent back to what it was
EditorGUI.indentLevel = indent;
EditorGUI.EndProperty();
}
}