技术标签: 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之后一般默认会安装好shader Graph,请检查是否安装,如果没有就手动安装
右键创建一个URP的配置
然后我们再打开项目设置(Project Settings),绑定URP配置
现在这些材质就丢失了,因为我们已经把管线切换成了URP,所以原来的Shader文件就不能用了
选择窗口-》渲染-》渲染管线转换器,把所有素材升级为URP
选择URP把下面的子类统统勾选
先点击Initialize Converters,再点击Convert Assets
可以看到我们的素材就回复正常了,
如果切换失败的话,可以通过手动去改材质的shader
配置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连线图
我的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。最近创建了一个新栏目【你问我答】,主要是想收集一下大家的问题,有时候一个问题可能几句话说不清楚,我就会以发布文章的形式来回答。 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99
文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效
文章浏览阅读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模块中有很多核心模块,以下不属于核心模块,使用时需下载的是
文章浏览阅读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回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件
文章浏览阅读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发送邮件
文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码
文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware
文章浏览阅读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.._元素三大等待
文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析
文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code
文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象