2016-03-16 19:46:13 BeiFuDeNvWang 阅读数 4611
• ###### 深入浅出Unity3D——第一篇

Unity3D基础知识、游戏算法一网打尽。

75679 人正在学习 去看看 何韬

``````using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;

public class TextBkg : BaseMeshEffect
{

public GameObject backImage;//层级不重要，在改变大小的时候重新指定了父节点
private Rect rect;

protected override void Start()
{

}

public override void ModifyMesh(VertexHelper vh)
{

if (!IsActive()) {
return;
}

float topX = 1000000;
float topY = 1000000;
float bottomX = -1000000;
float bottomY = -1000000;

var stream = new List<UIVertex>();
vh.GetUIVertexStream(stream);

foreach (var item in stream)
{
var pos = item.position;
if (topX > pos.x) {
topX = pos.x;
}
if (topY > pos.y)
{
topY = pos.y;
}
if (bottomX < pos.x)
{
bottomX = pos.x;
}
if (bottomY < pos.y)
{
bottomY = pos.y;
}
}

rect = new Rect(topX, topY, bottomX - topX, bottomY - topY);

var rt = GetComponent<RectTransform>();

//计算相对于左下角的位置 如果能够保证rt.pivot为0,0则可以不用此步
rect.x += rt.pivot.x * rt.rect.size.x;
rect.y += rt.pivot.y * rt.rect.size.y;

//计算相对于父节点的位置
var parentSize = transform.parent.gameObject.GetComponent<RectTransform>().rect.size;
rect.x += rt.offsetMin.x + rt.anchorMin.x * parentSize.x;
rect.y += rt.offsetMin.y + rt.anchorMin.y * parentSize.y;

}

void OnGUI()
{
var backImageRect = backImage.GetComponent<RectTransform>();
backImageRect.SetParent(transform.parent);
backImageRect.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left,   rect.x, rect.width);
backImageRect.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, rect.y, rect.height);
backImage.SetActive(true);
}

}
``````

``````using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using System;

{
[SerializeField]
private Color32
topColor = Color.white;
[SerializeField]
private Color32
bottomColor = Color.black;

//如果需要对单个字符进行渐变处理，只需在在for循环中对单个字的四个顶点进行颜色指定即可
public override void ModifyMesh(VertexHelper vh)
{
if (!IsActive())
{
return;
}

List<UIVertex> stream = new List<UIVertex>();
vh.GetUIVertexStream(stream);

float bottomY = 100000;
float topY = -100000;
foreach (var item in stream)
{
float y = item.position.y;
if (y > topY)
{
topY = y;
}
else if (y < bottomY)
{
bottomY = y;
}
}

var auiv = new UIVertex();
float uiElementHeight = topY - bottomY;
for (int i = 0; i < vh.currentVertCount; i++)
{
vh.PopulateUIVertex(ref auiv, i);
auiv.color = Color32.Lerp(bottomColor, topColor, (auiv.position.y - bottomY) / uiElementHeight);
vh.SetUIVertex(auiv, i);
}
}
}

``````

unity3d 文字把背景撑开 相关内容

2017-08-15 10:08:32 QQ18334373taikongyi 阅读数 2041
• ###### 深入浅出Unity3D——第一篇

Unity3D基础知识、游戏算法一网打尽。

75679 人正在学习 去看看 何韬
unity3d 设置背景透明

- 如果仅仅是在U3D端把背景图的GameObject设置为透明，导入到Android中完全不起作用；
- 如果在U3D中把背景通过一个独立的Camera来渲染，然后通过Camera的开关来隐藏背景（甚至于直接删除背景图的GameObject，
Camera设置为depth only或也直接删除），导入到Android后显示的将会是一个黑色背景
- 同样的情况，在IOS端，可以看到在U3D的View中，有一个root-view，在把U3D的View置于IOS的View上之后，只要把这个root-view设置为透明，

- 花钱申请unity3d源码，或者反编译unity-class.jar(有混淆)，把UnityPlaye构造方法下的（.getHolder().setFormat(2)；）地方的2改成1
- 用的是unity4.2的版本，其他版本好不行，没试。 //http://tieba.baidu.com/p/4862485959

