zoukankan      html  css  js  c++  java
  • 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);

    差不多就这样了。

  • 相关阅读:
    http修改443端口,http 强制跳转https
    线程event事件函数实现红绿灯
    信号量设置
    多线程简单实例
    paramiko 实现ssh登录和sftp登录
    在同一台电脑安装python 2 和3,并且怎样安装各自的pip和模块
    ThreadingTCPServer 如何设置端口重用
    Python 变量比较
    python 多线程 并发socket实例
    python 中变量引用问题
  • 原文地址:https://www.cnblogs.com/unionfind/p/3582945.html
Copyright © 2011-2022 走看看