unity3d2017入门
2017-10-31 22:39:00 weixin_34194702 阅读数 73

Unity3d引擎的新纪元——Unity3d 2017

 

来源 http://blog.csdn.net/dark00800/article/details/75209544

 

Unity3d不久之前正式发布了Unity3d 2017.1, 这个版本的发布也宣告了Unity3d正式告别了5.x时代,并且开始已年份直接命名,开启了新的纪元。那么Unity3d 2017相较上一版本到底有哪些改进呢?

这介绍这些改进之前先放出下载地址:Unity 2017.1 
有趣的是通过Unity产品蓝图我们可以发现Unity 2017.2 beta已经提供下载测试并且Unity 2017.3也已经在制作中了。 
这里写图片描述
Unity 2017.2 beta下载地址:Unity 2017.2 beta

以下关于Unity2017.1的介绍内容来自Unity官方中文社区,原帖地址:[官方] Unity 2017.1正式版发布

Unity 2017.1中包含大量新功能与改进。主要内容如下:

  • 艺术家和设计师们:全新的叙事和游戏视频创作工具 
    Unity 2017.1为艺术家和设计师们提供了全新的工具,使用Timeline,Cinemachine和Post-processing工具,可以创造令人惊叹的影视内容,合成精美相机镜头,描绘更好的视觉故事。 
    Timeline是一款强大的可视化新工具,可用于创建影视内容,例如过场动画、预告片、游戏试玩视频等等。 
    Cinemachine是一个高级相机系统,您可以像电影导演一样,在Unity中合成镜头,无需编写任何代码,引领您进入程序化摄影时代。 
    Post-processing可以很方便地为场景应用各种逼真滤镜,使用电影工业级技术、控件和颜色空间格式来创造高质量视觉效果,让画面更生动、更逼真,助您描绘更好的视觉故事。
  • 效率:协作、实时操作分析、工具 
    我们发布了Unity Teams,它由一系列简化创作者协作流程的功能和解决方案组成,包含Collaborate多人协作(现已发布)和Cloud Build云构建。 
    实时操作分析系统引入了新的、更简单的方法,帮助您理解用户,并在不需要重新部署的情况下,对游戏做出动态的反应和调整。 
    最重要的是,Unity 2017.1对编辑器进行了大量更新,包括对FBX导入、动画工作流程、2D功能、Asset Bundle工作流和Visual Studio集成的改进。
  • 图形与平台:全面改进 
    Unity 2017.1对粒子系统和Progressive Lightmapper进行了大量改进,提供了更多选择来实现您的艺术愿景并控制性能。不同平台可采用不同的渲染品质,例如iOS平台上的Deferred Rendering,和PC上的NVIDIA VRWorks。 
    这些都只是Unity 2017.1的亮点概念,下面将介绍完整丰富的细节内容!

Unity 2017.1新看点

艺术家叙事工具: Timeline和Cinemachine介绍

设计师、艺术家或动画师们可以使用新的集成叙事工具,自己制作影视内容和游戏视频,而不用依赖程序员。这意味着开发效率更高,而节约沟通与排队成本。

Timeline是一款强大的可视化新工具,可用于创建影视内容(例如短片Adam)。通过编排游戏对象、动画、声音和场景,来创建过场动画、游戏视频等等。有了Timeline,您可以专注于叙事和电影艺术创作,而非编码。

Timeline基于轨道的序列工具,使用“拖放”操作来编排动画、声音、事件、视频等元素,以更快地创建漂亮的过场动画和程序化内容。Timeline有许多功能,例如动画、音频、自动关键帧,以及可以锁定或静音特定轨道的多轨道界面。Timeline可通过Playable API进行扩展,支持创建自定义轨道,来驱动游戏中的任意系统。您可以制作一个Timeline剪辑来表示几乎所有内容——并且可以重复播放、缩放和混合这些剪辑,所有这些都可在Timeline中实现。 
这里写图片描述

Cinemachine 是多年游戏和电影摄像机的构建经验凝聚而成的结晶。现在,它将业界领先的摄像操作置于所有人手中,引领了程序化摄影的时代。

这是一套智能摄像机,可以动态的根据场景组成和交互,在最佳时间拍摄最佳镜头。使您摆脱无尽的手工动画、摄像机编程以及修订的过程。

Cinemachine可以在Asset Store资源商店中下载,现在就添加到您的项目中。

从第一人称射击游戏到第三人称动作冒险,您可以用Cinemachine彻底改变游戏内摄像机。很容易地:

  • 像电影导演那样,使用高级摄像机工具及真实的摄像机设置,来控制视频序列。
  • 合成镜头,把重点放在艺术方向上,而非实现细节。给Cinemachine智能摄像机一个简单的指示,比如跟随人物的头部,如果动画发生变化,镜头会自动更新并继续正常工作。 
    这里写图片描述

    在Unity 2017.1中,我们为Cinemachine增加了很多新功能,比如:

  • 多个目标对象:以多个对象为目标,并设置它们的权重。它基于任意数量的对象创建一个逻辑组,根据其成员的位置来定位自己。在跟踪一组对象时,可以将其用作LookAt和Follow方法的目标。对2D场景也非常适用。
  • 动态取景多个对象:该功能将基于对象的位置自动取景一组目标。如果对象散开,Cinemachine将根据您创建的一套规则调整FOV或推拉(或两者同时进行)
  • 全新开放API:轻松定制Cinemachine配置,获得项目需要的摄像机行为。
  • 推拉轨道:创造出像电影一样的推拉镜头,让摄像机在游戏世界里平滑移动。适合于电影序列,或当您希望摄像机沿着一组轨道跟踪拍摄对象时。
  • 安全镜头:安全镜头会根据镜头优先级与质量,动态选择最佳的摄像机。有东西进了取景框,破坏了镜头?没问题,Cinemachine会切换到下一个最佳摄像机。尤其适用于回放或任何一个可变场景的电影序列。

Timeline和Cinemachine结合使用,您可以将叙事带入更高的层次。使用后处理栈来进一步创建特效,烘托场景氛围和戏剧效果。 
这里写图片描述

改进Post-processing栈(测试)

Post-processing将全屏滤镜和特效应用于摄像机的图像缓冲区,然后再将其显示在屏幕上。您可以使用图像后处理特效来模拟物理摄像机和电影效果。

最新版的Post-processing栈测试版可以在此下载。最终版预计将于今年夏季发布。(注意:上一个稳定版本可以在Asset Store资源商店中下载)

改进后的后处理栈将一组完整的图像效果整合到单个后期处理流程中,并带有一系列高质量的摄像机效果:

  • Screen-space anti-aliasing
  • Auto Exposure
  • Motion Blur
  • Bokeh Depth of Field
  • Bloom
  • Color Grading
  • Chromatic Aberration
  • Film Grain
  • Vignette

您可以将多个特效组合到单个Pass中,使用基于Asset的预设配置系统管理特效也非常轻松。