- android:style/Theme.Translucent只需要在Manifest中需要透明的Activity内设置theme为以上任意一个就可以了 //http://www.jianshu.com/p/946e3ef9b9fe
- windows下无背景的小头像、桌面精灵（窗体透明）//http://blog.csdn.net/dark00800/article/details/70314432
- unity3d 如何将贴图的黑色背景变为透明, 在ps中将图片处理成带通道的tif格式文件，记住：必须是带通道的，

- //http://bbs.csdn.net/topics/392147380
- //http://blog.csdn.net/mvpstevenlin/article/details/51195267
- Android显示Unity视图//http://blog.csdn.net/liujunjie612/article/details/45478921
- this works only with unity 4.2 and below... not unity 4.3 since they changed how the view is constructed
//https://stackoverflow.com/questions/17705364/unityplayer-as-a-subview-with-transparent-background-unity-game-engine
- You can now animate your VR drawings using Google’s new Tilt Brush Toolkit with Unity integration
- Unity3D研究院之UGUI安卓自动ETC1通道分离(升级你的unity到5.5) //http://www.xuanyusong.com/archives/4279

unity3d android background transparent
Tilt Brush Unity SDK

unity3d 文字把背景撑开 相关内容

2015-01-13 22:56:14 caoboya 阅读数 955
• ###### 深入浅出Unity3D——第一篇

Unity3D基础知识、游戏算法一网打尽。

75679 人正在学习 去看看 何韬

欢迎来到unity学习unity培训unity企业培训教育专区，这里有很多U3D资源U3D培训视频U3D教程U3D常见问题U3D项目源码，我们致力于打造业内unity3d培训、学习第一品牌。

今天做项目的时候发现我加的GUI Text和背景图片GUI Texture相互覆盖，这个问题困扰了我这个初学Unity3D新手好久，后来问了老师才知道，原来只需要把背景图片的位置调整一下就不会覆盖了。

首先添加GUI Text和GUI Teture

然后再调整GUI Texture的transform的Z轴为-1就可以了哦。

这样就可以做到GUI Text不被GUI Texture覆盖了。

unity3d 文字把背景撑开 相关内容

2017-07-16 20:10:17 dark00800 阅读数 16337
• ###### 深入浅出Unity3D——第一篇

Unity3D基础知识、游戏算法一网打尽。

75679 人正在学习 去看看 何韬

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

Unity 2017.2 beta下载地址：Unity 2017.2 beta

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

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

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

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

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

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

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

## 改进Post-processing栈（测试）

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

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

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

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

• 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，可获得更多的控制和用途。

在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)。每个像素的深度值都是从当前像素周围的阴影贴图中取样，并所有的采样值进行比较。这使得光和影之间的线条更加平滑。您可以在下图中看到对比:

我们还添加了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通过以下特性，为虚拟现实提供了一种全新高度的视觉保真度、性能和响应能力:
-Single Pass Stereo使用NVIDIA基于Pascal的GPU的新Simultaneous Multi-Projection架构，仅对几何体进行一次绘制，即可在双眼视图同时投射相同几何体。
-VR SLI为虚拟现实应用程序提供更高的性能，其中两个GPU可以被指派给特定眼睛，极大地加速立体渲染。

为了更好地利用这些改进，应该在PC上使用GeForce 9系列或更高的GPU来进行回放。可以访问Asset Store资源商店下载NVIDIA VRWorks for Unity

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

by：蒋志杰

unity3d 文字把背景撑开 相关内容

2014-10-25 15:58:32 qinyuanpei 阅读数 5292
• ###### 深入浅出Unity3D——第一篇

Unity3D基础知识、游戏算法一网打尽。

75679 人正在学习 去看看 何韬

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

大家好，我是秦元培，欢迎大家关注我的博客，我的博客地址是blog.csdn.net/qinyuanpei。在Unity4.3版本以后，Unity3D推出了基于Box2D的2D组件，使得Unity3D成为一个可以支持2D游戏开发的游戏引擎。在Unity3D推出这一功能之前，大家对使用Unity3D开发2D游戏已经进行了大量的研究。所以，Unity3D推出2D组件从本质上来讲并不算是一个巨大的突破，因为二维与三维的区别就在于三维比二维多了一个Z轴，如果我们将Z轴固定，那么这就是一个二维的世界。在此之前，我们普遍采用的是正交投影法，即让摄像机垂直于XY平面进行投影，这样可以利用3D引擎实现2D游戏的效果。既然现在Unity可以支持原生2D游戏开发，为什么我们不来尝试一下呢？博主之前就打算抽时间研究下Unity3D的Native2D的特性，不过因为种种原因一直没有时间来研究，那么现在正好利用这个周末来研究下吧！

