Unity3D热更新技术-脚本(五) NGUI脚本使用
(2020年整理)Unity3D常用脚本.pptx

if(screenbutton==true) if(GUI.Button(Rect(Screen.width/2-380,Screen.height/2-190,60,50),"Scene1")){
print("You click Scene1"); Application.LoadLevel (1); screenbutton = false; }else if(GUI.Button(Rect(Screen.width/2-380,Screen.height/2-130,60,50),"Scene2")){ print("You click Scene2"); Application.LoadLevel (2); screenbutton = false; }else if( GUI.Button(Rect(Screen.width/2-375,Screen.height/2-0,50,50),"Quit")){ print("You click Quit"); Application.Quit(); } } 心得: 场景转换时,这个程序贴在按钮界面场景中。在 Build Setting(导出)(在 File 下)菜单中加 入所需场景。
var particle : GameObject;
function Start(){ DontDestroyOnLoad(this); screnbutton=true;
word = Text; Text = ""; yield WaitForSeconds (2); TypeText ();
NGUI笔记

NGUI笔记1-2、先创建UI ROOT3、-Label 受限于Widget->size的大小-Font NGUI类型字体选择NUGI里的字体,可以用FontMaker 创建Unity类型字体(用于选择动态字体)还可以从系统里拷贝一些字体(C:\Windows\Fonts)-Overflow ShrinkContent标签空间自动适应,压缩字体显示ClampContent按照字体的大小显示,超出标签框的不显示ResizeFreely横向使标签空间适应字体空间,此时不能随意控制标签框大小ResizeHeight纵向使标签适应字体空间,根据字数改变标签框高度,此时只能随意调节标签框长度-Alignment 对齐方式左、中、右、Justified 注:Justified:自动对英文扩展适应标签框,中文无效-Gradient 设置字体渐变颜色-Effect Shadow字体加阴影 OutLine字体加边框凸显4、-Sprite UISprite-Type-Sliced: 九宫切图使被拉伸的图片边角不会模糊-Tiled: 平铺使精灵里的图案均匀分布,铺满图片,适用于精灵里由各种图案组成-Flip:按照水平或垂直翻转or both5、-Panel-Alpha 控制Panel的透明度 Panel上所有组件都会受影响-Clipping-SoftClip控制Panel上内容的显示6、-Button-添加碰撞体-添加脚本UIButton-Notify 选择一个物体,指定这个物体上所有脚本中的某个方法-标签按钮、图片按钮、图片标签按钮(在图片上加碰撞体、UIButton 若要图片和标签同时相应需再添加一个UIButton/ButtonScale,并将此上的Tween Target改为标签)7、-图集由于图片单个使用会浪费性能,故将所有图片做为图集在UI里创建一个Sprite,精灵默认的图集就属于新创建的图集-UIButton脚本下-Sprites属性(Hover:鼠标划过的状态图片)这些图片要属于同一个图集-再次open Atlas给图集添加、更新或删除图片8、-Sliced 九宫切图UISprite Sliced 使被拉伸的图片边角不会模糊-Type :Sliced(修改图片的边框) 点击Edit编辑边框修改Border 值,这样仅会拉伸边框范围之内的图片可以在拉伸按钮时设置Sliced使按钮的四个角不会被拉伸,一般带有边角的图片需要当图片出现虚边时可以微调Dimensions9、-NGUI制作字体集静态字体:所用的汉字已经写在一张图片上,一张图片集合,使用图片去使用所需要的字体动态字体Font Maker-Bitmap静态字体会在某个图集里生成-Dynamic动态字体在设置过程中可以设置加粗、倾斜动态字体不会在图集里生成,使用动态字体会稍微影响性能10、-Widget及其常用属性-Pivot是中心点,做坐标的原点分水平(左中右)和垂直方向(上中下)-Depth 控制显示的优先级-Snap 让图片恢复原来的大小-Aspect 宽度与高度之比 Based On Width:只能通过宽度修改高度不能修改11、-Achor(重要) 设置物体的上下边框距离另一个控件的相对位置,使之不变方便实现控件的自适应可以设置一个锚点目标,之后相对这个锚点可以保持不变如使背景图片与相机的大小保持一致Type默认是none 设为Unified 统一的 Advanced当Unified无法满足条件时使用,可以使用4个不同的物体为Achor-Execute On Enable设置之后就不会变 OnUpdate随更新而变化-Left Right Bottom Top(物体上下左右边框)-Target's Center设定的一边是以锚点目标Center为Achor,物体到中心点的距离不变-Target's Left 物体与锚点目标左边框间距离保持不变,这样一来场景一旦改变其他边会伸缩,图片变形可控制物体到锚点目标的距离不变使物体处在与相机的相对位置(如游戏中地图的位置)(物体默认是与坐标原点保持不变的)-使UI边框的边角为原点来实现自适应12、Tween 补间动画-Toween Alpha 透明度的变化Tweener-Play Style once,Loop(0->1 0->1),Ping Pong(0->1 1->0 看起来较缓和)-Animation Curve 变化曲线,可手动改-Duration 动画时间-Start Delay 延迟播放-Ignore TimeScale 默认勾选游戏可通过TimeScale控制游戏暂停或达到游戏满动作的效果。
Unity3D脚本中文教程

Unity3D脚本中文教程 Part1 一、脚本概览这是一个关于Unity内部脚本如何工作的简单概览。
Unity内部的脚本是通过附加自定义脚本对象到游戏物体组成的。
在脚本对象内部不同志的函数被特定的事件调用。
最常用的列在下面Update 这个函数在渲染一帧之前被调用这里是大部分游戏行为代码被执行的地方除了物理代码。
FixedUpdate 这个函数在每个物理时间步被调用一次这是处理基于物理游戏的地方。
在任何函数之外的代码在任何函数之外的代码在物体被加载的时候运行这个可以用来初始化脚本状态。
注意文档的这个部份假设你是用Javascript参考用C编写获取如何使用C和Boo编写脚本的信息。
你也能定义事件句柄它们的名称都以On开始例如OnCollisionEnter为了查看完整的预定义事件的列表参考MonoBehaviour 文档。
概览常用操作大多数游戏物体的操作是通过游戏物体的Transform或Rigidbody来做的在行为脚本内部它们可以分别通过transform和rigidbody访问因此如果你想绕着Y轴每帧旋转5度你可以如下写function Update transform.Rotate050 如果你想向前移动一个物体你应该如下写function Update transform.Translate002 概览跟踪时间Time类包含了一个非常重要的类变量称为deltaTime这个变量包含从上一次调用Update或FixedUpdate根据你是在Update函数还是在FixedUpdate函数中到现在的时间量。
所以对于上面的例子修改它使这个物体以一个恒定的速度旋转而不依赖于帧率function Update transform.Rotate05Time.deltaTime0 移动物体function Update transform. Translate 0 02Time.deltaTime 如果你加或是减一个每帧改变的值你应该将它与Time.deltaTime 相乘。
unity3D学习之【NGUI】适配总结

这段时间刚完成了公司项目游戏UI的制作,游戏类型是卡牌类游戏,所以基本上所有功能模块都是离不开NGUI的。
1.分辨率的选择。
这次项目制作主称选择 640 * 960作为蓝本来做。
但是实际过程中发现不少问题。
由于iphone6马上就要上市了,在窄屏的1080 * 1920上发现UI会有很多的空白地方,感觉十分零散。
但是在宽屏的768*1024的屏幕上,空间严重挤压虽然没有出现重叠,但使人很压抑。
最后解决方法以1080 * 1920屏幕做蓝本。
其他分辨率全部下压,再以 NGUI新加的Anchors分区分块总算是总体过得去了。
2.Anchors的使用在制作一个拥有ScrollView界面中,发现panel的大小死活不合作。
最后发现新NGUI Widget添加Anchors。
可以使部件的Size属性依赖于四周的UI变动而变动。
panel的大小总算是解决了。
Grid使用Anchro定位和等比缩放,BackGround使用拉伸,总体效果不错。
但是不得不说麻烦不断,Anchor 定位Grid时发现第一次运行位置怎么也不对,各种调试,各种发布手机实测,都没有发现问题。
后来运行后,再小画面,居然自动好了。
晕,居然是Anchor组件的 RunOnlyOnce的问题,游戏第一次运行时,由于运行先后的问题导致Anchor一次不可能到真正想要的位置,所有导致首次偏差的问题。
最后解决协同手动关掉。
呼。
总算是弄完了。
--来自狗刨学习网3.ScrollView与缓存的问题目前NGUI提供两种现有实现滑动条的方法1.使用panel加上shader实现显示面板剪裁达到显示效果,加上ScrollView以及panel可以对固定Item达到一定的可控性.我在使用中,以固定Item(20个)为基准,使用IsVisible判断Item是否显示在Panel面板里面.以此实现Item交替实现缓存效果.缺点2. 滑动没有一滑到底的效果,原因ScrollView->Drag Effect会有反弹效果导致 Item没有实现交替就触发回弹效果.解决 mScrollView.restrictWithinPanel改变触发开关 , 实际效果还是没有达到一滑到底.但是可以接受.。
Unity3D常用脚本

场景转换:var screenbutton: boolean;function Start(){DontDestroyOnLoad(this);screenbutton = true;}function Update () {if(Input.GetKeyDown(KeyCode.Escape)){screenbutton = true;}}function OnGUI(){if(screenbutton==true)if(GUI.Button(Rect(Screen.width/2-380,Screen.height/2-190,60,50),"Scene1")){ print("You click Scene1");Application.LoadLevel (1);screenbutton = false;}else if(GUI.Button(Rect(Screen.width/2-380,Screen.height/2-130,60,50),"Scene2")){ print("You click Scene2");Application.LoadLevel (2);screenbutton = false;}else if( GUI.Button(Rect(Screen.width/2-375,Screen.height/2-0,50,50),"Quit")){ print("You click Quit");Application.Quit();}}心得:场景转换时,这个程序贴在按钮界面场景中。
在Build Setting(导出)(在File下)菜单中加入所需场景。
0为按钮界面。
可以无限增加场景。
}else if(GUI.Button(Rect(Screen.width/2-380,Screen.height/2-130,60,50),"Scene2")){ print("You click Scene2");Application.LoadLevel (2);screenbutton = false;复制此段程序并做修改。
NGUI官网示例详解(上)

2.最后点击Create Your UI按钮,可以在Hierachy窗口中自动生成下面的树状结构:
3.把Panel的父物体改成Anchor,如图所示:
4.把该Anchor命名为Anchor-Bottom,并为该对象添加一个空游戏对象,并命名为offset,并reset它的变换。该空游戏对象可以用于它下面子对象与该Anchor之间的偏移量。如图所示:
一、Example 1 – UIAnchor
该例子是演示NGUI中使用Anchor组件实现GUI对齐的功能。其最终效果如下:
下面一步一步实现该例子。
1.删除新建的场景的Main Camera摄像机,在图层中新建一个GUI层,接着,选择菜单上的NGUI->Create a new UI,弹出该对话框,设置如图所示:
在3D UI层级中,新建一个空游戏对象,并命名为Window,该对象用于整体调整下面GUI的移动和旋转等。如图所示:
下面来制作Window中的各个元素。首先创建背景。使用Create a widget,使用UITiledSprite,该元素可以等你放大它的范围时,它会以平铺的方式显示,这样可以大大节省资源的体积。该其参数如下:
现在,来完成当鼠标放置在按钮上面时,即onHover状态时,它的动画效果。我们以Show按钮为例子,Hide的设置类同。选择Button-show,为该按钮添加一个UIButtonPlayAnimation组件(菜单中Component->NGUI->Interaction->Button Play Animation)。添加之后,把该按钮下的Animation赋值给该组件中的Target变量,设置Trigger为OnHover,点击播放,当把鼠标放置在该按钮上时,可以看到已经有动画效果了,此时可以对比未对Hide按钮添加UIButtonPlayAnimation组件时的效果。参数如图所示:
NGUI全面实践教程

NGU U I 全(内www.d 全面实内部资料大学霸daxueba 实践料)践教程程前 言NGUI是一款Unity插件,可以帮助开发者快速的为游戏添加功能强大的UI界面。
在Unity 4.6版本发布之前,Unity内置的UI系统异常难用,因此NGUI在开发者中广受追捧。
NGUI发布于2012年初,发布者从版本1.08开始持续不断的将NGUI插件更新到现在的3.8.1版本(2015年3月23日的数据),其中经历了3次大的变革!使得NGUI插件的功能越发强大,使用起来也异常便捷,即使Unity官方在Unity 4.6中集成了最新的UI系统,也未能掩盖NGUI的光芒!最新版本的NGUI,是从版本3.6.0开始演变过来的,所以这期间各更新版本的差异只是体现在小功能的添加、修复和完善上的。
但是目前市场上流传的大部分NGUI资料,都在介绍NGUI 3.6.0之前的版本,而NGUI 3.6.0版本的变革使得这些资料显得异常过时,给大部分学习NGUI的开发者造成了学习上的障碍,也严重影响到了NGUI使用者的工作效率!本书选择直接从版本3.8.0入手,全面系统的介绍了变革后的NGUI!全书是围绕下面的组件类继承图展开讲解的,同时也考虑到了内容的相关性,相信此书能让读者快速、高效、全面的掌握NGUI!1.学习所需的系统和软件❑Window 7操作系统;❑NGUI 3.8.0;❑Unity 4.5.5及以上版本;2.学习建议大家学习之前,可以致信到xxxxxxxx,获取相关的资料和软件。
如果大家在学习过程遇到问题,也可以将问题发送到该邮箱。
我们尽可能给大家解决。
3.更多新技术如果想了解与Unity相关的更多新技术,大家可以关注我们的大学霸官网:,也可以关注本教程老师的博客:/mr_ahao。
本书结构体系图目 录第1章学习NGUI前的准备 (1)1.1 NGUI的购买/下载和导入 (1)1.1.1 找到并了解NGUI的相关信息 (1)1.1.2 导入NGUI (4)1.2 NGUI资源概述 (6)1.2.1 NGUI的使用示例 (7)1.2.2 NGUI源码 (7)1.2.3 版本介绍 (8)1.3 NGUI菜单概述 (8)1.3.1 快速设置UI对象的Depth属性 (9)1.3.2 快速创建常用的基础UI (9)1.3.3 快速赋予常用的UI组件 (10)1.3.4 快速添加补间动画相关组件 (10)1.3.5 快速打开NGUI提供的各种工具 (11)1.4 NGUI快捷菜单概述 (11)1.5 各重要组件类的继承关系(图示) (11)1.6 更合理的界面环境布局 (12)1.6.1 默认的布局方式 (12)1.6.2 修改布局的方法 (13)1.6.3 推荐的布局方式 (15)1.6.4 存储自定义布局 (16)1.7 NGUI常见的鼠标快捷操作方式 (16)1.7.1 改变UI对象的位置 (16)1.7.2 改变UI对象的角度 (17)1.7.3 改变UI对象的大小 (17)第2章基础UI组件 (19)2.1 全局UI缩放方式控制(UIRoot) (19)2.1.1 概述 (19)2.1.2 像素大小固定(Flexible) (20)2.1.3 占用比例固定(Constrained) (22)2.1.4 依平台而定(Constrained On Mobiles) (25)2.1.5 分清游戏屏幕分辨率与游戏视图宽高比 (25)2.2 自动调节UI的大小(UIRect) (26)2.2.1 概述 (27)2.2.2 自定义UI的大小(None) (28)2.2.3 与另一个UI关联(Unified) (29)NGUI全面实践教程(内部资料)——版权所有·2·2.2.4 与多个UI关联(Advanced) (35)2.2.5 应用示例——滑块雏形 (37)2.3 容器(UIWidget) (39)2.3.1 概述 (40)2.3.2 改变容器里UI对象的透明度 (41)2.3.3 对齐UI对象 (42)2.3.4 旋转UI对象(Pivot) (43)2.3.5 设置UI对象绘制顺序/接收事件的顺序(Depth) (44)2.3.6 手动调节UI的大小以及宽高比(Size和Aspect) (46)2.4 画板(UIPanel) (47)2.4.1 更高的优先级 (48)2.4.2 决定全局的绘制顺序 (49)2.4.3 全局裁剪 (49)2.4.4 其它高级设置 (50)2.4.5 显示绘制调用 (51)2.5 事件系统(UICamera) (52)2.5.1 确保事件系统正常运行的要素 (52)2.5.2 筛选可接收事件的对象 (54)2.5.3 查看当前接收事件的对象 (55)2.5.4 辅助功能设置 (55)2.5.5 触发事件的源头 (56)2.5.6 触发事件的阀值 (56)2.5.7 匹配常见触发源的特定事件 (57)2.5.8 可发送的全部事件及其处理方法 (58)第3章 NGUI可视组件 (60)3.1 显示文字信息(UILable) (60)3.1.1 字体分类——动态/静态字体(Dynamic和Bitmap) (60)3.1.2 常见的处理方式 (62)3.1.3 溢出处理 (64)3.1.4 文字特效 (66)3.1.5 格式不再一致——文字编码(BBCode) (68)3.2 显示精灵图片(UISprite) (70)3.2.1 概述(Flip和Color Tint) (70)3.2.2 直接显示——简单类型(Simple) (74)3.2.3 拉伸显示——切片类型(Sliced) (76)3.2.4 平铺显示——平铺类型(Tiled) (77)3.2.5 填充显示——填充类型(Filled) (78)3.2.6 自定义显示——高级类型(Advanced) (80)3.3 显示纹理图片(UITexture) (81)3.3.1 显示纹理图片 (81)3.3.2 显示图片的一部分 (83)·3·NGUI全面实践教程(内部资料)——版权所有3.3.3 显示任意类型的图片 (85)3.4 显示2D Sprite(UI2DSprite) (85)第4章常见UI控件 (88)4.1 按钮(UIButton) (88)4.1.1 概述 (88)4.1.2 自制按钮 (90)4.1.3 响应按钮单击事件 (93)4.2 弹出列表(UIPopupList) (94)4.2.1 概述 (94)4.2.2 自制弹出列表 (98)4.2.3 响应列表项选择事件 (99)4.3 开关(UIToggle) (100)4.3.1 概述 (100)4.3.2 自制开关(复选按钮) (102)4.3.3 单选按钮 (104)4.3.4 响应开关状态变化的事件 (105)4.4 输入框(UIInput) (107)4.4.1 概述 (107)4.4.2 自制输入框 (110)4.4.3 单行输入框 (112)4.4.4 多行输入框 (113)4.4.5 响应文本输入事件 (113)4.5 进度条(UIProgressBar) (115)4.5.1 概述 (116)4.5.2 自制进度条 (117)4.5.3 响应进度条值变化事件 (119)4.6 滑动条(UISlider) (120)4.6.1 概述 (120)4.6.2 自制滑动条 (122)4.6.3 响应滑动条值变化事件 (123)4.7 滚动条(UIScrollBar) (124)4.7.1 概述 (124)4.7.2 自制滚动条 (126)4.7.3 响应滚动条值变化事件 (127)第5章更高级的交互效果 (129)5.1 滚动视图(Scroll View) (129)5.1.1 预置UI对象——Scroll View (129)5.1.2 视图范围与裁剪效果 (130)5.1.3 拖动滚动视图的子对象 (131)5.1.4 拖动滚动视图的任意位置 (133)5.1.5 视图滚动的规则 (135)NGUI全面实践教程(内部资料)——版权所有·4·5.1.6 视图滚动的特效 (136)5.1.7 绑定滚动条 (138)5.1.8 其它辅助属性 (140)5.2 网格(Grid) (141)5.2.1 预置UI对象——Grid (142)5.2.2 排列UI对象 (142)5.2.3 排列规则 (145)5.2.4 处理禁用的UI对象 (145)5.3 表格(Table) (146)5.4 拖放操作(Drag and Drop) (148)5.4.1 拖动UI对象(UIDragDropItem) (148)5.4.2 修改被拖动UI对象的父对象(UIDragDropRoot) (150)5.4.3 呈现拖放动画效果 (151)5.4.4 将UI对象拖放到网格任意位置 (152)5.4.5 放置被拖动UI对象的容器(UIDragDropContainer) (155)5.5 游戏应用 (157)第6章高级功能 (160)6.1 数据/属性绑定(Property Binding) (160)6.1.1 绑定UI对象的属性 (160)6.1.2 绑定3D对象的属性 (162)6.1.3 属性依赖规则 (163)6.2 补间动画(Tweens) (164)6.2.1 动画的起点和终点 (165)6.2.2 动画的播放规则 (166)6.2.3 处理播放结束事件 (168)6.2.4 更多的播放控制(UIPlayTween) (169)6.2.5 更专业的动画播放控制(UIPlayAnimation) (173)6.3 按键绑定(UIKeyBinding) (174)6.3.1 绑定单个按键 (175)6.3.2 绑定组合键 (175)6.3.3 应用示例 (175)6.4 按键导向(UIKeyNavigation) (177)6.4.1 按照方向导向 (177)6.4.2 明确指定导向 (178)6.4.3 视图焦点的传递 (179)6.5 本地化系统(UILocalize) (179)6.5.1 预先准备的文件(Localization) (179)6.5.2 本地化文字 (180)6.5.3 本地化图片 (181)6.5.4 本地化所有文字和图片——语言选择(Language Selection) (183)6.5.5 使用时的注意事项 (183)·5·NGUI全面实践教程(内部资料)——版权所有6.6 事件触发器(UIEventTrigger) (184)6.6.1 可检测的常见事件 (185)6.6.2 使用示例 (185)6.7 委托与参数(Delegates & Parameters) (187)6.7.1 不限制参数个数 (187)6.7.2 示例1:引用自定义组件的属性 (190)6.7.3 示例2:设置显示的图片 (191)6.7.4 示例3:调节透明度 (192)第7章自带的工具 (194)7.1 预置体工具(Prefab Toolbar) (194)7.1.1 展示模式 (194)7.1.2 添加/删除预置体 (195)7.1.3 设置缩略图/图标 (197)7.2 图集制作工具(Atlas Maker) (199)7.2.1 制作新图集 (199)7.2.2 为已有的图集添加子图 (201)7.2.3 删除图集中的特定子图 (202)7.2.4 编辑图集中的子图(UIAtlas) (203)7.2.5 为子图添加特效 (204)7.3 字体制作工具(Font Maker) (204)7.3.1 制作静态字体 (205)7.3.2 使用自己制作的字体 (207)7.3.3 为字符添加特效(UIFont) (207)7.3.4 使用表情(图文混排) (208)7.4 面板工具(Panel Tool) (210)7.5 绘制调用工具(Draw Call Tool) (211)7.6 摄像机工具(Camera Tool) (212)7.7 UI模版工具(Widget Tool)(已过时) (212)NGUI全面实践教程(内部资料)——版权所有·6·第1章 学习NGUI前的准备NGUI是Unity最重要的插件,在Unity资源商店(Asset Store)的付费排行榜中始终名列前茅,如图1-1所示。
【Unity3D入门教程】游戏开发利器UGUI的基本使用方法

【Unity3D⼊门教程】游戏开发利器UGUI的基本使⽤⽅法前⾔UGUI是Unity官⽅推出的新⼀代交互系统,与传统的GUI相⽐,它具有使⽤灵活、界⾯美观、⽀持个性化定制的特点。
本⽂将会进⾏UGUI使⽤的简单介绍,与⼤家⼀起敲开UGUI开发的⼤门。
说到底,UGUI还是⼀种UI系统,⽬的就是帮助⽤户更好地与软件进⾏交互。
本⽂将介绍canvas、image、button等。
当学会了使⽤button和image等控件后,其他的也就可以举⼀反三地进⾏⾃学了。
1 CanvasCanvas是画布的意思,通俗来讲,UGUI的所有控件如button等都要摆放在画布上。
在Hierarchy中,button、image等控件都是Canvas的⼦物体。
在Hierarchy中点击Create——UI——Canvas,会⽣成⼀个画布,同时⽣成⼀个EventSystem。
2 Button2.1 ⽣成个性化按钮在Hierarchy中点击Create——UI——Button,会在Canvas下⽣成⼀个Button。
该Button有⼀个image组件和⼀个Button组件,改变Image组件的Source Image可以改变Button的外观。
⽽我们需要为其选择⼀个UISprite型图⽚。
假设我们在Assets⽬录下已经有了⼀个图⽚,名叫music.jpg,我们需要选中它,这时候看到Inspector中如下图。
我们需要把Texture Type类型改为Sprite(2D and UI),然后点右下⽅的“Apply”。
将进过类型转换的music图⽚拖动到Button控件的Image组件的SourceImage变量上,并点击SetNativeSize。
将Button的⼦物体Text置为空。
然后就可以看到游戏中如下的按钮了。
重新设置按钮尺⼨为width=100,height=100。
可以在Button组件中设置按钮的颜⾊。
如图我们将⾼亮时设置为黄⾊,按下时设置为蓝⾊,按钮⽆效时设置为灰⾊。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Unity3D热更新技术-脚本(五) NGUI脚本使用
学习unity也有一段时间了,从一开始的懵懵懂懂到现在的学有所小成,心里挺是高
兴的,不过目前还是处于初学者阶段,很多东西还等着自己去发掘去学习。
最近做了一个3D俄罗斯方块小游戏作为练手,花了有两个多星期吧,感觉话费太
多时间了,中间不断地修改实现的方法,但确实让自己学到很多东西,可能对有些人来说,
俄罗斯方块根本算不上什么,不过对于初学者来说,练手还是能学到很多东西的,好了,
废话不多说,接下来说说我如何完成的吧,先贴上最终的效果图--来自狗刨学习网
其实对于3D的俄罗斯方块,我觉得可以用多种方法实现的,一开始,我尝试用
unity提供的碰撞机制去做这个游戏,结果问题一个个接踵而来,解决了一个又出现了另
一个,最后只能上网找教程,网上是有网友实现了的,有一种unity实现方法是直接用
GUI,把button当作方块,虽然也能做出很好的效果,但是我觉得这样就不算3D了吧。
另外我还找到一份代码,它实现了真正意义上的3d俄罗斯方块,不过它是JS写的,
我试着看了一下代码,然后自己用C#写了一个自己的,看代码里面的注释,应该是外国的,
看完它的代码,着实让我学到很多东西,我之前想通过真正的碰撞去完成这个游戏,结果
问题多多,但是网上的这份代码提出了一种很聪明的解决方法,用两个布尔类型的数组分
别存放已经固定下来的方块和正在掉落的方块,通过判断下落方块下一个位置对应坐标的
布尔值的真假,为真则停止下落,固定位置。
另外可以将边界对应的值设为真,从而方块在碰到边界无法继续运动。在检测满一
行方块消除的时候也相当的方便,可以直接对布尔数组进行操作。这种思维让我恍然大悟,
才发现自己真的是有待提高啊。
好了,开始动手,首先你需要一个正方体模型,它的边界需要经过一些处理,在多
个相连的时候才能显现出接痕,这个我自己用Maya做了一个,很简单的。然后导入模型的
FBX文件到你的项目中。
接着创建一个新场景,在场景中创建边界,如效果图中所示,用unity自带的
Cube就可以了,改一下一些参数就可以有图中的效果,当然你也可以自己制作边界物体。
设置左边界x坐标为3,右边界为14,这不是硬性规定说得设置成这样的,这不过是方便
我编写代码而已,哦,另外,由于方块的最大size是4,所以我两边都留出了4个位置,
中间10个位置是方块可以放置的地方,底边界放置在0位置。
创建一个空物体对象命名为Manager,并为其创建一个绑定脚本Manager.cs,接着
一一创建对应方块的空对象,对其各自命名,注意,之前我导入的正方体只是方块的组成
单体,不同形状的方块需要四个正方体拼接在一起,正常俄罗斯方块游戏中有7种方块,
将这七个空物体对象创建为Prefab,一一对应命名,再接着为方块创建绑定脚本,这里,
我只需要一个脚本文件,即7种方块都绑定同一个脚本。
我试过各自做出七个不同的模型,结果,很麻烦,由于模型是一个整体,消除部分
是一个问题,然后我还要写七个脚本对应不同的方块,其实有很多东西是一样的,这简直
就是浪费时间和资源。
然后我发现了网上代码中用了一种和巧妙的方法,在绑定的脚本中,设置一个公有
的字符串数组,值只有0和1,显示出方块的形状,比如直方块,即4个正方体直线连接
在一起,这是我们需要填上字符串数组的size为4,然后string[1]的值为“1111”,其
余都为0,大家应该都明白了吧,一个方块,算上周围的空的地方围成一个正方体,必须
是正方体,不然旋转之后,你的数据没办法修改。
在Manager中创建一个公有的GameObject数组,然后把7种方块对应的Prefab拖
拽到数组里面,Manager随机生成方块,绑定方块的脚本根据字符串数组组合正方体。这
一步算是最重要的吧,根据字符串数组计算组成方块各正方体的位置,一开始就是因为老
是弄错正方体的位置所以除了点问题,还有就是旋转轴心,轴心错了也会让你接下来的步
骤漏洞百出。
首先,在之前我们创建方块空对象物体的时候,坐标都是为(0, 0, 0)的,就
以这个作为轴心点坐标,如果size是奇数的话,那么处于围绕方块大正方体中间的那个正
方体的中心就是轴心坐标,如果size为偶数的话,大正方体的中心便为轴心,以轴心坐标
确定各个正方体的位置,这是相当重要的。注意,各个正方体在方块中的坐标不同于在世
界坐标中的坐标,轴心坐标即方块在世界坐标系中的坐标,找对了轴心才能正确算出各个
正方体在世界坐标系中的坐标。
1. for(int y=0;y
4.
5. blockMatrix[y, x] = true;
6. var cube = (Transform)Instantiate(Manager.manager.cube, new Vector3(x -
childSize, childSize - y, 0), Quaternion.identity);
7. cube.parent = transform;
8.
9. }
10. }
11. }
根据字符串数组中‘1’对应的x,y与参照值做运算便可以计算出其位置了。
接着便是计算各正方体在世界坐标系中的x坐标,即方块在世界坐标中的坐标减去
(size-1)*0.5,求出方块外围正方体左上角的第一个正方体的x坐标,同样道理,这个
应该不难理解,其y坐标为已知,可根据它来确定方块的起始下落位置,参考值也是
(size-1)*0.5。哦,起始下落位置的设置也是有规律的,当size为偶数时,坐标必须是
符合规定范围内的一个整数加0.5,如果是奇数的话,中心正方体的坐标可作为方块的起
始坐标。
当方块旋转时,判断其是否可以旋转(边界等),可以旋转,则要变换方块对应的
布尔数组,跟着相同方向旋转数组即可。
当方块停止下落时,销毁方块,同时将记录下来的各个正方体的坐标对应的产生正方体,
这一步是为了接下来方便销毁满一行的正方体,修改对应的整个区域的布尔数组,上文提
到的。判断是否满一行也很简单,同一个y坐标,连续十个x坐标对应的布尔值为真即销
毁正一行的正方体,然后大于y的正方体集体下落一个单位,再继续检测。
以上已经完成游戏的大半部分了,也算是解决了一个技术难点吧,接着是运行,本
实现方法用yield来实现游戏一帧一帧的动画,初开始接触这个东西,只是普通的认为它
就是一个延缓暂停的机制。最近才知道其真正的用法。这里我们需要在Start函数中执行
我们要的操作,然后游戏就可以如我们所期望的那样运作了。其实,用Update函数也是可
以实现的,可能会麻烦一点,用yield反而比较简便。
在while(true)循环里面使用yield,满足特定条件时跳出循环,注意,请务必
设置一个跳出的特定条件,而且是程序会最终执行到那一步的,不然,程序会陷入死循环。
另外,在有些时候延缓执行或者整个程序进入等待,这里需要特别注意一下,因为
yield毕竟不能像update函数那样,在一帧一帧里实现你要的效果,稍微错漏某个地方都
会让你的游戏没法像预期那样运行,可以自己尝试着在代码中修改让后运行,根据结果的
不同可更清楚地认识了解yield的用法。还有就是yield的用法在JS与C#中大为不同,
这是需要注意的,在把JS代码重写成C#代码的时候需要特别注意这一点。
大概就这么多吧,这里附上两个代码资源,一个JS版的,一个C#版,可根据自己
的语言喜好选择,不过JS代码中有些东西跟上述的不符,不过大概原理是一样的。
声明:这篇文档时来自于【狗刨学习网】社区,是网友发布的Unity3D学习文章,如
果有什么内容侵犯了你的相关权益,请与官方沟通,我们会即时处理。