颜色分级效果是一种支持Academy Color Encoding System (ACES)的全HDR颜色管线,低端平台可以使用LDR管线。该栈有两个屏幕空间的光照特效,即环境光遮蔽和屏幕空间反射。

这个新版本还提供了一个基于体积的混合特性,您可以在场景中定义区域(任何类型的网格),并在玩家进入区域时设置特定的氛围/外观。Unity会自动在体积之间进行混合,以实现流畅的外观转换。 
这里写图片描述

Unity Collaborate多人协作已正式发布!现为Unity Teams一员

Unity Collaborate多人协作已结束测试,与Cloud Build云构建一起成为Unity Teams的一部分,仅用一个解决方案一套功能,即可帮助您更快速地进行团队协作。Unity Teams将可免费使用至2017年10月。

点击了解有关Unity Teams的更多内容。

对于Collaborate多人协作,我们在Unity 2017.1中发布的首个发布版本优先处理了Beta用户提供的反馈。除了性能改进、稳定性和Bug修复之外,我们还增加了一组新功能:选择性推送、更佳的Asset浏览器集成和一个新的“In Progress”功能,用以标志团队成员在某个场景或预制件上有未发布的本地更改。 
这里写图片描述

以下是我们为Collaborate多人协作添加的一些新功能:

  • In Progress标志 
    为场景和预制件添加了In Progress标志,以指示团队中其他人已对某个场景或预制件做出了一些未发布的本地更改。这个特性有助于协作者协调对场景和预制件的更改。 
    这里写图片描述 
    这里写图片描述

  • 右键单击选择发布 
    我们添加了右键单击操作,现在您可以在项目浏览器中直接发布、恢复、查看差异,解决文件冲突。这是一个主要的用户痛点源头,我们希望使Collaborate的行为与其他项目浏览器的行为更加一致。请注意,这种UX允许您选择性地发布已更改的Asset。之前的版本中,您必须发布所有更改。 
    这里写图片描述

  • 浏览体验更佳 
    在项目浏览器的“收藏”中添加了新的过滤器,包括“所有修改”、“所有被排除”和“所有冲突”,这样用户就可以看到他们所有修改过的文件、所有正在修改的文件、带有冲突的文件和忽略的文件。特别要留意的是“All in Progress(一切都在进行中)”,这让您可以实时看到Collaborate团队中的其他人正在处理哪些Asset(稍后将详细介绍)。 
    这里写图片描述

  • 实时操作分析 
    Unity 2017.1可以通过数据驱动的实时操作,随时获得丰富的分析数据。深入了解您的用户与您作品的互动情况,并实时做出相应的调整,迎合他们的习惯,无需重新部署新版本。在Unity 2017中,您可以更好地为用户提供更佳的游戏体验。 
    通过Standard Events (目前是Beta版)可以进行更高效的洞察,它提供了一组精心设计的预定义事件,可揭示与您游戏相关的重要信息。使用新的Analytics Event Tracker,无需代码即可实现这些功能。 
    这里写图片描述 
    使用Remote Settings特性,可以即时更改游戏,无需重新部署,该特性已添加到Unity Analytics分析服务中。 
    这里写图片描述

  • 2D改进 
    在Unity 5.6中,我们为2D游戏开发者对工具和工作流程进行了重大改进。Unity 2017.1中引入了2D Sprite Atlas,这是一种新的Asset,将取代Sprite Packer。随着它的出现,新改进的工作流程可以在运行时更好地控制精灵的打包和使用。图集是Unity中2D工作流程的重要组成部分,而精灵图集不仅提供了更简单的图集创建和管理方式,还有相应的脚本API,可获得更多的控制和用途。 
    这里写图片描述
    Sprite Masks用于在世界空间中隐藏或显示精灵或精灵组的一部分。精灵遮罩仅对拥有Sprite Renderer组件或粒子系统的对象生效。 
    这里写图片描述 
    在Unity 2017.1中,我们还为精灵编辑器添加了精灵物理形状。可以为精灵设置自定义的默认形状,以使用PolygonCollider2D生成碰撞器形状。

  • 动画改进 
    我们对Animation窗口进行了全面修改,改进了关键帧的工作流程,使动画制作更方便和熟练,并支持与Animator状态机进行交互。Performance Recording是一个实验性功能。 
    新的关键帧工作流程支持明确指定何时将哪帧变为关键帧,并在重新评估/预览动画时,将所有未修改且未关键帧化的属性值都丢弃。我们已经改变了在Animation窗口中编辑剪辑的默认行为(新的默认预览模式)、视觉反馈和全局关键帧操作热键。这些变化的目的是在Animation窗口之外为关键帧操作提供一个流畅的工作流程,同时预览动画剪辑无需处于自动关键帧或录制模式下。 
    现在在编辑器中可以对状态机行为进行调试。 
    我们还引入了GameObjectRecorder,这是一个新的实验性编辑器特性,它允许您记录GameObject和它子对象上的任何属性。这样就可以轻松地创建动画,将被记录的所有内容保存到一个动画剪辑中。欢迎访问论坛进行反馈。 
    这里写图片描述

  • Playables已正式发布 
    Playables API通过使用树状结构的PlayableGraph组织和评估数据来源,提供一种创建工具、特效或其他游戏机制的方法。PlayableGraph允许您混合和修改多个数据源,合成为单一输出后播放。 
    Playables API支持动画、音频和脚本。Playables API还提供了通过脚本来与动画系统和音频系统进行交互的能力。 
    Playable API是一个通用API,它最终将用于视频和其他系统。查看文档了解更多细节。

  • Ambisonic音频 
    在Unity 2017.1中,我们增加了对环绕立体声音频剪辑的支持,这是全方位环绕音频技术,它(除了水平面外)还覆盖了听众上方和下方的声源。 
    Ambisonics以多声道格式储存。它不是将每个通道都映射到一个特定的扬声器,而是以一种更通用的方式来表示声场。然后,根据聆听者的方向(即XR中用户的头部旋转),旋转声场。声场也可以被解码成一种与扬声器设置相匹配的格式。Ambisonics通常与360度视频结合使用,也可以用作音频天空盒,表现遥远的环境声音。 
    我们还添加了Ambisonic解码器插件,而且现在也可以使用正开发中的API,在新的叙事工具Timeline中使用音频剪辑了。

  • 编辑器改进 
    我们在UnityEditor.IMGUI.Controls中添加了一个新的ArcHandle类,它可以在场景视图中交互式地编辑弧线。还加入了名为SearchField的新IMGUI控件,它带有普通和工具栏用户界面风格,但也可以自行定制。 
    这里写图片描述 
    现在还支持使用JetBrains Rider作为外部脚本编辑器。 
    其他改进还包括对所有播放器循环阶段添加分析器标签,改进Package Export加载状态,以及记录已连接玩家的日志信息,这些都将出现在编辑器控制台中,使调试更加轻松。

  • 改进了对Visual Studio的支持,包括Mac OS 
    Unity安装程序现在可以选择在Windows上安装Visual Studio Community 2017(而非Visual Studio Community 2015)。安装速度显著提高也更轻量。 
    Mac用户也别难过,现在可以使用Visual Studio了!微软发布了Mac版的Visual Studio和Tools for Unity。Visual Studio for Mac还提供了许多很酷的功能:一键调试,Unity消息的IntelliSense(完整Unity特定库代码),着色器代码高亮显示等等(点此查看详情)。

  • 场景与Asset Bundle改进 
    我们对游戏中的场景和Asset Bundle进行了一些改进。更改底层架构使场景和Asset Bundle加载速度更快,从而使玩家体验更加流畅。我们还创建了一个工具,Asset Bundle浏览器——以帮助创建和优化Asset Bundle。

  • Asset Bundle浏览器 
    Asset Bundle浏览器的Beta版与Unity 2017.1一同发布。该工具允许您在Unity项目中查看和编辑Asset Bundle的配置。它的目的是替换当前选择Asset的工作流,并在检视窗口中手动设置Asset Bundle的工作流程。现在您可以集中查看所有的Asset Bundle配置。通过使用上下文菜单和拖放功能,配置、修改和分析相关资源包。 
    该工具将标记可能值得关注的警告,并提示将中断资源包创建的错误。从上层查看包集合,您可以更有效地组织Asset Bundle。在更低层查看单个Asset Bundle,您可以看到由于显式包含或依赖项的关系,哪些内容将会放入包中。 
    更多细节请查阅文档。 
    这里写图片描述 
    Asset Bundle浏览器可以从Asset Store资源商店下载。

  • 脚本运行时升级(实验性):畅享 C# 6和.NET 4.6 
    在Unity 2017.1中,我们引入了实验性版本的脚本运行时内核,该内核已升级到Mono/.NET 4.6运行时。它包含了许多修复、性能改进,可以使用C# 6。我们相信它会提高游戏的整体性能。 
    可以在Player Settings中启用.NET 4.6: 
    这里写图片描述 
    注意,更改该设置会在重启编辑器后生效,因为它会影响编辑器和播放器。对应的脚本API是PlayerSettings.scriptingRuntimeVersion属性。 
    IL2CPP完全支持新的.NET 4.6 API,因此您仍可使用C#编写脚本,同时享有原生C++的性能优势。如果您发现任何问题,请访问论坛进行反馈。

  • 模型导入器改进 
    从像Maya这样流行的数字内容创作(DCC)工具导入Asset的过程是首批重要的改进对象,这使得DCC工作流程变得更加轻松。最终提高了艺术家和设计师的生产力,减少了程序员的麻烦。 
    现在Unity导入从Maya导出的FBX文件已支持Segment Scale Compensation,而且FBX SDK已升级至2016.1.2。 
    在导入FBX文件时,我们还添加了计算加权法线的选项,如按面积、角度或二者皆有,以及硬边缘的固定法线生成。现在,可以从FBX文件中导入灯光和摄像机,Unity会自动在需要时为对象添加和配置摄像机和/或灯光组件。 
    Unity现在可以使用“Import Visibility”属性从FBX文件中读取可见性属性。值和动画曲线将启用或禁用MeshRenderer组件: 
    这里写图片描述

  • Progressive Lightmapper改进 
    Unity 2017.1增加了Progressive Lightmapper中对烘焙LOD的支持。在烘焙LOD时,Enlighten和Progressive Lightmapper之间的主要区别在于,使用Progressive Lightmapper不必在LOD周围放置光照探针来获得反射光。在完全烘焙分辨率下,间接光照将为LOD提供更优质的烘焙光照贴图,您也可以避免为它们设置光照探针的繁琐过程。(Unity 5.6中也有此功能。) 
    我们还在Progressive Lightmapper中增加了对双面材质的支持,通过添加新的材质设置,使光线与背面接触。启用后,在进行全局光照计算时几何体的两面都被包括在内。当从其他对象观察时,背面不会被认定为无效。背面渲染既不受该设置的控制,也不会在光照贴图中显示。背面使用与正面相同的自发光和漫反射设置反射光线。(该功能也可在Unity 5.6中使用) 
    这里写图片描述

  • 实时阴影改进 
    我们优化了在稳定模式下,级联定向光源阴影投射器的选择。这意味着生成阴影贴图时会产生更少的Draw Call。这增益是与场景和配置相关的。例如,在四个级联光的情况下,可以看到Draw Call数量显著下降。根据太阳/摄像机的方向,场景中可以减少50%的阴影投射器。下面是维京村庄的一个例子: 
    下面的场景在Unity 5.6中有5718个阴影投射器。 
    这里写图片描述 
    在Unity 2017.1中,相同的场景,只有4807个阴影投射器。 
    这里写图片描述 
    Unity 2017.1还实现了实时阴影的Percentage Closer Filtering (PCF)。每个像素的深度值都是从当前像素周围的阴影贴图中取样,并所有的采样值进行比较。这使得光和影之间的线条更加平滑。您可以在下图中看到对比: 
    这里写图片描述
    除了实时阴影改进,Shadowmask和Distance Shadowmask光照模式现在已成为Quality Setting中的参数,可以在运行时进行修改而无需任何成本。例如,可以在室内使用Shadowmask (实现柔和的阴影),并在相同关卡中的户外场景切换至distance Shadowmask。它也可以作为一个质量设置项。 
    我们还添加了Custom Render纹理作为渲染纹理的扩展,可以很方便地用着色器来更新纹理。这有助于实现各种复杂的模拟,比如焦散光、雨滴涟漪模拟,墙面液体喷溅等等。它还提供了一个脚本和着色器框架,以便进行更复杂的配置,比如局部或多阶段更新,不同的更新频率等等。 
    这里写图片描述 
    有了新添加的LineUtility类和LineRenderer.Simplify函数,现在可以优化线条,用LineUtility创建由简单形状组成的简化版本。 
    使用Metal/OpenGL ES3实现iOS上的Deferred Rendering 
    我们为A8芯片和以后的iOS设备启用了一个使用Metal和OpenGL ES 3.0的延迟渲染路径。当使用延迟着色时,能够影响GameObject的灯光数量是没有限制的。所有的灯光都是按像素计算的,这意味着它们都能与法线贴图进行正确的交互等等。此外,所有的灯光都可以有剪影和阴影。

  • 粒子系统改进 
    我们引入了精灵集成,粒子碰撞力(可以推动碰撞器),大量形状方面的改进,包括一个新的形状类型,噪音模块增加了新选项,以及其他一些较小的特性和增强。因为增加了新的控制和约束,例如速度与对齐,使得在2D中使用粒子更加轻松。可以使用粒子来获得比以往更多的特效和动画效果,包括光线的线条和尾迹。 
    通过Texture Sheet Animation模块,我们在粒子系统中增加了对精灵使用的支持。这使粒子系统能更好地进行了图集处理和批处理,同时也在粒子系统中增加了大量与精灵相关的特性,例如不同大小的动画帧,以及每帧的轴心点。 
    这里写图片描述 
    这里写图片描述 
    噪音模块提供了新的选项,可以更好地将噪音应用于粒子效果中。这个功能在Unity 5.5中第一次实现,噪音是被应用到粒子的位置属性。在2017.1中,我们可以将噪音应用到更多的地方: 
    -位置 
    -旋转 
    -大小 
    -使用Custom Vertex Streams的着色器(非常适合制作UV失真效果!) 
    这里写图片描述
    在粒子系统形状模块的碰撞模式中,我们引入了一个新的甜甜圈粒子发射形状和编辑模式。模块内的Transform可以为粒子发射的形状应用自定义位置、旋转和缩放。 
    其他的改进还包括将粒子与速度方向对齐的能力,以及允许在局部空间系统使用Emit over Distance。边缘粒子发射现在更加灵活,可以选择用来产生粒子的边缘厚度。 
    粒子现在也可以使用碰撞模块对碰撞器进行施力。 
    这里写图片描述

  • Windows Store现在改名为Universal Windows Platform 
    Unity现在支持Windows商店的Universal Windows Platform(UWP)应用模式,支持为Xbox One、Windows 10、Windows Phone 10和HoloLens进行构建。 
    请注意,对Windows混合现实PC设备的支持将在今年晚些时候发布。 
    这里写图片描述 
    我们增加了对UWP的多显示支持,现在Unity播放器二进制文件已做数字签名,增加了额外的一层安全性,可以防止对Unity运行时二进制文件进行篡改。 
    最后,我们取消了对Windows 8.1和Windows Phone 8.1应用的支持,Unity 5.6是最后一个支持这两个平台的版本。

  • 索尼PS4的视频播放器 
    我们在Unity 5.6中引入了一个全新的视频播放器,在Unity 2017.1中正式加入了对索尼PS4的支持,从而完成了对跨平台的支持。PS4的视频播放器使用索尼的AvPlayer库来加速h.264流的解码。解码h.264流(PS4的推荐格式)时,CPU开销非常低。可以同时对最多8个并发h.264流进行解码。它还支持对webm容器中的VP8格式流进行软件解码(更高的CPU开销)。最后,它支持多种视频渲染模式(直接渲染到摄像机的近/远平面,作为材质覆盖,或渲染纹理),音频流可以直接输出或发送到音频源进行混合。

  • 底层原生插件渲染扩展 
    我们已经扩展了底层渲染插件API,并提供了一些很酷的新特性: 
    -现在可以将用户数据发送到回调函数。 
    -我们已经扩展了插件将接收回调的可能事件列表。 
    -我们在着色器编译器进程中添加了钩子,可以在发送到编译器之前对着色器打补丁。支持创建自定义关键字所控制的自定义变体。 
    -要想了解这些扩展的威力,请查看NVIDIA的VRWorks包,它是实现这一切的基石。

  • VR: NVIDIA VRWorks 
    现在,在Unity 2017.1中,NVIDIA VRWorks通过以下特性,为虚拟现实提供了一种全新高度的视觉保真度、性能和响应能力: 
    -Multi-Res Shading是一种用于VR的创新性渲染技术,它可以使图像的每一部分都能渲染在一个与镜头矫正图像像素密度相匹配的分辨率上。 
    -Lens Matched Shading使用NVIDIA基于Pascal的GPU的新Simultaneous Multi-Projection架构,为像素着色提供潜在的性能改进。 
    -Single Pass Stereo使用NVIDIA基于Pascal的GPU的新Simultaneous Multi-Projection架构,仅对几何体进行一次绘制,即可在双眼视图同时投射相同几何体。 
    -VR SLI为虚拟现实应用程序提供更高的性能,其中两个GPU可以被指派给特定眼睛,极大地加速立体渲染。 
    这里写图片描述 
    为了更好地利用这些改进,应该在PC上使用GeForce 9系列或更高的GPU来进行回放。可以访问Asset Store资源商店下载NVIDIA VRWorks for Unity

  • 发布说明 
    与往常一样,请查阅发布说明,以了解新特性、改进和修复的完整列表。

