依据 Unity插件之NGUI学习(2),创建一个UI Root,在UI Root下创建一个Texture作为背景图,并设置图片,在Wiget下调整大小;然后在UI Root下再创建一个Panel。

在Hierarchy窗体选中Panel,然后选择菜单Component->NGUI->Interaction->Table,查看Inspector窗体,在Panel的属性中添加了UITable。

Columns 表示每行有几个元素

Direction 表示超过每列的元素后加入元素的方向

Sorting 元素排序的方式

Hide Inactive 默认勾选,全部看不到的子节点在排列时被忽略

Padding x,y方向的间隔,这里的值是基于NGUI的

创建一个Level的Prefab,在Hierarchy窗体下,加入多个Level,然后选中Panel,在Inspector中,用鼠标右击UITable,并运行Execute,就能够在预览窗体看到排列好的Table界面了。

由于Panel在Inspector窗体的坐标是能够调整的,可是它的大小也是基于NGUI的,为了能使整个Tabel界面居中放置,我必须计算其大小,然后将调整整个Panel的位置。

这里遇到一个问题,Level是用UISprite创建的,所以获得的高度和宽度也是基于NGUI的,并不是是基于世界坐标系的,UITable的Padding也相同是。

问题的关键在于,全部的NGUI控件都是基于UIWidget的,所以从源代码入手,会发现:

public override Vector3[] worldCorners

{

get

{

Vector2 offset = pivotOffset;





float x0 = -offset.x * mWidth;

float y0 = -offset.y * mHeight;

float x1 = x0 + mWidth;

float y1 = y0 + mHeight;





Transform wt = cachedTransform;





mCorners[0] = wt.TransformPoint(x0, y0, 0f);

mCorners[1] = wt.TransformPoint(x0, y1, 0f);

mCorners[2] = wt.TransformPoint(x1, y1, 0f);

mCorners[3] = wt.TransformPoint(x1, y0, 0f);





return mCorners;

}

}

其坐标和尺寸都是通过Transform.TransformPoint()方法转换的——变换位置从自身坐标到世界坐标。好了,以下就是我创建的TableTest 脚本,是挂在Panel上面的。

using UnityEngine;

using System.Collections;





public class TableTest : MonoBehaviour {



private UISprite level;

private UITable table;

private float tableWidth, tableHeight;





// Use this for initialization

void Start () {

table = GetComponent<UITable>();

level = GetComponentInChildren<UISprite>();

int columns = table.columns;

// 计算Table的row

int count = transform.childCount;

int rows = count % columns == 0 ? count / columns : count / columns + 1;

// 计算Table的宽度和高度,基于NGUI也就是自身原本的尺寸

tableWidth = columns * (level.width + 2 * table.padding.x);

tableHeight = rows * (level.height + 2 * table.padding.y);

Debug.Log("level width=" + level.width + ", height=" + level.height);

Debug.Log("table width=" + tableWidth + ", height=" + tableHeight);

// 将Table的宽度高度转换到世界坐标系的偏移

Vector3 delta = transform.TransformPoint(new Vector3(-tableWidth / 2, tableHeight / 2, 0));

transform.Translate(delta);

}



// Update is called once per frame

void Update () {



}



}

这样再执行游戏的话,就能看到整个Table会居中在整个预览窗体。

