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

文章目录

  • 前言
  • 原理
  • 开始
  • 导入素材
  • 升级URP
  • 新建Shader Graph
  • 修改材质
  • 效果
  • 弯道的效果
  • 星球效果
  • 问题
  • Shader Graph连线图
  • 源码
  • 参考
  • 完结

前言

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

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

要实现动物森友会中的世界弯曲效果,我们将利用Unity游戏引擎的强大功能和灵活性。通过使用
Shader Graph,我们可以创建出这种令人惊叹的视觉效果。在本文中,我们将逐步介绍创建世界弯曲效果的过程,包括如何设置材质、配置Shader Graph和编写相应的脚本。

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

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

动物森友会的世界弯曲效果
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第1张图片

原理

假设我们这里有一个方块,边上有一个对它的摄像机,摄像机的前面和上面就是z轴和Y轴,那么这个方块的位置就是(Z,Y)
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第2张图片
那么当世界被弯曲之后,方块的z轴位置应该是不变的,
而它的Y轴,也就是垂直位置,要稍微降下来一点,它降下来的程度是由它的z轴决定,
并且它下降的是有一个弧度的,也就是说不可能是正比例函数
所以我们可以在这里加一个平方,同时也可以加上一个系数,来控制它弯曲的程度
所以我们要做的就是利用Shader Graph,把场景上的每个点映射到新的坐标上
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第3张图片

开始

接下来我们来实际操作一下
这边我们新建一个项目
因为要用到Shader Graph
这里可以直接创建HDRP或者URP项目
这里我创建一个默认的3D项目,演示一下如何把项目升级到URP
注意我使用的是unity 2021.3版本
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第4张图片

导入素材

这里我导入的是免费的Low-Poly Simple Nature Pack素材,当然你也可以选择其他的素材
https://assetstore.unity.com/packages/3d/environments/landscapes/low-poly-simple-nature-pack-162153
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第5张图片

升级URP

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

打开包管理器,安装URP
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第6张图片
安装URP之后一般默认会安装好shader Graph,请检查是否安装,如果没有就手动安装
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第7张图片
右键创建一个URP的配置
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第8张图片
然后我们再打开项目设置(Project Settings),绑定URP配置
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第9张图片
现在这些材质就丢失了,因为我们已经把管线切换成了URP,所以原来的Shader文件就不能用了
选择窗口-》渲染-》渲染管线转换器,把所有素材升级为URP
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第10张图片
选择URP把下面的子类统统勾选
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第11张图片
先点击Initialize Converters,再点击Convert Assets
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第12张图片
可以看到我们的素材就回复正常了,
如果切换失败的话,可以通过手动去改材质的shader
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第13张图片

新建Shader Graph

【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第14张图片
配置Shader Graph连线
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第15张图片

修改材质

将我们配置好的Shader Graph拖入环境材质球,修改曲面系数和贴图改为原先的贴图
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第16张图片

效果


现在我们观察场景,可以发现它的实际位置并没有改变,改变的只是它显示的位置
如果觉得编辑场景不方便的话,可以写一个脚本控制材质的Shader
编辑的时候使用默认的Shader游戏运行了再自动变成弯曲的Shader

弯道的效果

这里除了偏移物体的y轴,也可以偏移物体的x轴
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第17张图片
这样就可以实现一个弯道的效果
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第18张图片

比如在地铁跑酷里的弯道就是这样做的
这样做的好处就是你的模型人物的运动其实一直都是直线,可以减少很多工作量

【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第19张图片

星球效果

另外我们也可以让x轴也参与偏移的参数,这里我把x轴也参与到y轴的偏移上来
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第20张图片
这样我们就有了一个星球的效果
把平面场景做成球体也挺不错的

【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第21张图片

问题

在这里还有非常重要的一个点
我们注意边缘的模型,比如这里的树,它会在一个位置突然就消失
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第22张图片
产生这个问题的原理其实也很简单
一般情况下,Uny的摄像机只会這染视锥之内的物体
比如这里有两个球,右边的球在视锥之外,所以它并不会进行渲染
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第23张图片
当场景弯曲之后,我们应该河以在摄像机里看到它,但因为它的实际位置在摄像机的外面,所以没有对它进渲染
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第24张图片
这里我们参考这个教程:https://youtu.be/SOK3Ias5Nk0
它把摄像机的渲染范围从锥形改成了方形,这样就能确保渲染视野内的所有物体
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第25张图片
这里导入它提供的代码,我加了详细的中文注释,不懂得看看就知道了

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();
    }
}

挂载脚本,运行游戏就可以看到场景上的物体正常显示了
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第26张图片
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第27张图片

Shader Graph连线图

最后贴出完整的Shader Graph连线图
【unity实战】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_第28张图片

源码

我的demo源码:
https://gitcode.net/unity1/world_bend

国外原作者源码:
https://github.com/notslot/tutorial-world-bending

参考

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

完结

如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦

好了,我是向宇,https://xiangyu.blog.csdn.net/

一位在小公司默默奋斗的开发者,出于兴趣爱好,于是开始自习unity。最近创建了一个新栏目【你问我答】,主要是想收集一下大家的问题,有时候一个问题可能几句话说不清楚,我就会以发布文章的形式来回答。 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

你可能感兴趣的:(#,实现100个特效,unity,游戏引擎,游戏)