【实现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

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签