以上内容来源Unity官方中文社区,原帖地址:http://forum.china.unity3d.com/thread-25171-1-1.html。 
本文仅做转载和整理。

by:蒋志杰

 

2017-10-15 10:35:13 andeyeluguo 阅读数 143

在[1]中下载所需要的东西,点击即可下载,注意这里是通过联网下载安装的

下载的是个人安装包

出现了 unity3d : failed to initialize unity graphics的错误

用鲁大师下载相应的显卡程序安装重启即可

参考[2],建立hello,world的程序


[1] 下载 

[2] unity 3d简单场景建模(第一天新人适用)

2016-01-12 16:35:00 iteye_5198 阅读数 17

Unity3D是一款很不错的游戏引擎,主要开发语言是C#、JavaScript,当然还有Boo,然后给我Unity3D的官网Url:Unity3D官网

Unity3D最大的优点就是高度的跨平台性能。也就是说你做出一款游戏之后就可以在很多平台运行。

下面是我网上找到的很不错的学习链接:

1. Unity3D 游戏引擎之构建游戏框架与导出IOS项目(一)
http://www.devdiv.com/Unity3D_%E ... log-31865-8995.html
2. Unity3D 游戏引擎之实现平面多点触摸(二)
http://www.devdiv.com/Unity3D_%E ... log-31865-8996.html
3. Unity3D 游戏引擎之构建简单的游戏世界(三)
http://www.devdiv.com/Unity3D_%E ... log-31865-8997.html
4. Unity3D 游戏引擎之构建3D游戏世界的基本地形(四)
http://www.devdiv.com/Unity3D_%E ... log-31865-8998.html
5. Unity3D 游戏引擎之构建游戏地形的基本元素(五)
http://www.devdiv.com/Unity3D_%E ... log-31865-8999.html
6. Unity3D 游戏引擎之脚本实现模型的平移与旋转(六)
http://www.devdiv.com/Unity3D_%E ... log-31865-9000.html
7. Unity3D 游戏引擎之控制模型移动旋转与碰撞(七)
http://www.devdiv.com/Unity3D_%E ... log-31865-9001.html
8. Unity3D 游戏引擎之IOS触摸屏手势控制镜头旋转与缩放(八)
http://www.devdiv.com/Unity3D_%E ... log-31865-9002.html
9. Unity3D 游戏引擎之IOS高级界面发送消息与Unity3D消息的接收(九)
http://www.devdiv.com/Unity3D_%E ... log-31865-9003.html
10. Unity3D 游戏引擎之Unity3D回馈IOS高级界面消息 (十)
http://www.devdiv.com/Unity3D_%E ... log-31865-9004.html
11. Unity3D 游戏引擎之IOS自定义游戏摇杆与飞机平滑的移动(十一)
http://www.devdiv.com/Unity3D_%E ... log-31865-9005.html
12. Unity3D 游戏引擎之FBX模型的载入与人物行走动画的播放(十二)
http://www.devdiv.com/Unity3D_%E ... log-31865-9006.html
13. Unity3D 游戏引擎之平面小球重力感应详解(十三)
http://www.devdiv.com/Unity3D_%E ... log-31865-9007.html
14. Unity3D 游戏引擎之游戏场景的切换与持久化简单数据的储存(十四)
http://www.devdiv.com/Unity3D_%E ... log-31865-9008.html
15. Unity3D 游戏引擎之详解游戏开发音频的播放(十五)
http://www.devdiv.com/Unity3D_%E ... log-31865-9009.html
16. Unity3D 游戏引擎之感应IOS设备旋转与iPhone键盘事件(十六)
http://www.devdiv.com/Unity3D_%E ... log-31865-9010.html
17. Unity3D 游戏引擎之游戏对象的访问绘制线与绘制面详解(十七)
http://www.devdiv.com/Unity3D_%E ... log-31865-9011.html
18. Unity3D研究院之打开Activity与调用JAVA代码传递参数(十八)
http://www.devdiv.com/Unity3D%E7 ... log-31865-9012.html
19. Unity3D研究院之与Android相互传递消息(十九)
http://www.devdiv.com/Unity3D%E7 ... log-31865-9013.html
20. Unity3D研究院之与根据动态的两个轨迹点绘制面详解(二十)
http://www.devdiv.com/Unity3D%E7 ... log-31865-9021.html
21. Unity3D研究院之2D游戏开发制作原理(二十一)
http://www.devdiv.com/Unity3D%E7 ... log-31865-9026.html
22. Unity3D研究院之角色控制器组件研究(二十二)
http://www.devdiv.com/Unity3D%E7 ... log-31865-9027.html
23. Unity3D研究院之使用C#语言建立本地数据库(二十三)
http://www.devdiv.com/Unity3D%E7 ... log-31865-9028.html
24. Unity3D研究院之鼠标控制角色移动与奔跑示例(二十四)
http://www.devdiv.com/Unity3D%E7 ... log-31865-9029.html
25. Unity3D研究院之两种方式播放游戏视频(二十五)
http://www.devdiv.com/Unity3D%E7 ... log-31865-9030.html
26. Unity3D研究院之人物头顶名称与血条更新与绘制(二十六)
http://www.devdiv.com/Unity3D%E7 ... log-31865-9031.html
27. Unity3D研究院之IOS Android支持中文与本地文件的读取写入(二十七)
http://www.devdiv.com/Unity3D%E7 ... log-31865-9032.html
28. Unity3D研究院之Android NDK编译C/C++结合Unity实现本地数据共享(二十八)
http://www.devdiv.com/Unity3D%E7 ... log-31865-9033.html
29. Unity3D研究院之第一人称第三人称角色控制组件修改C#版本(二十九)
http://www.devdiv.com/Unity3D%E7 ... log-31865-9034.html