Unity插件之NGUI学习(8)—— Table和NGUI尺寸转换为世界坐标系尺寸的更多相关文章

  1. Unity插件之NGUI学习(4)—— 创建UI2DSprite动画

    创建一个新的Scene.并按 Unity插件之NGUI学习(2)创建UI Root,并在UI Root的Camera下创建一个Panel. 然后在选中Panel,在菜单中选择NGUI->Crea ...

  2. Unity插件之NGUI学习(5)—— 创建Label图文混排及文字点击

    创建一个新的Scene,并按 Unity插件之NGUI学习(2)创建UI Root. 准备工作,制作Font.如今Project窗体创建一个Font目录.然后从系统自带字体目录中选择自己须要的字体,我 ...

  3. 【学习中】Unity插件之NGUI 完整视频教程

    课程 章节 内容 签到 Unity插件之NGUI 完整视频教程 第一章 NGUI基础控件和基础功能学习 1.NGUI介绍和插件的导入 6月29日 2.创建UIRoot 6月29日 3.学习Label控 ...

  4. Unity插件-NGUI使用教程

    Unity插件-NGUI使用教程 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 NGUI 一款强大的次 ...

  5. Egret3D学习笔记一 (Unity插件使用)

    一 官方教程: http://developer.egret.com/cn/github/egret-docs/Engine3D/getStarted/getStarted/index.html 大部 ...

  6. NGUI 学习笔记实战之二——商城数据绑定(Ndata)

    上次笔记实现了游戏商城的UI界面,没有实现动态数据绑定,所以是远远不够的.今天采用NData来做一个商城. 如果你之前没看过,可以参考上一篇博客   NGUI 学习笔记实战——制作商城UI界面  ht ...

  7. NGUI使用教程(1) 安装NGUI插件

    前言 鉴于当前游戏开发的大势,Unity3d的发展势头超乎我的预期,作为一个Flash开发人员,也是为Flash在游戏开发尤其是手游开发中的地位感到担忧....所以 近期一段时间都在自己学习unity ...

  8. NGUI 学习笔记实战——制作商城UI界面

    http://www.cnblogs.com/chongxin/p/3876575.html Unity3D的uGUI听说最近4.6即将推出,但是目前NGUI等UI插件大行其道并且已经非常成熟,所以我 ...

  9. 【Unity插件】LitJson杂谈

    距离上一次更新博客已有一段时间了,一实习就懒了,嘿嘿.这次谈一下在实习里新碰到的一个Unity插件--LitJson(也可以去官网下载最新版). 开场白 LitJson是一个开源项目,比较小巧轻便,安 ...

随机推荐

  1. quick-cocos2d-x endToLua 退出会卡住

    问题: 马上赚钱,退出会出现卡住,然后清理,死界面的情况,百思不得其解,昨天在做push的时候,突然发现.在android里面弹出一个退出对话框,点击确定退出,这时候调用endtolua时,有时也会切 ...

  2. cygwin,在win中开发linux程序

    cygwin,在win中开发linux程序 http://www.cygwin.cn/site/info/show.php?IID=1001  很多用windows的朋友不习惯于用linux的开发环境 ...

  3. android ListView优化

    android ListView通过优化重用历史缓存实现.listview相应的数据适配器一般使用自己定义BaseAdapter子类,重用历史缓冲区来提高性能. 例如,下面的示例代码演示: 1.lis ...

  4. uva--165(邮资问题,dp)

    题意: 某国家发行k种不同面值的邮票,而且规定每张信封上最多仅仅能贴h张邮票. 公式n(h,k)表示用从k中面值的邮票中选择h张邮票,能够组成面额为连续的1.2.3,--n. n是能达到的最大面值之和 ...

  5. index_ss hint 使用的运行计划变化对照

    index_ss  hint 使用的运行计划变化对照 当中 buffer 代表:当前操作中发生的内存读次数,包括一致性读和当前读 尽管 emp 表记录数不多,可是buffer 读内存的次数区别还是有点 ...

  6. Block学习一门:基本使用,使用block包NSURLRequest异步请求

    首先,看一下下面的代码: void (^myFirstBlock)(int theOne,int theTwo) = ^(int theOne,int theTwo){ NSLog(@"== ...

  7. 接近带给你AngularJS - 经验说明示例

    接近带给你AngularJS列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自己定义指令 ------------ ...

  8. Minimum Sum LCM(uva10791+和最小的LCM+推理)

    L - Minimum Sum LCM Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submi ...

  9. Python学习笔记23:Django构建一个简单的博客网站(一个)

    在说如何下载和安装Django,本节将重点讨论如何使用Django站点. 一 新建project 命令:django-admin startproject mysite # 有的须要输入:django ...

  10. sqlserver缓存程序-只能使用一次清除缓存计划

    plan cache非常大.将仅仅使用一次的缓存计划清除,而不用清除整个cache. declare @sid varbinary(64) declare cur01 cursor for selec ...