本文的灵感来自动物森友会的神奇世界!动物们在这里生活、探索和建设,而世界弯曲的效果给游戏增添了更多的魅力和惊喜。你是否曾经想过如何使用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之后一般默认会安装好shader Graph,请检查是否安装,如果没有就手动安装
右键创建一个URP的配置
然后我们再打开项目设置(Project Settings),绑定URP配置
现在这些材质就丢失了,因为我们已经把管线切换成了URP,所以原来的Shader文件就不能用了
选择窗口-》渲染-》渲染管线转换器,把所有素材升级为URP
选择URP把下面的子类统统勾选
先点击Initialize Converters,再点击Convert Assets
可以看到我们的素材就回复正常了,
如果切换失败的话,可以通过手动去改材质的shader
将我们配置好的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();
}
}
我的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。最近创建了一个新栏目【你问我答】,主要是想收集一下大家的问题,有时候一个问题可能几句话说不清楚,我就会以发布文章的形式来回答。 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~