2016-12-10 15:02:00 weixin_33708432 阅读数 12

Unity3D是一款应用广泛的3D游戏引擎,本文主要介绍unity3D的简单应用,安装过程略过。

在游戏的整个开发过程中,游戏界面设计占据非常重要的地位。因为游戏启动后,第一个映入眼帘的就是整个游戏UI界面。UI界面主要包括贴图、按钮和高级控件等。
Unity为开发者提供了一套非常完善的图形化界面引擎,它包括常见的游戏窗口,文本框,输入框,拖动条,按钮,贴图框等,无论是做软件还是做游戏,都可以很方便地使用

GUI高级控件

Label控件,Button控件,TextField控件,ToolBar空间,Slider控件,ScrollView控件等

一些特殊的方法

Start()方法:该方法只执行一次,一般放一些初始化相关的代码。本例中:
function Start()
{
    //得到屏幕宽高
    screenWidth = Screen.width;
    screenHeight = Screen.height;
    //得到图片宽高
    imageWidth = imageTexture.width;
    imageHeight = imageTexture.height;
}


OnGUI()方法,它是界面绘制方法,所有GUI的绘制都需要在这个方法中实现。本例中,
function OnGUI () 
{
    //将文字内容显示在屏幕中
    GUI.Label(Rect(100, 10, 100, 30), str);
    GUI.Label(Rect(100, 40, 100, 30), "当前屏幕宽:" + screenWidth);
    GUI.Label(Rect(100, 80, 100, 30), "当前屏幕高:" + screenHeight);
    //将贴图显示在屏幕中
    GUI.Label(Rect(100, 120, imageWidth, imageHeight),imageTexture);
}

