65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

1.00/5 (1投票)

2018 年 5 月 27 日

CPOL

4分钟阅读

viewsIcon

1658

如何将轮廓效果应用于我们的球形游戏对象

延续我们前一天的工作,我们使用着色器创建了一个轮廓效果,接下来我们需要做的就是能够与游戏中的游戏对象交互,以便我们可以高亮显示它并拾取它。

今天,我们将重点关注下一步,将轮廓效果应用于我们的Ball游戏对象。

让我们开始吧!

将轮廓材质应用于游戏对象

首先,我们需要创建事件触发器,当我们的控制器触发事件时,这些触发器将运行一个函数。

我们在创建 VR FPS 时已经对此进行了一些研究。

使用我们的事件触发器很简单,我们需要

  1. 指定特定的事件触发器,例如 Pointer Enter 或 Pointer Down,它们将响应玩家的输入。
  2. 当事件被触发时,我们将运行在我们组件中指定的函数。

让我们开始高亮显示部分。

现在,我们已经有了一个着色器,可以让我们高亮显示我们的game对象,但是我们如何与它交互呢?让我们找出答案。

我们将创建一个简单的脚本,我们将用它来控制我们的投掷代码。

现在,让我们只实现显示和隐藏轮廓材质,以便我们可以为我们的事件触发器设置一些东西。

  1. 选择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来引用我们的宽度。

代码流程

现在让我们来看一下代码。这没什么复杂的……至少现在没有!

  1. 像往常一样,在Start()中,我们初始化我们的代码。这里没有什么新的。我们获得我们的轮廓材质(我们将其设置为game对象中的第二个材质),并将轮廓宽度设置为0。稍后详细介绍。
  2. 接下来,我们有一个名为ShowOutlineMaterial()public函数,此函数用于将我们的轮廓边框设置为我们的常量宽度。具体来说,因为我们在着色器中设置轮廓宽度的值是一个float,所以我们只需在我们的材质上调用setFloat(“key”, “value”)来设置值。
  3. HideOutlineMaterial()与前一个函数相反。它用于隐藏我们的轮廓。

使用我们的 Throwable 脚本

现在我们有了基本的触发脚本,让我们将其添加到我们的游戏中。

  1. Ball中,添加一个新的**事件触发器**
  2. 在**事件触发器**脚本组件中,单击**新建事件触发器**并添加**Pointer Enter**和**Pointer Exit**。
  3. 现在我们需要添加函数的引用。对于**Pointer Enter**,单击退出按钮,然后点击**+**按钮添加要使用的关联游戏对象和脚本。选择Ball作为游戏对象。对于函数,选择Throwable > ShowOutlineMaterial
  4. 接下来,我们需要为**Pointer Exit**执行类似的操作,选择Ball作为游戏对象,并选择Throwable > HideOutlineMaterial

完成后,我们应该会有这样的结果

现在,如果我们继续玩游戏,每当我们将指针移动到球上时,我们将显示我们的轮廓效果,而每当我们离开指针时,轮廓就会消失。

很酷,对吧?

注意:请忽略蓝色。我不喜欢我们在试验时有一个白色的地板,于是决定创建一个蓝色材质并将其拖到地板上以更改颜色。这纯粹是一个审美上的改变,而不是其他任何东西。

结论

今天之后,我们现在知道如何将材质应用到游戏对象上,特别是我们在上一篇文章中创建的轮廓材质。

除此之外,我们再次复习了如何使用**事件触发器**来轻松地与游戏对象交互。它就是这么有用!

现在我们已经完成了高亮显示,在下一篇文章中,我们将最终学习如何在游戏中抓取和投掷物体!到时候见!

© . All rights reserved.