【实现100个unity特效之1】使用Shader Graph实现动物森友会的世界弯曲效果(带源码)_弯曲世界-程序员宅基地

技术标签: unity  # 实现100个unity特效  游戏引擎  游戏  

前言

本文的灵感来自动物森友会的神奇世界!动物们在这里生活、探索和建设,而世界弯曲的效果给游戏增添了更多的魅力和惊喜。你是否曾经想过如何使用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

完结

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

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36303853/article/details/131604523

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签