对变量的声明

  只有公有变量才可以在编辑器中拖拽对象或者以输入的形式赋值。如本例中的“HelloWorld” 以及图片对象。
   在声明变量时,在变量前方添加public关键字或未添加任何关键字都可以表示该变量为公有变量。本例中,

//接收外部赋值字符串
public var str :String;
//接收外部赋值贴图
var imageTexture : Texture;
//贴图宽度
private var imageWidth : int;
//贴图高度
private var imageHeight :int; 
//当前屏幕高度
private var screenWidth :int;
//当前屏幕宽度
private var screenHeight :int;

label控件

//接收外部赋值字符串
public var str :String;
//接收外部赋值贴图
var imageTexture : Texture;
//贴图宽度
private var imageWidth : int;
//贴图高度
private var imageHeight :int; 
//当前屏幕高度
private var screenWidth :int;
//当前屏幕宽度
private var screenHeight :int;

function Start()
{
    //得到屏幕宽高
    screenWidth = Screen.width;
    screenHeight = Screen.height;
    //得到图片宽高
    imageWidth = imageTexture.width;
    imageHeight = imageTexture.height;
}

function OnGUI () 
{
    //将文字内容显示在屏幕中
    GUI.Label(Rect(100, 10, 100, 30), str);
    GUI.Label(Rect(100, 40, 100, 30), "当前屏幕宽:" + screenWidth);
    GUI.Label(Rect(100, 80, 100, 30), "当前屏幕高:" + screenHeight);
    //将贴图显示在屏幕中
    GUI.Label(Rect(100, 120, imageWidth, imageHeight),imageTexture);
}

Button控件

//按钮贴图
var buttonTexture : Texture2D;

//提示信息
private var str : String;

//时间计数器
private var frameTime : int;

function Start()
{
    //初始化赋值
    str = "请您点击按钮";
}

