Unity插件之NGUI学习(8)—— Table和NGUI尺寸转换为世界坐标系尺寸
依据 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尺寸转换为世界坐标系尺寸的更多相关文章
- Unity插件之NGUI学习(4)—— 创建UI2DSprite动画
创建一个新的Scene.并按 Unity插件之NGUI学习(2)创建UI Root,并在UI Root的Camera下创建一个Panel. 然后在选中Panel,在菜单中选择NGUI->Crea ...
- Unity插件之NGUI学习(5)—— 创建Label图文混排及文字点击
创建一个新的Scene,并按 Unity插件之NGUI学习(2)创建UI Root. 准备工作,制作Font.如今Project窗体创建一个Font目录.然后从系统自带字体目录中选择自己须要的字体,我 ...
- 【学习中】Unity插件之NGUI 完整视频教程
课程 章节 内容 签到 Unity插件之NGUI 完整视频教程 第一章 NGUI基础控件和基础功能学习 1.NGUI介绍和插件的导入 6月29日 2.创建UIRoot 6月29日 3.学习Label控 ...
- Unity插件-NGUI使用教程
Unity插件-NGUI使用教程 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 NGUI 一款强大的次 ...
- Egret3D学习笔记一 (Unity插件使用)
一 官方教程: http://developer.egret.com/cn/github/egret-docs/Engine3D/getStarted/getStarted/index.html 大部 ...
- NGUI 学习笔记实战之二——商城数据绑定(Ndata)
上次笔记实现了游戏商城的UI界面,没有实现动态数据绑定,所以是远远不够的.今天采用NData来做一个商城. 如果你之前没看过,可以参考上一篇博客 NGUI 学习笔记实战——制作商城UI界面 ht ...
- NGUI使用教程(1) 安装NGUI插件
前言 鉴于当前游戏开发的大势,Unity3d的发展势头超乎我的预期,作为一个Flash开发人员,也是为Flash在游戏开发尤其是手游开发中的地位感到担忧....所以 近期一段时间都在自己学习unity ...
- NGUI 学习笔记实战——制作商城UI界面
http://www.cnblogs.com/chongxin/p/3876575.html Unity3D的uGUI听说最近4.6即将推出,但是目前NGUI等UI插件大行其道并且已经非常成熟,所以我 ...
- 【Unity插件】LitJson杂谈
距离上一次更新博客已有一段时间了,一实习就懒了,嘿嘿.这次谈一下在实习里新碰到的一个Unity插件--LitJson(也可以去官网下载最新版). 开场白 LitJson是一个开源项目,比较小巧轻便,安 ...
随机推荐
- 【Android进阶】关于PagerAdapter的使用方法的总结
PagerAdapter简介 PagerAdapter是android.support.v4包中的类,它的子类有FragmentPagerAdapter, FragmentStatePagerAdap ...
- 学习通过Thread+Handler实现非UI线程更新UI组件(转)
[Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则 ...
- poj 3662 Telephone Lines spfa算法灵活运用
意甲冠军: 到n节点无向图,它要求从一个线1至n路径.你可以让他们在k无条,的最大值.如今要求花费的最小值. 思路: 这道题能够首先想到二分枚举路径上的最大值,我认为用spfa更简洁一些.spfa的本 ...
- 经常使用Log日志打印输出
/** * log刊物 * @author Jenly * */ public class LogUtils { public static final String TAG = "Jenl ...
- 【C语言探索之旅】 第三部分第二课:SDL开发游戏之创建窗口和画布
内容简介 1.第三部分第二课: SDL开发游戏之创建窗口和画布 2.第三部分第三课预告: SDL开发游戏之显示图像 第三部分第二课:SDL开发游戏之创建窗口和画布 在上一课中,我们对SDL这个开源库做 ...
- php+sqlite cms
1 phpSQLiteCMS 最新版本 phpSQLiteCMS 2.0.4 http://phpsqlitecms.net/ 2 taoCMS 最新版本 [2.5Beta5下载地址] 需要php ...
- GotoTest
循环标签跳出循环 public class GotoTest { public static void main(String[] args) { int[][] array={ {1,20,3}, ...
- JDBC公共动作类
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sq ...
- c++内存泄漏处理(积累)
写c++程序时,常常会出现内存泄漏的问题,这里从网上找了一种非常麻烦的方法:假设想找到每一个cpp文件的内存泄漏,都必须在每一个cpp加上例如以下代码: #include <crtdbg.h&g ...
- hadoop出现namenode running as process 18472. Stop it first.
hadoop出现namenode running as process 18472. Stop it first.等等,类别似几个的出现. namenode running as process 32 ...