VR 100 天挑战第 65 天:在 Unity 中将轮廓效果材质应用于游戏对象





1.00/5 (1投票)
如何将轮廓效果应用于我们的球形游戏对象
延续我们前一天的工作,我们使用着色器创建了一个轮廓效果,接下来我们需要做的就是能够与游戏中的游戏对象交互,以便我们可以高亮显示它并拾取它。
今天,我们将重点关注下一步,将轮廓效果应用于我们的Ball
游戏对象。
让我们开始吧!
将轮廓材质应用于游戏对象
首先,我们需要创建事件触发器,当我们的控制器触发事件时,这些触发器将运行一个函数。
我们在创建 VR FPS 时已经对此进行了一些研究。
使用我们的事件触发器很简单,我们需要
- 指定特定的事件触发器,例如 Pointer Enter 或 Pointer Down,它们将响应玩家的输入。
- 当事件被触发时,我们将运行在我们组件中指定的函数。
让我们开始高亮显示部分。
现在,我们已经有了一个着色器,可以让我们高亮显示我们的game
对象,但是我们如何与它交互呢?让我们找出答案。
我们将创建一个简单的脚本,我们将用它来控制我们的投掷代码。
现在,让我们只实现显示和隐藏轮廓材质,以便我们可以为我们的事件触发器设置一些东西。
- 选择
Ball
并创建一个新脚本。让我们将其命名为Throwable
。
Throwable
看起来是这样的
using System.Collections;
using UnityEngine;
public class Throwable : MonoBehaviour
{
private Material _outlineMaterial;
private const string OutlineWidthKey = "_Outline";
private const float OutlineWidthValue = 0.03f;
void Start ()
{
_outlineMaterial = GetComponent<Renderer>().materials[1];
_outlineMaterial.SetFloat(OutlineWidthKey, 0);
}
// Shows the outline by setting the width to be a fixed avalue when we are
// pointing at it.
public void ShowOutlineMaterial()
{
_outlineMaterial.SetFloat(OutlineWidthKey, OutlineWidthValue);
}
// Hides the outline by making the width 0 when we are no longer
// pointing at it.
public void HideOutlineMaterial()
{
_outlineMaterial.SetFloat(OutlineWidthKey, 0);
}
}
查看变量
我们引入了三个字段
private Material _outlineMaterial
– 保存对我们想要更改的轮廓材质的引用。private const string OutlineWidthKey
= “_Outline
” – 我们用来引用着色器使用的宽度轮廓材质的常量。private const float OutlineWidthValue
=0.03f
– 用于引用我们用于着色器的大小常量。在本例中,我们将其设置为0.03f
。
现在在我们继续之前,我的代码中_Outline
的值是从哪里来的?好问题!
事实证明,当我们在 Unity 中创建着色器时,我们可以从我们的材质中引用用于着色器的变量。
在我们的例子中,如果我们查看我们的着色器(代码或附加到材质的着色器),你会看到我们实际上有两个变量。具体来说,这是代码片段
Shader “Outlined/Silhouette Only” {
Properties {
_OutlineColor (“Outline Color”, Color) = (0,0,0,1)
_Outline (“Outline width”, Range (0.0, 0.03)) = .005
}
我们正在查看的是_OutlineColor
来引用我们的颜色和_Outline
来引用我们的宽度。
代码流程
现在让我们来看一下代码。这没什么复杂的……至少现在没有!
- 像往常一样,在
Start()
中,我们初始化我们的代码。这里没有什么新的。我们获得我们的轮廓材质(我们将其设置为game
对象中的第二个材质),并将轮廓宽度设置为0
。稍后详细介绍。 - 接下来,我们有一个名为
ShowOutlineMaterial()
的public
函数,此函数用于将我们的轮廓边框设置为我们的常量宽度。具体来说,因为我们在着色器中设置轮廓宽度的值是一个float
,所以我们只需在我们的材质上调用setFloat(“key”, “value”)
来设置值。 HideOutlineMaterial()
与前一个函数相反。它用于隐藏我们的轮廓。
使用我们的 Throwable 脚本
现在我们有了基本的触发脚本,让我们将其添加到我们的游戏中。
- 在
Ball
中,添加一个新的**事件触发器** - 在**事件触发器**脚本组件中,单击**新建事件触发器**并添加**Pointer Enter**和**Pointer Exit**。
- 现在我们需要添加函数的引用。对于**Pointer Enter**,单击退出按钮,然后点击**+**按钮添加要使用的关联游戏对象和脚本。选择
Ball
作为游戏对象。对于函数,选择Throwable
>ShowOutlineMaterial
。 - 接下来,我们需要为**Pointer Exit**执行类似的操作,选择
Ball
作为游戏对象,并选择Throwable
>HideOutlineMaterial
。
完成后,我们应该会有这样的结果
现在,如果我们继续玩游戏,每当我们将指针移动到球上时,我们将显示我们的轮廓效果,而每当我们离开指针时,轮廓就会消失。
很酷,对吧?
注意:请忽略蓝色。我不喜欢我们在试验时有一个白色的地板,于是决定创建一个蓝色材质并将其拖到地板上以更改颜色。这纯粹是一个审美上的改变,而不是其他任何东西。
结论
今天之后,我们现在知道如何将材质应用到游戏对象上,特别是我们在上一篇文章中创建的轮廓材质。
除此之外,我们再次复习了如何使用**事件触发器**来轻松地与游戏对象交互。它就是这么有用!
现在我们已经完成了高亮显示,在下一篇文章中,我们将最终学习如何在游戏中抓取和投掷物体!到时候见!