function OnGUI() 
{

        //显示提示信息内容
        GUI.Label(Rect(10, 10, Screen.width, 30), str);

        if(GUI.Button(Rect(10,50,buttonTexture.width,buttonTexture.height),buttonTexture)){
            //点击按钮修改提示信息
            str = "您点击了图片按钮";
        }
        //设置按钮中文字的颜色
        GUI.color = Color.green;
        //设置按钮的背景色
        GUI.backgroundColor = Color.red;

        if (GUI.Button(Rect(10,300,70,30),"文字按钮")){
            //点击按钮修改提示信息
            str = "您点击了文字按钮";
        }

       //设置按钮中文字的颜色
        GUI.color = Color.yellow;
        //设置按钮的背景色
        GUI.backgroundColor = Color.black;

        if (GUI.RepeatButton(Rect(10,350,100,30),"按钮按下中")){

            //点击按钮修改提示信息
            str = "按钮按下中的时间:"+ frameTime;
            //时间计数器++
            frameTime++;
        }

}

TextField控件

//用户名
private var editUsername : String;
//密码
private var editPassword : String;
//提示信息
private var editShow : String;

function Start()
{
    editShow = "请您输入正确的用户名与密码";
    editUsername = "请输入用户名";
    editPassword = "请输入密码";
}

function OnGUI () 
{

    //显示提示信息内容
    GUI.Label(Rect(10, 10, Screen.width, 30), editShow);

    if (GUI.Button(Rect(10,120,100,50),"登录"))
    {
        //点击按钮修改提示信息
        editShow = "您输入的用户名为 :" + editUsername + " 您输入的密码为:"+ editPassword;
    }
    //编辑框提示信息
    GUI.Label(Rect(10, 40, 50, 30), "用户名");

    GUI.Label(Rect(10, 80, 50, 30), "密码:");

    //获取输入框输入的内容
    editUsername = GUI.TextField (Rect (60, 40, 200, 30), editUsername, 15);
    editPassword = GUI.PasswordField  (Rect (60, 80, 200, 30), editPassword, "*"[0],15);
}

ToolBar控件

//工具栏选择按钮的ID
private var select : int;

//工具栏显示按钮的字符串
private var barResource : String[];

//选择按钮是否被按下
private var selectToggle0: boolean;
private var selectToggle1: boolean;

function Start()
{
    //初始化
    select = 0;
    barResource = ["第一个工具栏","第二个工具栏","第三个工具栏","第四个工具栏"];

    selectToggle0 = false;
    selectToggle1 = false;
}

function OnGUI () 
{
    //备份上一次工具栏选择的ID
    var oldSelect = select;
    //重新计算本次工具栏选择的ID
    select = GUI.Toolbar(Rect (10, 10, barResource.length * 100, 30), select, barResource);
    //如果两次选择的是不同的工具栏,将选择按钮全部释放掉
    if(oldSelect != select){
        selectToggle0 = false;
        selectToggle1 = false;
    }

    //根据工具栏选择的ID 显示不同的信息
    switch(select)
    {
    case 0:
        selectToggle0 = GUI.Toggle(Rect(10, 50, 200, 30), selectToggle0, "第一个工具栏单项选择——1");
        selectToggle1 = GUI.Toggle(Rect(10, 80, 200, 30), selectToggle1, "第一个工具栏单项选择——2");
        break;
    case 1:
        selectToggle0 = GUI.Toggle(Rect(10, 50, 200, 30), selectToggle0, "第二个工具栏单项选择——1");
        selectToggle1 = GUI.Toggle(Rect(10, 80, 200, 30), selectToggle1, "第二个工具栏单项选择——2");
        break;  
    case 2:
        selectToggle0 = GUI.Toggle(Rect(10, 50, 200, 30), selectToggle0, "第三个工具栏单项选择——1");
        selectToggle1 = GUI.Toggle(Rect(10, 80, 200, 30), selectToggle1, "第三个工具栏单项选择——2");
        break;
    case 3:
        selectToggle0 = GUI.Toggle(Rect(10, 50, 200, 30), selectToggle0, "第四个工具栏单项选择——1");
        selectToggle1 = GUI.Toggle(Rect(10, 80, 200, 30), selectToggle1, "第四个工具栏单项选择——2");
        break;      
    }   
}

slide控件

//纵向滑动条数值
var verticalValue : int = 0;

//横向滑动条数值
var horizontalValue : float = 0.0f;

function OnGUI () 
{
    //计算滑动进度
    verticalValue = GUI.VerticalSlider (Rect (25, 25, 30, 100), verticalValue, 100, 0);
    horizontalValue = GUI.HorizontalSlider(Rect (50, 25, 100, 30), horizontalValue, 0.0f, 100.0f);
    //将滑动进度显示在屏幕中
    GUI.Label(Rect(10, 150, Screen.width, 30), "纵向滑动条当前进度: " + verticalValue +"%");
    GUI.Label(Rect(10, 180, Screen.width, 30), "横向滑动条当前进度: " + horizontalValue +"%");
}

scrollView

//滚动条位置
var scrollPosition : Vector2;


function Start()
{
    //初始化滚动条位置
    scrollPosition[0] = 50;
    scrollPosition[1] = 50;

}

function OnGUI () {
    //设置开始滚动视图
    scrollPosition = GUI.BeginScrollView (Rect (0,0,200,200),scrollPosition, Rect (0, 0, Screen.width, 300),true,true);

    GUI.Label(Rect(100, 40, Screen.width, 30), "测试滚动视图,测试滚动视图,测试滚动视图,测试滚动视图。");

    //设置结束滚动视图
    GUI.EndScrollView ();

}

群组视图

群组视图(GroupView控件)可以将多个视图全部放在一个群组当中。将视图添加进群组当中后,群组中任何视图的坐标都是相对坐标,它是相对群组视图左上角的坐标。
修改群组视图的坐标都是相对坐标,群组中所有视图的坐标都会跟着修改。推荐使用群组视图来制作游戏界面,因为设备的屏幕尺寸不同,这样做可以避免堆坐标进行多次修改的麻烦。
GUIContent()方法:设置提示信息
GUI.tooltip:可以得到GUIContent中的提示字符串
GUI.BeginGroup():创建一个群组视图,必须以GUI.EndGroup()结束群组视图。
在该区域可以添加任意控件,如果超出该范围,则不予显示。

//贴图
var viewTexture0 : Texture2D;
var viewTexture1 : Texture2D;


function OnGUI () 
{

    //开始这个群组
    GUI.BeginGroup(new Rect(300, 50, 200, 400));
    //显示贴图,坐标为相对群组的点(10,50)
    GUI.DrawTexture(Rect(10,0,viewTexture0.width,viewTexture0.height), viewTexture0);
    //标签提示信息
    GUI.Label(Rect(10,260,100,40),"群组视图1");
    //按钮
    GUI.Button(Rect(10,280,100,40),"按钮");
    //结束这个群组
    GUI.EndGroup();


    //开始这个群组
    GUI.BeginGroup(new Rect(600, 50, 500, 400));
    //显示贴图,坐标为相对群组的点(300,0)
    GUI.DrawTexture(Rect(10,20,viewTexture1.width,viewTexture1.height), viewTexture1);
    //标签提示信息
    GUI.Label(Rect(10,280,100,40), "群组视图2");
    //按钮
    GUI.Button(Rect(10,300,100,40),"按钮");
    //结束这个群组
    GUI.EndGroup();

} 