一、精灵(Sprite)与精灵图集

虽然我们将Unity3D的2D特性成为Native2D，不过事实上Natvite只是相对于第三方插件而言的，从本质上Unity3D的2D仍然是属于3D的范畴。精灵(Sprite)是我们走进Native2D的第一个组件，所以的2D特性都是以这个组件作为基础。学习过2D游戏开发的朋友应该知道精灵其实就是我们在2D世界里一张贴图。好了，下面我们创建一个新的项目来演示如何使用Sprite组件吧！第一个让我们激动人心的特性是我们可以在创建项目的时候就决定一个项目是3D游戏还是2D游戏，如图，这里我们直接选择2D，因为我们今天要探索的是Unity3D的Native2D特性

```using UnityEngine;
using System.Collections;

public class SpriteScript : MonoBehaviour {

//向上的精灵集合
public Sprite[] UpSprites;
//向下的精灵集合
public Sprite[] DownSprites;
//向左的精灵集合
public Sprite[] LeftSprites;
//向右的精灵集合
public Sprite[] RightSprites;

//上一次使用的精灵集合
private Sprite[] lastSprites;
//当前使用的精灵集合
private Sprite[] currentSprites;

//当前帧序列索引
private int index=0;
//每秒帧数
private float fps=10;
//当前经历时间
private float currentTime=0;

//角色当前状态
private PlayerState state;

//精灵渲染器
private SpriteRenderer renderer=null;

void Start ()
{
//初始化角色状态
state=PlayerState.Idle;
//初始化角色精灵集合
currentSprites=UpSprites;
lastSprites=currentSprites;
//获取精灵渲染器
renderer=GetComponent<SpriteRenderer>();
}

void FixedUpdate ()
{
if(Input.GetAxis("Horizontal")==1){
state=PlayerState.Walk;
SetSprites(RightSprites);
MoveTo(new Vector2(Time.deltaTime * 2.5F,0));
}else if(Input.GetAxis("Horizontal")==-1){
state=PlayerState.Walk;
SetSprites(LeftSprites);
MoveTo(new Vector2(-Time.deltaTime * 2.5F,0));
}else if(Input.GetAxis("Vertical")==1){
state=PlayerState.Walk;
SetSprites(UpSprites);
MoveTo(new Vector2(0,Time.deltaTime * 2.5F));
}else if(Input.GetAxis("Vertical")==-1){
state=PlayerState.Walk;
SetSprites(DownSprites);
MoveTo(new Vector2(0,-Time.deltaTime * 2.5F));
}else if(!Input.anyKey){
state=PlayerState.Idle;
}
DrawSprites(currentSprites);
}

//角色移动
private void MoveTo(Vector2 offest)
{
//根据偏移量计算角色位置
float x=transform.position.x + offest.x;
float y=transform.position.y + offest.y;
//使用2D刚体组件来移动精灵
this.rigidbody2D.MovePosition(new Vector2(x,y));
}

//设置当前精灵集合
private void SetSprites(Sprite[] sprites)
{
currentSprites=sprites;
//如果当前精灵集合和上一次使用的精灵集合不等则表明要切换精灵集合
if(currentSprites!=lastSprites)
{
lastSprites=currentSprites;
index=0;
}
}

//绘制当前精灵集合
private void DrawSprites(Sprite[] sprites)
{
//如果角色处于站立状态则显示第一帧
if(state==PlayerState.Idle){
renderer.sprite=sprites[0];
}else{
currentTime+=Time.deltaTime;
//如果当前时间大于帧动画渲染时间则需要渲染新的帧动画
if(currentTime>1/fps){
//使索引增加并将当前时间清零以便于重新计数
index+=1;
currentTime=0;
//使索引连续画面循环
if(index>=sprites.Length){
index=0;
}
}
}
//渲染
renderer.sprite=sprites[index];
}

#region 角色状态枚举定义#
enum PlayerState
{
Walk,
Idle
}
#endregion
}
```

