跳到主要内容

如何淡出一个游戏对象在统一

  • 作者:
  • 更新日期:

Matt Bird撰写了各种无意义的内容,但他却投入了大量时间去编写游戏攻图。

统一:使对象淡出或淡出

统一:使对象淡出或淡出

Unity:淡出游戏对象

在Unity中实现的许多华丽效果都源于相当基本的操作,其中最常见的是让游戏对象淡出视线。有几种方法可以做到这一点;我们将讨论其中的三个。

1.从检查器中更改游戏对象的Alpha

虽然这个方法不会在运行时帮助你,但最简单的方法是通过检查器来淡入和淡出对象。我们将从2D对象开始。一旦你创建了一个新的2D精灵,你就可以访问它的精灵渲染器组件,从那里,颜色属性,如下所示:

截图由自己拍摄。Unity由Unity Technologies拥有和开发。

截图由自己拍摄。Unity由Unity Technologies拥有和开发。

然后,你可以在色轮下方的“A”属性上移动幻灯片,使游戏对象淡出视野。这对于预先设置你知道应该是完全透明或半透明的游戏对象很有用。例如,如果你想让一个角色看起来像一个幽灵,你可以将Alpha滑块的值设置为128左右,让你在通过GameObject查看任何背景图像的同时仍然可以看到GameObject。

在这方面,3D对象稍微复杂一些,因为你需要操作对象的材质而不是对象本身。首先,在项目视图中右键单击并滚动创建>材质,如下图所示:

创建一个新材质

创建一个新材质

然后你可以通过Mesh Renderer组件将新材质(或者其他你称之为新材质的东西)分配给你的游戏对象,它应该包含在任何新的3D对象中。双击材质名称将在检查器中显示材质的属性。

将它分配给GameObject

将它分配给GameObject

从这里,你可以再次访问颜色属性,为游戏对象分配一个颜色-虽然,一开始,你可能无法使它正确淡出。为了使3D游戏对象褪色,指定的材质必须将其渲染模式(检查器顶部)设置为裁剪、褪色或透明,在透明的情况下,你不能让对象完全消失。现在设置为剪切或渐隐。这将允许你将游戏对象的Alpha设置为任何你喜欢的数字。

然而,与用于2D对象的方法一样,这种方法有在运行时不可用的限制。为了在游戏播放时实现完全的淡入淡出效果,你需要在c#中做一些工作-就3D对象而言,你现在有了使它工作所需的材料。

2.使用更新布尔值

下一个淡出游戏对象的方法涉及到更新函数、另外两个独立函数和两个布尔值(真/假)。为你的游戏对象创建一个名为任何你喜欢的名字的新脚本-在这种情况下,我们将其称为“FadeObject”-并将其附加到对象上。在新脚本中,您需要创建两个新函数和一对布尔值。我们将使用这些布尔值来触发更新序列,从而淡入和淡出游戏对象。

有了框架之后,需要设置函数,以便在调用它们时触发布尔值。

由微软公司拥有和开发的Microsft Visual Studio。

由微软公司拥有和开发的Microsft Visual Studio。

(从技术上说,你可以在这个例子中,我们不需要使用函数,只需要使用布尔值,但是如果你的游戏中的其他系统需要触发淡入/淡出效果,那么使用它们是很有用的。)

到目前为止很简单。现在,我们需要在Update函数中创建过程的核心部分,该函数检查每一帧的变化,并创建您可能想要的平滑褪色效果。我们将首先淡出游戏对象。为此,我们需要一个新的公共浮点数,fadeSpeed和两个本地变量:fadeAmount(一个浮点数)和objectColor(一个颜色)。这些将用于跟踪新的颜色值,并确定接下来需要哪个值。

在Unity中改变颜色之所以棘手,部分原因在于如何操作这些值。你不能只改变颜色的一部分,你需要重新分配颜色中的每一个值,不管这些值是否已经改变。因此,你需要获取游戏对象的当前颜色值(this.GetComponent().material.color),将它们分配给一个变量(objectColor),并从中减去。然而,你可能希望过渡看起来平滑,所以你执行的数学运算需要与Unity中的时间流一起工作,如下所示:

数学与时间的流动一起工作

数学与时间的流动一起工作

Time.deltaTime是Unity在完成代码执行的另一个步骤之前在帧之间等待多长时间的有用表示。你在检查器中设置的fadeAmount值越高(我们稍后会这样做),对象淡出的速度就越快。Time.deltaTime在Unity中也用于移动对象,所以如果你是c#编程的新手,你可以经常看到它。

一旦你有了淡出的数量,然后减去objectColor (objectColor.a)的Alpha值,以获得一个新的Alpha值插入objectColor。(注意,你也可以在下一行中简单地执行这个计算,但是在它自己的行中这样做会更干净。)再次注意,您必须为其他三个颜色值分别赋值,在本例中,这些值不会更改。

