Unity phone/pad自适应脚本(上)- PropertyDrawer

这个东西也没怎么用上,但是做的过程中用到不少东西,记一下。

初始的需求是想在phone和pad上用同一套ui(不然都是累死的体力活),但是如果直接缩放pad上面的ui到phone上,可能出现按钮太小点不到,字太小看不清。我总结其实常见的需求也就是把个图片放放大啦,然后调个位置什么的。就想做个UIAdaptor的脚本,里面存放phone和pad对应的两套数据。也就是4个vector3:phone和pad用到的position以及scale。

为了方便美术进行设置,想到EZGUI设动画的时候有类似的功能,就想给这四个vector3都添加两个按钮,一个是SaveTo,把当前用到的数据存到对应的变量里,一个SetTo,把当前变量的存的数值设给对应变量。

本来印象里貌似是通过一个同名+inspector的文件来定制这个UIAdaptor的inspector的,但是请教了同事,人家说可以用propertydrawer来做,试验之!

之前inspector是从整个UIAdaptor的脚本来考虑问题,这个propertydrawer是从property来考虑问题,有一点类似于定制了一个新的属性,然后凡是被这个属性修饰的变量呢,就用这种带两个按钮的形式来绘制在inspector里面。

所以我首先定义了一个新的PropertyAttribute:

[System.Serializable]

public class UIAdaptorAttribute : PropertyAttribute {     

               

}

里面其实什么内容也没有。

然后为这个属性新定制一个drawer:

using UnityEngine;

using UnityEditor;

using System.Collections;

[CustomPropertyDrawer( typeof( UIAdaptorAttribute ) )]

public class UIAdaptorAttribute_PropertyDrawer : PropertyDrawer

这里注意这个drawer文件是用到了editor的,只用在editor模式里,所以为了不影响正常运行,这个脚本需要放在Editor目录下。

然后这个类我们要实现两个方法,一个很简单:

                public override float GetPropertyHeight (SerializedProperty prop, GUIContent label)

就是这段东西占用了多高,这样后面的其他元素就加上这个偏移值,然后继续绘制。

复杂的是这个:

                public override void OnGUI ( Rect rect, SerializedProperty prop, GUIContent label )

这里面就是具体绘制了。Unity的OnGUI这套东西刚开始用有点别扭,叫ImmediateMode,谁用谁知道。

Rect这个参数传进来的是用于绘制的位置,反正从rect出发,自己复制一份rc出来,改改height,移移x,y什么的,试试就知道了,此处忽略。

首先,我想像普通的vector3一样,把这个值画出来:

EditorGUI.Vector3Field( rc, prop.name, prop.vector3Value  );

这里的这个name就是被这个属性修饰的真实变量的名字。

然后可以通过var g = prop.serializedObject.targetObject as UIAdaptor; 来获得具体操作的这个脚本。

两个按钮用这种形式来画:if (GUI.Button( rc, "SaveTo" ))  在条件里面,根据name来确定要修改或者保存g的参数即可。

注意这里要标记下发生了改变,以便让unity保存下数据:EditorUtility.SetDirty(prop.serializedObject.targetObject);

差不多就这样了。

原文地址:https://www.cnblogs.com/unionfind/p/3582945.html