```using UnityEngine;
using System.Collections;

public class FightScript: MonoBehaviour {

//序列帧动画集合
public Sprite[] Animations;
//当前帧序列索引
private int index=0;
//每秒帧数
public float fps=10;
//当前经历时间
private float currentTime=0;
//精灵渲染器
private SpriteRenderer renderer;

void Start()
{
//获取精灵渲染器
renderer=GetComponent<SpriteRenderer>();
}

void FixedUpdate ()
{
DrawSprite();
}

//提供一个外部接口以便于随时改变动画
public void SetAnimations(Sprite[] sprites,int index)
{
this.Animations=sprites;
this.index=index;
}

//根据精灵集合播放动画
void DrawSprite()
{
currentTime+=Time.deltaTime;
//如果当前时间大于帧动画渲染时间则需要渲染新的帧动画
if(currentTime>1/fps){
//使索引增加并将当前时间清零以便于重新计数
index+=1;
currentTime=0;
//使索引连续画面循环
if(index>=Animations.Length){
index=0;
}
}
//渲染
renderer.sprite=Animations[index];
}
}
```

二、2D物理与Box2D

提及2D游戏引擎就不能不说Box2D。Box2D是一个用于模拟2D刚体物体的C++引擎，通常作为物理引擎被用到2D游戏引擎中，因此在很多游戏引擎中都能找到它的身影，而Unity3D的Native2D就是使用了Box2D这个引擎。关于这个引擎的细节大家可以自己去了解，总之如果游戏世界缺少了碰撞，那么游戏世界未免太无趣了吧！人生就像愤怒的小鸟，当你失败的时候总有猪在笑。该面对的我们还是要去面对，就算在现实中碰壁被撞得头破血流，可是这样的人生总是值得我们去追逐的，因为寒冷寂寞的生，终究是比不上轰轰烈烈的死。好了，闲话少叙，我们下面来一起学习下Unity3D中2D物理吧。在Unity3D中，所有与2D物理相关的组件都被放到Physics  2d这个父菜单中，因此我们可以在这里找到相关的2D物理组件。Unity中提供的2D物理组件主要有三类：刚体、碰撞体、关节。目前我们只需要关注刚体和碰撞体就可以了。估计2D物理这块很多朋友会觉得无所谓吧，大不了自己写呗。博主之前和一个朋友交流，他做的一款打击感不错ARPG手游从头到尾从来没有用过碰撞，所有的逻辑几乎都是自己写的，因为2D物理实在是简单啊，只要通过计算距离就可以了。可是作为一名有节操的程序员，在深刻理解了不重复制造轮子这一内涵后，还会执着地自己写碰撞检测吗？所以我们这里就直接使用Unity提供的2D组件了。我们首先给主角添加一个刚体Rigidbody 2D组件，并勾选Fixed Anglg这是因为我们在碰撞的过程中并不需要角度的变化。同样，我们不需要重力，所以需要将Gravity Angle设为0.如图：

```using UnityEngine;
using System.Collections;

public class CollisionCheck : MonoBehaviour {

void OnCollisionEnter2D(Collision2D Coll2D)
{
if(Coll2D.gameObject.tag=="Fight Player")
{
Debug.Log("请离我远一点,我正在练习绝世武功!");
}
}

void OnTriggerEnter2D(Collider2D Coll2D)
{
if(Coll2D.gameObject.tag=="NPC Player")
{
Debug.Log(" 尽管我是一名NPC,但是我的戏份还是要有的!");
}
}
}
```
2D物理世界里的碰撞检测和3D物理世界里的碰撞检测基本一致，大家可以参考官方最新的API文档，因为国内翻译的API文档基本上都没有这一部分。好了，我们来看看运行效果吧！

好啦，今天的内容就是这样了，希望大家喜欢啊，为什么每次写完博客都这么累啊？难道是因为要查阅大量的资料吗？有不懂的地方大家可以给我留言，我尽量给大家解决，还是希望大家能关注和支持博主的博客，这样博主才有勇气一直写下去。好了，就这样啦！

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

unity3d 文字把背景撑开 相关内容