您必须为其他三个颜色值分别赋值。

您必须为其他三个颜色值分别赋值。

通过设置每个颜色为'objectColor。R '等等,你只是在重复使用旧的值。非常方便。在最后插入fadeAmount,然后将objectColor应用到你的游戏对象的颜色上,你将拥有一个比之前更淡的游戏对象。由于Update持续运行,这个过程将循环直到对象完全消失。不幸的是,它也会继续如果你不停止它,循环和消耗不必要的内存,所以你会想要扔在if(objectColor。a <=0)语句,将淡出设置为false。这将检查Alpha值是否为零,一旦为零,更新将停止更新。

小菜一碟,对吧?正确的。现在我们只需要测试一下。在你的Update函数中加入一个if(Input)语句,如下所示:

在Update函数中加入一个if(Input)语句。

在Update函数中加入一个if(Input)语句。

这将允许您在按下键盘上的A键时触发FadeOutObject()函数。完成后,回到检查器,设置你的游戏对象的褪色速度- 5是一个合理的数量-并通过播放按钮测试你的游戏。假设你的所有操作都是正确的,你的GameObject将迅速从视野中消失。

(难道没用吗?确保你的游戏对象有一个材质可以褪色的渲染器。上述步骤已列出。)

万岁!你的游戏对象现在不见了!那你怎么把它拿回来?幸运的是,这个过程非常简单:只需复制并粘贴所有代码,使其消失在淡出段下面,将淡出更改为淡出,并更改fadeAmount计算,以便将新的金额添加到Alpha,而不是减去。更改底部的if(objectColor.a)语句,以检查游戏对象的Alpha值是否大于1,并更改其中的布尔值为fadeIn而不是fadeOut。最后,添加另一个if(Input)语句,以便测试渐入效果。你的代码应该大致如下所示:

您的代码应该如下所示

您的代码应该如下所示

续。

续。

点击A,游戏对象淡出;点击S,游戏对象就会淡入。容易peasy。值得注意的是,代码中有一些低效率的地方——例如,两次定义objectColor和fadeAmount有点多余——但这将完成工作。

作为一种解决方案,这是可行的,但它有一个主要缺陷:无论何时你将代码放入Update中,你的游戏都会不断检查它是否正确。如果你只在Update中放入一些内容,这并不是一个大问题,但如果你过于依赖于每一帧检查布尔值,你就会拖累你的游戏。幸运的是,还有其他成本更低的选择,我们要看的最后一个就是这个。

3.使用协程

最后一种使对象淡入淡出的方法涉及到协程的使用。协程是在结束自己之前运行一段时间的函数。对于定时事件来说,它们非常方便,而且占用的内存也少得多。

实际上,我们用于Update方法的所有代码在这里仍然适用——我们只需要将它重新定位到新的包装器中。使用之前的FadeInObject()和FadeOutObject()函数,并将它们转换为协程,如下所示:

将函数转换为协程

将函数转换为协程

IEnumerator是一个协程,只是名字不同而已。注意,这两个函数都被注册为错误;这是因为一个Couroutine必须在代码中通过一定的时间度量来正常工作。我们马上就会讲到。

一旦设置了协程,就可以将Update布尔值中的所有代码直接移植到函数中,尽管需要做一些调整。我们不再使用fadeIn / fadeOut布尔值,而是使用While()语句来决定协程何时需要停止改变游戏对象的颜色。上述条件仍然适用。While()语句非常强大,如果你没有正确地编码它们,它会完全冻结Unity,所以请确保你正确地处理了这一部分!

在每个While()语句的末尾,你还需要添加额外的一行:'yield return null'。yield return是一个特定于协程的命令,它告诉Unity在指定的一段时间内停止代码的执行。在这种情况下,它告诉Unity完全停止执行,此时While()语句循环回到开始,并淡出你的游戏对象。一旦While()语句的需求完成,协程将跳过“yield return null”并结束。

几乎完成了。现在我们只需要修改if(Input)语句。它们仍然会触发函数,但为了触发协程,你需要添加一些额外的东西:StartCoroutine()。如果你不把函数放在括号里,它就不会启动。(请注意,在协程的括号内仍然需要两个额外的函数括号。他们很容易忘记。)

你完成的代码应该是这样的:

完成代码

完成代码

对原始代码的修改并不像最初看起来那么剧烈,结果也几乎相同:A键使你的游戏对象消失,S键使你的游戏对象重新出现。你也可以添加一个布尔值,阻止你在物体完全可见或完全不可见之前激活任何一个函数,尽管这应该只在玩家能够自己触发淡入/淡出效果时才有必要。

现在你可以在其他脚本中使用这些函数来调用GameObjects来执行消失行为,或者将代码完全重新定位到针对特定GameObjects并使它们消失的主脚本中。只要一个对象有某种渲染器,它就应该在命令时消失。

©2020马特·伯德

Baidu