窗口

在游戏中所有视图都需要依赖窗口来显示,我们可以把窗口理解成视图的父类。即游戏界面可以由若干个窗口组成,窗口又由若干个视图组成。
窗口中所有控件的坐标均采用相对坐标(相对于窗口左上角的坐标)。

//默认窗口位置
private var window0 : Rect = Rect (20, 20, 200, 200);
private var window1 : Rect = Rect (250, 20, 200, 200);
function OnGUI () 
{
    //在这里注册两个窗口
    GUI.Window (0, window0, oneWindow, "第一个窗口");
    GUI.Window (1, window1, twoWindow, "第二个窗口" );
}
//显示窗口1的内容
function oneWindow (windowID : int) {

    GUI.Box(Rect(10,50,150,50),"这里窗口的ID是" + windowID);
    if(GUI.Button(Rect(10,120,150,50),"普通按钮"))
    {
        Debug.Log("窗口id = "+windowID+"按钮被点击");
    }

}
//显示窗口2的内容
function twoWindow (windowID : int) {
    GUI.Box(Rect(10,50,150,50),"这里窗口的ID是" + windowID);
    if(GUI.Button(Rect(10,120,150,50),"普通按钮"))
    {
        Debug.Log("窗口id = "+windowID+"按钮被点击");
    }
}

完成

2016-04-22 20:52:18 whuhan2013 阅读数 1258

Unity3D是一款应用广泛的3D游戏引擎,本文主要介绍unity3D的简单应用,安装过程略过。

在游戏的整个开发过程中,游戏界面设计占据非常重要的地位。因为游戏启动后,第一个映入眼帘的就是整个游戏UI界面。UI界面主要包括贴图、按钮和高级控件等。
Unity为开发者提供了一套非常完善的图形化界面引擎,它包括常见的游戏窗口,文本框,输入框,拖动条,按钮,贴图框等,无论是做软件还是做游戏,都可以很方便地使用

GUI高级控件

Label控件,Button控件,TextField控件,ToolBar空间,Slider控件,ScrollView控件等

一些特殊的方法

Start()方法:该方法只执行一次,一般放一些初始化相关的代码。本例中:
function Start()
{
    //得到屏幕宽高
    screenWidth = Screen.width;
    screenHeight = Screen.height;
    //得到图片宽高
    imageWidth = imageTexture.width;
    imageHeight = imageTexture.height;
}


OnGUI()方法,它是界面绘制方法,所有GUI的绘制都需要在这个方法中实现。本例中,
function OnGUI () 
{
    //将文字内容显示在屏幕中
    GUI.Label(Rect(100, 10, 100, 30), str);
    GUI.Label(Rect(100, 40, 100, 30), "当前屏幕宽:" + screenWidth);
    GUI.Label(Rect(100, 80, 100, 30), "当前屏幕高:" + screenHeight);
    //将贴图显示在屏幕中
    GUI.Label(Rect(100, 120, imageWidth, imageHeight),imageTexture);
}

对变量的声明

  只有公有变量才可以在编辑器中拖拽对象或者以输入的形式赋值。如本例中的“HelloWorld” 以及图片对象。
   在声明变量时,在变量前方添加public关键字或未添加任何关键字都可以表示该变量为公有变量。本例中,

//接收外部赋值字符串
public var str :String;
//接收外部赋值贴图
var imageTexture : Texture;
//贴图宽度
private var imageWidth : int;
//贴图高度
private var imageHeight :int; 
//当前屏幕高度
private var screenWidth :int;
//当前屏幕宽度
private var screenHeight :int;

label控件

//接收外部赋值字符串
public var str :String;
//接收外部赋值贴图
var imageTexture : Texture;
//贴图宽度
private var imageWidth : int;
//贴图高度
private var imageHeight :int; 
//当前屏幕高度
private var screenWidth :int;
//当前屏幕宽度
private var screenHeight :int;

function Start()
{
    //得到屏幕宽高
    screenWidth = Screen.width;
    screenHeight = Screen.height;
    //得到图片宽高
    imageWidth = imageTexture.width;
    imageHeight = imageTexture.height;
}

function OnGUI () 
{
    //将文字内容显示在屏幕中
    GUI.Label(Rect(100, 10, 100, 30), str);
    GUI.Label(Rect(100, 40, 100, 30), "当前屏幕宽:" + screenWidth);
    GUI.Label(Rect(100, 80, 100, 30), "当前屏幕高:" + screenHeight);
    //将贴图显示在屏幕中
    GUI.Label(Rect(100, 120, imageWidth, imageHeight),imageTexture);
}

Button控件

//按钮贴图
var buttonTexture : Texture2D;

//提示信息
private var str : String;

//时间计数器
private var frameTime : int;

function Start()
{
    //初始化赋值
    str = "请您点击按钮";
}

function OnGUI() 
{

        //显示提示信息内容
        GUI.Label(Rect(10, 10, Screen.width, 30), str);

        if(GUI.Button(Rect(10,50,buttonTexture.width,buttonTexture.height),buttonTexture)){
            //点击按钮修改提示信息
            str = "您点击了图片按钮";
        }
        //设置按钮中文字的颜色
        GUI.color = Color.green;
        //设置按钮的背景色
        GUI.backgroundColor = Color.red;

        if (GUI.Button(Rect(10,300,70,30),"文字按钮")){
            //点击按钮修改提示信息
            str = "您点击了文字按钮";
        }

       //设置按钮中文字的颜色
        GUI.color = Color.yellow;
        //设置按钮的背景色
        GUI.backgroundColor = Color.black;

        if (GUI.RepeatButton(Rect(10,350,100,30),"按钮按下中")){

            //点击按钮修改提示信息
            str = "按钮按下中的时间:"+ frameTime;
            //时间计数器++
            frameTime++;
        }

}

TextField控件

//用户名
private var editUsername : String;
//密码
private var editPassword : String;
//提示信息
private var editShow : String;

function Start()
{
    editShow = "请您输入正确的用户名与密码";
    editUsername = "请输入用户名";
    editPassword = "请输入密码";
}

function OnGUI () 
{

    //显示提示信息内容
    GUI.Label(Rect(10, 10, Screen.width, 30), editShow);

    if (GUI.Button(Rect(10,120,100,50),"登录"))
    {
        //点击按钮修改提示信息
        editShow = "您输入的用户名为 :" + editUsername + " 您输入的密码为:"+ editPassword;
    }
    //编辑框提示信息
    GUI.Label(Rect(10, 40, 50, 30), "用户名");

    GUI.Label(Rect(10, 80, 50, 30), "密码:");

    //获取输入框输入的内容
    editUsername = GUI.TextField (Rect (60, 40, 200, 30), editUsername, 15);
    editPassword = GUI.PasswordField  (Rect (60, 80, 200, 30), editPassword, "*"[0],15);
}

