【实现100个unity特效之1】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)

简介: 【实现100个unity特效之1】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)

前言

本文的灵感来自动物森友会的神奇世界!动物们在这里生活、探索和建设,而世界弯曲的效果给游戏增添了更多的魅力和惊喜。你是否曾经想过如何使用Unity来实现这一独特的效果?在本文中,我们将带你逐步了解如何用Unity解锁世界弯曲的神奇力量。

动物森友会是一款备受欢迎的模拟经营游戏,最引人瞩目的特点之一就是游戏中的世界弯曲效果。当角色移动时,场景以一种富有艺术感的方式扭曲和变形,营造出一种奇幻而迷人的感觉。这种效果让玩家沉浸在一个与众不同的虚拟世界中,提供了一种独特的视觉体验。

要实现动物森友会中的世界弯曲效果,我们将利用Unity游戏引擎的强大功能和灵活性。通过使用

Shader Graph,我们可以创建出这种令人惊叹的视觉效果。在本文中,我们将逐步介绍创建世界弯曲效果的过程,包括如何设置材质、配置Shader Graph和编写相应的脚本。

无论你是一名经验丰富的游戏开发者,还是一个渴望探索新技术的初学者,本文都将为你提供详细的指导和实用的技巧。在完成本文的学习和实践后,你将能够在自己的游戏中实现令人惊叹的世界弯曲效果,让玩家们享受到动物森友会般的奇幻之旅。

让我们一起开始这个令人兴奋的冒险吧!在接下来的内容中,我们将引导你进入Unity的世界,探索如何实现动物森友会的世界弯曲效果。让我们一起探索编程和创意的奇妙之处,为我们的游戏增加更多的魅力和创新。

动物森友会的世界弯曲效果

原理

假设我们这里有一个方块,边上有一个对它的摄像机,摄像机的前面和上面就是z轴和Y轴,那么这个方块的位置就是(Z,Y)

那么当世界被弯曲之后,方块的z轴位置应该是不变的,

而它的Y轴,也就是垂直位置,要稍微降下来一点,它降下来的程度是由它的z轴决定,

并且它下降的是有一个弧度的,也就是说不可能是正比例函数

所以我们可以在这里加一个平方,同时也可以加上一个系数,来控制它弯曲的程度

所以我们要做的就是利用Shader Graph,把场景上的每个点映射到新的坐标上

开始

接下来我们来实际操作一下

这边我们新建一个项目

因为要用到Shader Graph

这里可以直接创建HDRP或者URP项目

这里我创建一个默认的3D项目,演示一下如何把项目升级到URP

注意我使用的是unity 2021.3版本

导入素材

这里我导入的是免费的Low-Poly Simple Nature Pack素材,当然你也可以选择其他的素材

https://assetstore.unity.com/packages/3d/environments/landscapes/low-poly-simple-nature-pack-162153

升级URP

其实升级URP我之前文章已经做过很多次了,但是无奈还是有很多人不会操作,所以我这里再说一下升级步骤,以后应该会再很少提及如何升级URP操作了,如果已经会了的小伙伴也可以直接跳过这一步

打开包管理器,安装URP

安装URP之后一般默认会安装好shader Graph,请检查是否安装,如果没有就手动安装

右键创建一个URP的配置

然后我们再打开项目设置(Project Settings),绑定URP配置

现在这些材质就丢失了,因为我们已经把管线切换成了URP,所以原来的Shader文件就不能用了

选择窗口-》渲染-》渲染管线转换器,把所有素材升级为URP

选择URP把下面的子类统统勾选

先点击Initialize Converters,再点击Convert Assets

可以看到我们的素材就回复正常了,

如果切换失败的话,可以通过手动去改材质的shader

新建Shader Graph

配置Shader Graph连线

修改材质

将我们配置好的Shader Graph拖入环境材质球,修改曲面系数和贴图改为原先的贴图

效果

现在我们观察场景,可以发现它的实际位置并没有改变,改变的只是它显示的位置

如果觉得编辑场景不方便的话,可以写一个脚本控制材质的Shader

编辑的时候使用默认的Shader游戏运行了再自动变成弯曲的Shader

弯道的效果

这里除了偏移物体的y轴,也可以偏移物体的x轴

这样就可以实现一个弯道的效果

比如在地铁跑酷里的弯道就是这样做的

这样做的好处就是你的模型人物的运动其实一直都是直线,可以减少很多工作量

星球效果

