官方查企业的网站,网站建设好找工作吗,怎么做好营销推广,怎么自己设计wordpress主题写在前面#xff1a;写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解#xff0c;方便自己以后快速复习#xff0c;减少遗忘。五、工具栏和选择网格1、工具栏使用Unity提供的API#xff1a;GUI.Toolbar()可以创建一个工具栏。有三个参数是必须…写在前面写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解方便自己以后快速复习减少遗忘。五、工具栏和选择网格1、工具栏使用Unity提供的APIGUI.Toolbar()可以创建一个工具栏。有三个参数是必须传入的工具栏位置、当前选中的索引、所有选项列表。位置依然是Rect类型的变量工具栏位置索引为int类型变量。由于我们需要动态控制工具栏位置索引因此与之前的API相同需要创建当前索引变量第二个参数的位置传入当前变量并且让这个变量接收函数GUI.Toolbar()的返回值。第三个参数是所有选项列表可以创建一个string类型的数组将数组传入。
private int toolbarIndex 0;
private string[] toolbarInfofs new string[] {选项一,选项二,选项三 };
private void OnGUI()
{toolbarIndex GUI.Toolbar(new Rect(0, 0, 200, 30), toolbarIndex, toolbarInfofs);
}2、选择网格选择网格与GUI.Toolbar()用法差不多使用的API是GUI.SelectionGrid()前三个参数与GUI.Toolbar()相同多了第四个参数xCount表示水平方向最多显示的按钮数量当前数量为3所以可能与原来的输出没有区别。
private string[] toolbarInfofs new string[] {选项一,选项二,选项三 };
private int selGridIndex 0;
private void OnGUI()
{//相对toolbar多了一个参数xCount代表水平方向最多显示的按钮数量selGridIndex GUI.SelectionGrid(new Rect(0, 50, 200, 60), selGridIndex, toolbarInfofs, 3);
}数量为3时数量为2时数量为1时六、滚动列表和分组1、分组分组是一种批量控制控件位置的方法可以理解为包裹着的控件加了一个父对象。可以通过控制分组来控制包裹控件的位置。提供的API是GUI.BeginGroup()和GUI.EndGroup()。GUI.BeginGroup()和GUI.EndGroup()的中间写需要批量控制的控件代码GUI.BeginGroup()中必须传入位置参数中间的控件位置就是以这个位置为基准的。
public Rect groupPos;private void OnGUI()
{GUI.BeginGroup(groupPos);GUI.Button(new Rect(0, 0, 100, 50), 测试按钮);GUI.Label(new Rect(0, 60, 100, 20), Label信息);GUI.EndGroup();
}例如当位置信息输入如下时桌面上的两个控件信息就会这样显示再次修改以上的位置信息这两个控件信息就会批量跟随修改。2、滚动列表滚动列表会开辟一个窗口窗口上会有界面上这样的滚动条滚动列表使用的API是GUI.BeginScrollView()同样有GUI.EndScrollView()将需要放在滚动列表里的信息批量显示。其中GUI.BeginScrollView()有三个必须的参数。第一个参数是滚动列表在屏幕上的显示区域第二个参数是当前显示的位置(例如在滚动横向或者纵向滚动条后当前所显示的位置)是个Vector2变量。第三个参数是滚动列表中内容的总大小和位置。当第三个参数大于第一个参数时就会产生滚动条(可以以Window窗口来类别假设当前页面大小设置为是500×500(第一个参数)。那么假设此时页面里的内容量为1000×800(第三个参数)大于500×500就会产生滚动条滚动着去显示所有内容)那么当第三个参数的值小于第一个参数时就不会产生滚动条。这是因为设置了第四、五个参数这两个参数默认为false。如果想要第三个参数的值小于第一个参数时也有滚动条就把它们改为true。
public Rect scPos;
public Rect showPos;
private Vector2 nowPos;
private string[] strs new string[] {123,456, 789, 111 };private void OnGUI()
{nowPos GUI.BeginScrollView(scPos, nowPos, showPos);GUI.Toolbar(new Rect(0, 0, 300, 50), 0, strs);GUI.Toolbar(new Rect(0, 60, 300, 50), 0, strs);GUI.Toolbar(new Rect(0, 120, 300, 50), 0, strs);GUI.Toolbar(new Rect(0, 180, 300, 50), 0, strs);GUI.EndScrollView();
}七、窗口1、窗口创建窗口使用的API是GUI.Window()必要的参数有四个。第一个参数是窗口唯一的ID不要和别的窗口重复。假如重复使用就会覆盖掉之前的窗口。第二个参数是位置信息Rect类型。第三个参数是委托需要传入一个函数是用于绘制窗口用的函数(显示窗口内的控件) 重写一个函数传入即可。第四个参数是窗口名。此外还能传入自定义样式等参数这里不做演示。不同的窗口可以传入相同的委托函数也就是说id除了区分不同窗口还可以在一个函数中去处理多个窗口通过id去区分它们。委托函数内可以根据窗口id来执行不同的语句例如使用Switch case语句。委托函数中可以绘制窗口内的控件按钮、文字信息、输入框等等。
private void OnGUI()
{GUI.Window(1, new Rect(100, 100, 200, 150), DrawWindow, 测试窗口);GUI.Window(2, new Rect(100, 350, 200, 150), DrawWindow, 测试窗口2);}private void DrawWindow(int id)
{switch(id){case 1:GUI.Button(new Rect(0, 0, 30, 20), 1);break;case 2:GUI.Button(new Rect(0, 0, 30, 20), 2);break;}}2、模态窗口模态窗口除了调用API与普通窗口不同外参数等都与普通参数相同。它的API为GUI.ModalWindow()当模态窗口出现时其他任何控件都不再会响应你的鼠标类似一个警告窗口必须要处理完该窗口的逻辑时才能处理其他窗口。
private void OnGUI()
{GUI.Window(1, new Rect(100, 100, 200, 150), DrawWindow, 测试窗口);GUI.Window(2, new Rect(100, 350, 200, 150), DrawWindow, 测试窗口2);GUI.ModalWindow(3, new Rect(300, 100, 200, 150), DrawWindow,模态窗口);
}private void DrawWindow(int id)
{switch(id){case 1:GUI.Button(new Rect(0, 0, 30, 20), 1);break;case 2:GUI.Button(new Rect(0, 0, 30, 20), 2);break;case 3:GUI.Button(new Rect(0, 0, 30, 20), 3);break;}}3、拖动窗口拖动窗口就是能被拖动的普通窗口或模态窗口。窗口的API的返回值是一个Rect变量因此可以效仿之前的控件创建一个Rect变量接收这个返回值并将值传入Window函数中。但是仅仅这样设置不能拖动窗口位置赋值只是前提。为了让窗口可以被拖动还需要在委托函数中处理拖动窗口逻辑处加上GUI.DragWindow()这个API写在委托函数中可以让窗口被拖动传入Rect参数的重载左右是决定窗口中哪一部分位置可以被拖动(例如可以传入位置指定只有拖动窗口最上面一排时整个窗口可以被拖动)无参重载默认窗口中所有位置都能被拖动。
private Rect dragWinPos new Rect(400, 400, 200, 150);private void OnGUI()
{dragWinPos GUI.Window(4, dragWinPos, DrawWindow, 拖动窗口);
}private void DrawWindow(int id)
{switch(id){case 4:GUI.DragWindow();break;}
}八、自定义皮肤样式1、颜色(1)全局颜色全局颜色使用的API是GUI.color Color.red这里是将全局颜色定为红色。全局的着色颜色影响背景和文字颜色哪怕自定义style颜色也会被改变全局颜色会在之前颜色的基础上进行叠加。可以随时在后面更改全局颜色会作用在更改后的代码上。如下例所示public GUIStyle style;private void OnGUI(){GUI.color Color.red;GUI.Button(new Rect(0, 0, 100, 30), 测试按钮);GUI.Label(new Rect(0, 50, 100, 30), 测试按钮,style);GUI.color Color.white;//可以随时改后面的GUI.Button(new Rect(0, 100, 100, 30), 测试按钮,style);}(2)文本颜色文本颜色使用的API是GUI.contentColor。文本着色颜色会和全局颜色相乘所以最好单独使用。
private void OnGUI(){GUI.contentColor Color.yellow;GUI.Button(new Rect(0, 0, 100, 30), 测试按钮);GUI.Label(new Rect(0, 50, 100, 30), 测试按钮);}(3)背景颜色背景颜色使用的API是 GUI.backgroundColor。背景元素着色颜色也会和全局颜色相乘。public GUIStyle style;private void OnGUI(){GUI.backgroundColor Color.red;GUI.Label(new Rect(0, 50, 100, 30), 测试按钮);GUI.Button(new Rect(0, 0, 100, 30), 测试按钮,style);}2、整体皮肤样式整体皮肤样式使用的API是 GUI.skin。默认情况下为null使用的是系统自带的那一套皮肤样式。皮肤文件是多个GUI控件的综合体可以帮助我们整套的设置 自定义样式相对单个控件要方便一点。可以在资源文件中创建一个皮肤资源如下里面是一些熟悉的按键样式更改修改后将自己自定义的皮肤样式传入即可一件设置自定义样式。public GUISkin skin;private void OnGUI(){GUI.skin null;GUI.Button(new Rect(0, 0, 100, 30), 测试按钮);GUI.skin skin;GUI.Button(new Rect(0, 50, 100, 30), 测试按钮);}九、自动布局1、GUILayout自动布局自动布局的作用是控件不用传入位置参数不用我们来布局会以最长按钮来拉伸保证对齐。主要用于进行编辑器开发。自动布局的API是GUILayout可以运用这个API来加点使用之前的各个控件例如GUILayout.Button(123)
private void OnGUI()
{GUILayout.Button(123);GUILayout.Button(1234);GUILayout.Button(12345);
}可以看到他为我们自动排布了这三个按钮并且按钮的大小都是相同的。如果想要横向排布按钮、修改自动布局显示的区域可以使用GUILayout.BeginHorizontal()GUILayout.EndHorizontal()与GUILayout.BeginArea()GUILayout.EndHorizontal()将中间的内容包裹起来例如
private void OnGUI()
{GUILayout.BeginArea(new Rect(100, 100, 100, 100));GUILayout.BeginHorizontal();GUILayout.Button(123);GUILayout.Button(1234);GUILayout.Button(12345);GUILayout.EndHorizontal();GUILayout.EndArea();
}2、布局选项除了以上基础设置还有一些布局选项供我们使用如下分别可以设置控件的固定宽高、允许控件的最小宽高、允许控件的最大宽高、允许或禁止宽高扩展。这里说一下允许或禁止宽高的扩展。从第一点可以知道自动布局会自动帮我们把按钮对齐它会将所有控件的大小都调整为最大的那个控件大小。如果禁止宽高扩展自动布局就不会为我们进行大小调整。接下来会有一个使用示例。
private void OnGUI()
{//控件的固定宽高GUILayout.Width(300);GUILayout.Height(200);//允许控件的最小宽高GUILayout.MinWidth(50);GUILayout.MinHeight(50);//允许控件的最大宽高GUILayout.MaxWidth(100);GUILayout.MaxHeight(100);//允许或禁止宽高扩展GUILayout.ExpandWidth(true);GUILayout.ExpandHeight(false);GUILayout.ExpandHeight(true);GUILayout.ExpandWidth(false);
}布局选项的使用示例这里仅用禁止宽扩展为案例
private void OnGUI()
{GUILayout.Button(123,GUILayout.ExpandWidth(false));GUILayout.Button(1234);GUILayout.Button(1234567);
}补充知识在类前加上特性[ExecuteAlways]可以让这个类在编辑器模式下(不运行)也可以执行。
[ExecuteAlways]
public class lession10 : MonoBehaviour
{private void OnGUI(){}
}