通过拖拽prefab来存储相应的路径

 更新了一下,支持数组和嵌套数据结构。

 

 1 using UnityEngine;
 2 using System.Collections;
 3 using UnityEditor;
 4 using System.Reflection;
 5 
 6 [CustomPropertyDrawer(typeof(ObjectToPathAttribute))]
 7 public class ObjectToPathDrawer : PropertyDrawer
 8 {
 9 
10     public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
11     {
12         Object target = property.serializedObject.targetObject;
13         ObjectToPathAttribute otpa = attribute as ObjectToPathAttribute;
14         System.Type objType = otpa._objType;
15 
16         string path = property.stringValue;
17         position.width = EditorGUIUtility.labelWidth * 2.0f / 3.0f;
18 
19         EditorGUI.LabelField(position, label);
20         position.x += EditorGUIUtility.labelWidth * 2.0f / 3.0f;
21 
22         Object _obj = null;
23         bool _foundObj = true;
24         if (!string.IsNullOrEmpty(path))
25         {
26             _obj = AssetDatabase.LoadMainAssetAtPath(path);
27             if (_obj == null)
28             {
29                 _foundObj = false;
30             }
31         }
32         _obj = EditorGUI.ObjectField(position, _obj, objType, false);
33         if (_obj != null)
34         {
35             path = AssetDatabase.GetAssetPath(_obj);
36         }
37         else
38         {
39             if (_foundObj)
40             {
41                 path = string.Empty;
42             }
43         }
44         position.x += EditorGUIUtility.labelWidth * 2.0f / 3.0f;
45         position.width = EditorGUIUtility.labelWidth;
46         property.stringValue = EditorGUI.TextField(position, path);
47     }
48 }
ObjectToPathDrawer
 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class ObjectToPathAttribute : PropertyAttribute
 5 {
 6     public System.Type _objType;
 7     public ObjectToPathAttribute(System.Type t)
 8     {
 9         _objType = t;
10     }
11 }
ObjectToPathAttribute
1 using UnityEngine;
2 using System.Collections;
3 
4 public class TestClass : MonoBehaviour
5 {
6     [ObjectToPath(typeof(GameObject))]
7     public string _prefabPath;
8 }
TestClass

 

 

使用上面的代码可以通过拖拽一个prefab的方式把相应的路径直接存储到public string _itemPerfabPath里,省去键盘输入步骤。不支持场景中的GameObject的拖入。

截图如下:

当prefab为空的时候的截图如下:

posted on 2014-09-04 11:40  玉生  阅读(279)  评论(0编辑  收藏  举报

导航