protected void _ColorField(ref Rect rect, UnityObject obj, Color color, Action <Color> changed)
        {
            rect.width = 32;
            ScopeChange.Begin();
            var _color = UnityEditorEditorGUI.DoColorField(rect, obj.GetInstanceID(), color, true, true, false);

            if (ScopeChange.End())
            {
                EditorHelper.Dirty(obj, () => {
                    changed(_color);
                });
            }
            rect.x += rect.width + 4;
        }
        protected void _ObjectField <T>(ref Rect rect, T obj, Action <T> changed) where T : UnityObject
        {
            if (objectField == null)
            {
                objectField              = new GUIStyle(EditorStyles.objectField);
                objectField.padding.top  = 1;
                objectField.padding.left = 2;
            }
            rect.width = 33;
            ScopeChange.Begin();
            var id = go.GetInstanceID();
            var t  = obj != null?obj.GetType() : typeof(T);

            var _obj = UnityEditorEditorGUI.DoObjectField(rect, rect, id, obj, t, null, null, false, objectField);

            if (ScopeChange.End())
            {
                EditorHelper.Dirty(go, () => {
                    changed((T)_obj);
                });
            }
            rect.x += rect.width + 4;
        }