【游戏开发小技】Unity中实现Dota里的角色技能地面贴花效果(URP ShaderGraph Decal)

本文最终效果

文章目录

      • 一、前言
      • 二、环境准备
        • 1、URP环境准备
        • 2、技能范围图案
      • 二、方案一:写Shader实现
        • 1、Shader脚本:UrpDecal.shader
        • 2、材质球
        • 3、创建Cube
        • 4、地面场景
        • 5、添加Renderer Feature: Decal
        • 6、移动DecalCube,与地面交叉
        • 7、运行效果
      • 三、方案二:使用URP Decal Projector
        • 1、添加Renderer Feature: Decal
        • 2、创建Decal Shader Graph
        • 3、材质球
        • 4、空物体挂 URPDecalProjector组件
        • 4、设置组件参数
        • 5、运行效果
      • 四、工程源码
      • 五、完毕

一、前言

嗨,大家好,我是新发。
我平时偶尔会打打Dota2,在Dota里面,技能释放前会有一个地面贴花效果来作为范围的显示,比如深渊领主的这个技能,如下

我们可以看到技能范围特效是可以投射到场景地面和物体上(比如树木),这个在Unity中如何去实现呢?本文我以URP渲染管线为例,讲一下这个技能地面贴花效果的制作过程吧~

注:本文我使用的Unity版本为2021.3.1f1c1Universal RP版本为12.1.6

二、环境准备

1、URP环境准备

首先通过PackageManager安装Universal RP,在Project窗口中右键鼠标,点击菜单Create / Rendering / URP Asset (with Universal Renderer)
在这里插入图片描述
此时会创建出两个文件,如下
在这里插入图片描述
打开Project Settings窗口,点击Graphics,把Uinversal Render Pipeline Asset文件拖给Scriptable Render Pipeline Settings,如下
在这里插入图片描述

2、技能范围图案

接着我们去找一张技能范围的图案,我找了一张这样的,
在这里插入图片描述

接下来就是具体的实现过程了。有两个方案,下面我分别给大家讲解一下。

二、方案一:写Shader实现

1、Shader脚本:UrpDecal.shader

我在GitHub上看到有个外国小哥写了个URP渲染管线的贴花Shader
GitHub地址:https://github.com/ColinLeung-NiloCat/UnityURPUnlitScreenSpaceDecalShader

在这里插入图片描述
我给他的Shader添加了中文注释,方便大家阅读,如下

// see README here: 
// github.com/ColinLeung-NiloCat/UnityURPUnlitScreenSpaceDecalShader

Shader "Universal Render Pipeline/NiloCat Extension/Screen Space Decal/Unlit"
{
    Properties
    {
        [Header(Basic)]
        _MainTex("Texture", 2D) = "white" {}
        [HDR]_Color("_Color (default = 1,1,1,1)", color) = (1,1,1,1)

        [Header(Blending)]
        // BlendMode官方手册:https://docs.unity3d.com/ScriptReference/Rendering.BlendMode.html
        // 混合模式
        [Enum(UnityEngine.Rendering.BlendMode)]_SrcBlend("_SrcBlend (default = SrcAlpha)", Float) = 5 // 5 = SrcAlpha
        [Enum(UnityEngine.Rendering.BlendMode)]_DstBlend("_DstBlend (default = OneMinusSrcAlpha)", Float) = 10 // 10 = OneMinusSrcAlpha

        [Header(Alpha remap(extra alpha control))]
        _AlphaRemap("_AlphaRemap (default = 1,0,0,0) _____alpha will first mul x, then add y    (zw unused)", vector) = (1,0,0,0)

        [Header(Prevent Side Stretching(Compare projection direction with scene normal and Discard if needed))]
        [Toggle(_ProjectionAngleDiscardEnable)] _ProjectionAngleDiscar

你可能感兴趣的:(面试,学习路线,阿里巴巴,java,java进阶,后端)