《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.10 在地形周围创建圆环

简介:

本节书摘来自华章计算机《Unity着色器和屏幕特效开发秘笈(原书第2版)》一书中的第2章,第2.10节,作者 [英]艾伦朱科尼(Alan Zucconi)[美]肯尼斯拉默斯(Kenneth Lammers),译 占红来,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.10 在地形周围创建圆环

很多即时战略游戏需要通过在某个选定单位周围绘制圆环来显示一些距离(比如攻击范围、移动距离、视野范围等)。如果地形是平整的,可能只需要在四边形上画一个圆形纹理就可以了。但是如果地形不是平的,则四边形可能会被一些小山或者其他几何体给截断。这一节中你会学到如何在复杂地形上使用着色器画圆环。如果还想移动这个圆环,就需要一个着色器和一些C#脚本。下图是一个在由一堆小山构成的地形上画出圆环的例子:

image

2.10.1 准备工作

这个技术并不需要对场景中的每一个几何体进行操作,而是针对地形进行操作。因此第一步需要在Unity中准备一个地形。

  1. 首先创建一个名为RadiusShader的着色器和一个名为Radius的材质。
  2. 准备一个角色,我们会在这个角色周围画出一个圆。
  3. 从菜单中选择 GameObject | 3D Object | Terrain来创建一个新地形。
  4. 给地形创建一定的几何结构。可以导入一个已有的结构或者使用工具来创建一个新的(Raise/Lower Terrain, Paint Height, Smooth Height)。
  5. 在Unity中,地形是一类特殊的对象,地形上的纹理映射也和传统的三维模型上的纹理映射有所不同。不能通过着色器提供一个_MainTex纹理,因为地形需要自己提供纹理。步骤是选择Paint Texture,然后单击Add Texture...。
    image
  6. 现在纹理已经设置好了,你可以修改地形的材质,通过这个材质就可以应用我们的自定义着色器。从Terrain Settings中修改Material属性为Custom,然后将Radius材质拖曳到Custom Material栏。

现在你就可以开始创建着色器了。

2.10.2 操作步骤

首先编辑RadiusShader文件。

  1. 在新的着色器中添加如下四个属性:
    image
  2. 在CGPROGRAM部分添加相应的变量:
    image
  3. 表面函数的Input结构不仅需要纹理的UV值,还需要地形上每个点的位置(在世界坐标下)信息。可以通过修改Input结构来获得这个参数:
    image
  4. 最后使用这个表面函数:
    image

以上这些就是在地形上画圆环所需要的所有步骤。你可以使用材质的Inspector标签页来修改圆环的位置、半径和颜色。

移动圆环

如果想要圆环跟着角色走,还需要其他一些必要的步骤:

  1. 创建一个新的名为Radius的C#脚本。
  2. 给该脚本添加如下属性:
    image
  3. 在Update()方法中,添加下面几行代码:
    image
  4. 将脚本添加到角色上。
  5. 最后将Radius材质拖曳到脚本的Radius Material栏。

现在可以把你的角色到处移动一下,这个脚本始终会在你的角色周围创建一个漂亮的圆环。修改Radius脚本的属性也会改变圆环的半径。

2.10.3 工作原理

绘制圆环需要的元素有圆心、半径和颜色。在着色器中可以通过_Center、_Radius和_RadiusColor分别得到。我们通过在Input结构中添加worldPos变量来请求当前绘制的像素在世界坐标中所处的位置。世界坐标的位置也是物体在编辑器中的真实位置。

surf()函数是真正绘制圆环的地方。它会计算绘制点到圆心的距离,然后判断该距离是否属于_Radius到_Radius + _RadiusWidth范围内,如果在这个范围内,就使用选定的颜色;如果不在这个范围内,就像我们见到过的其他着色器一样直接采样纹理映射的颜色。

目录
打赏
0
0
0
0
1408
分享
相关文章
超越基础教程:深度拆解Unity地形编辑器的每一个隐藏角落,让你的游戏世界既浩瀚无垠又细节满满——从新手到高手的全面技巧升级秘籍
【8月更文挑战第31天】Unity地形编辑器是游戏开发中的重要工具,可快速创建复杂多变的游戏环境。本文通过比较不同地形编辑技术,详细介绍如何利用其功能构建广阔且精细的游戏世界,并提供具体示例代码,展示从基础地形绘制到植被与纹理添加的全过程。通过学习这些技巧,开发者能显著提升游戏画面质量和玩家体验。
372 3
使用Unity进行虚拟现实开发:深入探索与实践
【8月更文挑战第24天】使用Unity进行虚拟现实开发是一个充满挑战和机遇的过程。通过掌握Unity的VR开发技术,你可以创造出令人惊叹的VR体验,为用户带来前所未有的沉浸感和乐趣。随着技术的不断进步和应用场景的不断拓展,VR开发的未来充满了无限可能。希望本文能为你提供有用的指导和启发!
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
651 0
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
221 0
步入未来科技前沿:全方位解读Unity在VR/AR开发中的应用技巧,带你轻松打造震撼人心的沉浸式虚拟现实与增强现实体验——附详细示例代码与实战指南
【8月更文挑战第31天】虚拟现实(VR)和增强现实(AR)技术正深刻改变生活,从教育、娱乐到医疗、工业,应用广泛。Unity作为强大的游戏开发引擎,适用于构建高质量的VR/AR应用,支持Oculus Rift、HTC Vive、Microsoft HoloLens、ARKit和ARCore等平台。本文将介绍如何使用Unity创建沉浸式虚拟体验,包括设置项目、添加相机、处理用户输入等,并通过具体示例代码展示实现过程。无论是完全沉浸式的VR体验,还是将数字内容叠加到现实世界的AR应用,Unity均提供了所需的一切工具。
313 0
|
9月前
|
【unity小技巧】手戳代码程序化绘制地形Terrain树和预制体物品、动物
【unity小技巧】手戳代码程序化绘制地形Terrain树和预制体物品、动物
122 0
|
9月前
|
【推荐100个unity插件之17】具有可破坏/砍倒unity地形树木能力的破坏系统,实现unity砍树效果 —— DestroyIt - Destruction System
【推荐100个unity插件之17】具有可破坏/砍倒unity地形树木能力的破坏系统,实现unity砍树效果 —— DestroyIt - Destruction System
295 0
|
9月前
|
【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏4(附项目源码)
【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏4(附项目源码)
157 0
|
9月前
|
【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏3(附项目源码)
【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏3(附项目源码)
249 0
|
9月前
|
【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏1(附项目源码)
【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏1(附项目源码)
244 0