依据 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. TypeScript 5 Angular 2

    TypeScript 5 分钟快速入门 翻译:Angular 2 - TypeScript 5 分钟快速入门 原文地址:https://angular.io/docs/ts/latest/quicks ...

  2. Shibboleth

    1.Shibboleth是一个针对SSO的开源项目.Shibboleth项目主要应用在校园内Web资源共享,以及校园间的应用系统的用户身份联合认证.

  3. Apple Watch 1.0 开发介绍 1.1 简介 开发苹果手表

    使用Apple Watch,用户可以使用一种不显眼的方式查看信息.不用把iPhone从口袋里拿出来,就可以通过看一下手表快速获得重要信息. 作为Apple Watch的第三方app开发者,应该通过使用 ...

  4. maven插件的生命周期的详细说明(两)

    插件配置 定义解释:插件目标 当我们了解了maven插件之后.我们发现假设为每个功能编写一个独立的插件显然是不可取的,由于这些任务背后有非常多能够复用的代码.因此,把这些功能聚集在一个插件里,每个功能 ...

  5. uva 10831 - Gerg&#39;s Cake(勒让德符号)

    题目链接:uva 10831 - Gerg's Cake 题目大意:给定a和p.p为素数,问说是否存在x,使得x2≡a%p 解题思路:勒让德记号,推断ap−12≡1%p #include <cs ...

  6. SplashScreenDemo

    对Java应用最常见的抱怨就是启动时间太长.这是因为Java虚拟机花费一段时间去加载所有必需的类,特别是对Swing应用,它们需要从Swing和AWT类库代码中去抽取大量的内容. 用户并不喜欢应用程序 ...

  7. hdu4362 dp + 单调队列优化

    dp传输方程很easy需要 dp[i][j] = min{dp[i - 1][k] + abs(pos[i][j] -pos[i - 1][j]) + cost[i][j]} n行m一排 每个传输扫描 ...

  8. Google免费的SVN服务器管理VS2010代码

    原文:Google免费的SVN服务器管理VS2010代码 前言 Google免费为我们提供了代码管理的SVN服务器.首先我这里用的Win7 64的电脑系统,用VS2010进行的代码开发.这里管理代码需 ...

  9. Iterator、Iterable接口的使用及详解

    Java集合类库将集合的接口与实现分离.同样的接口,可以有不同的实现. Java集合类的基本接口是Collection接口.而Collection接口必须实现Iterator接口. 以下图表示集合框架 ...

  10. 为大型数据文件每行只能产生id

    为大型数据文件每行只能产生id 4个主要思路: 1 单线程处理 2 普通多线程 3 hive 4 Hadoop 搜到一些參考资料 <Hadoop实战>的笔记-2.Hadoop输入与输出 h ...