另外我们也可以让x轴也参与偏移的参数,这里我把x轴也参与到y轴的偏移上来

这样我们就有了一个星球的效果

把平面场景做成球体也挺不错的

问题

在这里还有非常重要的一个点

我们注意边缘的模型,比如这里的树,它会在一个位置突然就消失

产生这个问题的原理其实也很简单

一般情况下,Uny的摄像机只会這染视锥之内的物体

比如这里有两个球,右边的球在视锥之外,所以它并不会进行渲染

当场景弯曲之后,我们应该河以在摄像机里看到它,但因为它的实际位置在摄像机的外面,所以没有对它进渲染

这里我们参考这个教程:https://youtu.be/SOK3Ias5Nk0

它把摄像机的渲染范围从锥形改成了方形,这样就能确保渲染视野内的所有物体

这里导入它提供的代码,我加了详细的中文注释,不懂得看看就知道了

using UnityEngine;
using UnityEngine.Rendering;
public class fixcamera : MonoBehaviour
{
    // 当脚本启用时调用
    private void OnEnable()
    { 
        // 注册渲染管线的开始渲染事件
        RenderPipelineManager.beginCameraRendering += OnBeginCameraRendering;
        // 注册渲染管线的结束渲染事件
        RenderPipelineManager.endCameraRendering += OnEndCameraRendering;
    }
    // 当脚本禁用时调用
    private void OnDisable()
    {
        // 取消注册渲染管线的开始渲染事件
        RenderPipelineManager.beginCameraRendering -= OnBeginCameraRendering;
        // 取消注册渲染管线的结束渲染事件
        RenderPipelineManager.endCameraRendering -= OnEndCameraRendering;
    }
    // 开始渲染相机时调用
    private static void OnBeginCameraRendering(ScriptableRenderContext ctx, Camera cam)
    {
        // 把相机的渲染范围给改成前面说的方形
        cam.cullingMatrix = Matrix4x4.Ortho(-99, 99, -99, 99, 0.001f, 99) * cam.worldToCameraMatrix;
    }
    // 结束渲染相机时调用
    private static void OnEndCameraRendering(ScriptableRenderContext ctx, Camera cam)
    {
        // 重置相机的渲染范围
        cam.ResetCullingMatrix();
    }
}

挂载脚本,运行游戏就可以看到场景上的物体正常显示了

Shader Graph连线图

最后贴出完整的Shader Graph连线图

源码

我的demo源码:

https://gitcode.net/unity1/world_bend

国外原作者源码:

https://github.com/notslot/tutorial-world-bending

参考

【视频】https://youtu.be/SOK3Ias5Nk0

【视频】https://www.bilibili.com/video/BV1Rr4y167ET

目录
相关文章
|
8天前
|
图形学
unity噪声消融效果Shader实现
在 Unity 中实现噪声消融效果,利用噪声纹理和透明度裁剪技术。噪声纹理(如 Perlin 噪声)为物体表面提供随机参考值,透明度裁剪通过设置阈值控制显示与消失。具体步骤包括引入噪声纹理、设置阈值和边缘颜色,使用自定义着色器代码实现物体部分消失的视觉效果。通过调整材质球和噪声贴图,可优化最终呈现。
|
6月前
|
图形学 数据可视化 开发者
超实用Unity Shader Graph教程:从零开始打造令人惊叹的游戏视觉特效,让你的作品瞬间高大上,附带示例代码与详细步骤解析!
【8月更文挑战第31天】Unity Shader Graph 是 Unity 引擎中的强大工具,通过可视化编程帮助开发者轻松创建复杂且炫酷的视觉效果。本文将指导你使用 Shader Graph 实现三种效果:彩虹色渐变着色器、动态光效和水波纹效果。首先确保安装最新版 Unity 并启用 Shader Graph。创建新材质和着色器图谱后,利用节点库中的预定义节点,在编辑区连接节点定义着色器行为。
441 0
|
6月前
|
C# 图形学 C语言
Unity3D学习笔记3——Unity Shader的初步使用
Unity3D学习笔记3——Unity Shader的初步使用
64 0
|
6月前
|
数据可视化 图形学
小功能⭐️Unity2018 Shader Graph——全息影像、物体消融
小功能⭐️Unity2018 Shader Graph——全息影像、物体消融
|
8月前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(上)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)
315 2
|
8月前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
126 0
|
8月前
|
存储 JSON 关系型数据库
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
157 0
|
8月前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
114 0
|
6月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
328 6
|
6月前
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
538 5