ToolBar控件

//工具栏选择按钮的ID
private var select : int;

//工具栏显示按钮的字符串
private var barResource : String[];

//选择按钮是否被按下
private var selectToggle0: boolean;
private var selectToggle1: boolean;

function Start()
{
    //初始化
    select = 0;
    barResource = ["第一个工具栏","第二个工具栏","第三个工具栏","第四个工具栏"];

    selectToggle0 = false;
    selectToggle1 = false;
}

function OnGUI () 
{
    //备份上一次工具栏选择的ID
    var oldSelect = select;
    //重新计算本次工具栏选择的ID
    select = GUI.Toolbar(Rect (10, 10, barResource.length * 100, 30), select, barResource);
    //如果两次选择的是不同的工具栏,将选择按钮全部释放掉
    if(oldSelect != select){
        selectToggle0 = false;
        selectToggle1 = false;
    }

    //根据工具栏选择的ID 显示不同的信息
    switch(select)
    {
    case 0:
        selectToggle0 = GUI.Toggle(Rect(10, 50, 200, 30), selectToggle0, "第一个工具栏单项选择——1");
        selectToggle1 = GUI.Toggle(Rect(10, 80, 200, 30), selectToggle1, "第一个工具栏单项选择——2");
        break;
    case 1:
        selectToggle0 = GUI.Toggle(Rect(10, 50, 200, 30), selectToggle0, "第二个工具栏单项选择——1");
        selectToggle1 = GUI.Toggle(Rect(10, 80, 200, 30), selectToggle1, "第二个工具栏单项选择——2");
        break;  
    case 2:
        selectToggle0 = GUI.Toggle(Rect(10, 50, 200, 30), selectToggle0, "第三个工具栏单项选择——1");
        selectToggle1 = GUI.Toggle(Rect(10, 80, 200, 30), selectToggle1, "第三个工具栏单项选择——2");
        break;
    case 3:
        selectToggle0 = GUI.Toggle(Rect(10, 50, 200, 30), selectToggle0, "第四个工具栏单项选择——1");
        selectToggle1 = GUI.Toggle(Rect(10, 80, 200, 30), selectToggle1, "第四个工具栏单项选择——2");
        break;      
    }   
}

slide控件

//纵向滑动条数值
var verticalValue : int = 0;

//横向滑动条数值
var horizontalValue : float = 0.0f;

function OnGUI () 
{
    //计算滑动进度
    verticalValue = GUI.VerticalSlider (Rect (25, 25, 30, 100), verticalValue, 100, 0);
    horizontalValue = GUI.HorizontalSlider(Rect (50, 25, 100, 30), horizontalValue, 0.0f, 100.0f);
    //将滑动进度显示在屏幕中
    GUI.Label(Rect(10, 150, Screen.width, 30), "纵向滑动条当前进度: " + verticalValue +"%");
    GUI.Label(Rect(10, 180, Screen.width, 30), "横向滑动条当前进度: " + horizontalValue +"%");
}

scrollView

//滚动条位置
var scrollPosition : Vector2;


function Start()
{
    //初始化滚动条位置
    scrollPosition[0] = 50;
    scrollPosition[1] = 50;

}

function OnGUI () {
    //设置开始滚动视图
    scrollPosition = GUI.BeginScrollView (Rect (0,0,200,200),scrollPosition, Rect (0, 0, Screen.width, 300),true,true);

    GUI.Label(Rect(100, 40, Screen.width, 30), "测试滚动视图,测试滚动视图,测试滚动视图,测试滚动视图。");

    //设置结束滚动视图
    GUI.EndScrollView ();

}

群组视图

群组视图(GroupView控件)可以将多个视图全部放在一个群组当中。将视图添加进群组当中后,群组中任何视图的坐标都是相对坐标,它是相对群组视图左上角的坐标。
修改群组视图的坐标都是相对坐标,群组中所有视图的坐标都会跟着修改。推荐使用群组视图来制作游戏界面,因为设备的屏幕尺寸不同,这样做可以避免堆坐标进行多次修改的麻烦。
GUIContent()方法:设置提示信息
GUI.tooltip:可以得到GUIContent中的提示字符串
GUI.BeginGroup():创建一个群组视图,必须以GUI.EndGroup()结束群组视图。
在该区域可以添加任意控件,如果超出该范围,则不予显示。

//贴图
var viewTexture0 : Texture2D;
var viewTexture1 : Texture2D;


function OnGUI () 
{

    //开始这个群组
    GUI.BeginGroup(new Rect(300, 50, 200, 400));
    //显示贴图,坐标为相对群组的点(10,50)
    GUI.DrawTexture(Rect(10,0,viewTexture0.width,viewTexture0.height), viewTexture0);
    //标签提示信息
    GUI.Label(Rect(10,260,100,40),"群组视图1");
    //按钮
    GUI.Button(Rect(10,280,100,40),"按钮");
    //结束这个群组
    GUI.EndGroup();


    //开始这个群组
    GUI.BeginGroup(new Rect(600, 50, 500, 400));
    //显示贴图,坐标为相对群组的点(300,0)
    GUI.DrawTexture(Rect(10,20,viewTexture1.width,viewTexture1.height), viewTexture1);
    //标签提示信息
    GUI.Label(Rect(10,280,100,40), "群组视图2");
    //按钮
    GUI.Button(Rect(10,300,100,40),"按钮");
    //结束这个群组
    GUI.EndGroup();

} 

窗口

在游戏中所有视图都需要依赖窗口来显示,我们可以把窗口理解成视图的父类。即游戏界面可以由若干个窗口组成,窗口又由若干个视图组成。
窗口中所有控件的坐标均采用相对坐标(相对于窗口左上角的坐标)。

//默认窗口位置
private var window0 : Rect = Rect (20, 20, 200, 200);
private var window1 : Rect = Rect (250, 20, 200, 200);
function OnGUI () 
{
    //在这里注册两个窗口
    GUI.Window (0, window0, oneWindow, "第一个窗口");
    GUI.Window (1, window1, twoWindow, "第二个窗口" );
}
//显示窗口1的内容
function oneWindow (windowID : int) {

    GUI.Box(Rect(10,50,150,50),"这里窗口的ID是" + windowID);
    if(GUI.Button(Rect(10,120,150,50),"普通按钮"))
    {
        Debug.Log("窗口id = "+windowID+"按钮被点击");
    }

}
//显示窗口2的内容
function twoWindow (windowID : int) {
    GUI.Box(Rect(10,50,150,50),"这里窗口的ID是" + windowID);
    if(GUI.Button(Rect(10,120,150,50),"普通按钮"))
    {
        Debug.Log("窗口id = "+windowID+"按钮被点击");
    }
}

完成

Unity3D入门

阅读数 565

unity3D入门

阅读数 682

unity3d入门

阅读数 304

Unity3D入门

阅读数 1

没有更多推荐了,返回首页