Unity3D仿星露谷物语开发9之创建农场Scene

1、目标

绘制农场的场景。通过不同Sorting Layer控制物体的显示优先级,绘制Tilemap地图,添加Tilemap Collider碰撞器,同时添加Composite Collider碰撞器优化性能。

ps:绘制Tilemap的技巧:通过"Shift + [" 可以左右翻转Tile,通过"]"可以旋转Tile

2、创建新Scene

点击【File -> New Scene】,创建新的场景命名为Scene1_Farm。

将该Scene保存到Assets -> Scenes下。现在该目录下有2个Scene,其中PersistentScene保存游戏的核心逻辑,该逻辑不会因为场景切换而消失。

现在,我们需要这两个场景同时存在。此时,点击PersistentScene,然后右击Scene1_Farm选择“Open Scene Additive”,以附加的形式打开第2个场景。

添加完成后,我们看到Hierarchy中同时存在了2个Scene。

在Hierarchy中右击Scene1_Farm,点击“Set Active Scene”。虽然同时存在两个场景,但是只能有一个激活场景。

3、创建Tilemap Grid

(1)Tilemap的概念

Tilemap是Unity中用于绘制2D地图的核心工具。它允许开发者以瓦片(Tile)为单位,快速构建出复杂的地图场景。以下是Tilemap基础绘制步骤:

1)创建Tilemap

在Unity的层级窗口中,依次点击“Create”->“2D Object”->“Tilemap”,这将自动创建包含Grid和Tilemap两个GameObject对象的结构。Grid对象负责定义网格属性,而Tilemap对象则用于绘制瓦片。

2)配置调色板(Palette)

打开调色板窗口(Window->Tile Palette),并创建一个新的调色板。将所需的精灵(Sprite)拖动到调色板中,以生成对应的瓦片。这些瓦片将用于后续的地图绘制。

3)绘制地图

选择调色板中的瓦片,并使用笔刷(Brush)工具将其绘制到Tilemap上。通过调整笔刷的大小和形状,可以绘制出线条、方块等各种形状。

4)添加碰撞体

为了让角色能够在地图上移动并触发碰撞事件,需要给Tilemap对象添加一个Tilemap Collider 2D组件。此外,还可以通过Composite Collider来优化碰撞体的生成,以减少不必要的性能开销。

(2)Tilemap创建示例

删除Scene1_Farm中的Main Camera。

右击Scene_Farm,点击GameObject -> 2D Object -> Tilemap -> Rectangular。

创建完毕后,重新命名如下所示:

为了绘制有层次感的地图,我们需要绘制多个Tilemap,对应不同的Sorting Layer。这样做的好处是:比如可以在第一层放置草,第二层放置花,这样花不会遮挡草,更有层次感。

所有的层级关系如下:

通过复制Tilemap类型的Ground1,我们得到如下9个Tilemap:

(3)创建Sorting Layer

给每个Tilemap创建对应的Sorting Layer,Sorting Layer的排序也是一致的。

调整每个Tilemap对应的Sorting Layer值。

(4)创建GridProperties

假如我们希望在Tilemap中绘制出玩家在种植作物时可以挖掘的东西,可以通过Tilemap来绘制这些信息,但是对玩家是不显示的,需要使用代码来检索他们。

所以在Tilemap Grid中,右击创建一个空的游戏对象命名为GridProperties。在这个对象下,我们将创建一些隐藏的Tilemap。

其中Boolxxx都是tilemap类型的。

设置所有Boolxxx的Tilemap的Sorting Layer为Collisions。

暂时设置GridProperties为非Active,我们在后面教程中再使用该功能。

(5)保存Tilemap Grid为预设体

在Assets -> Prefabs下创建Maps目录,并将Tilemap Grid拖入到该目录下生成预设体。

接着,解除Tilemap Grid与预设体的关联,右击 -> Prefab -> Unpack Completely。如果Tilemap Grid与预设体有关联,将大大减慢速度。

4、绘制Tilemap地图

(1)准备工作

在Assets -> Tilemap下创建Tiles和Tile Palettes两个目录。

其中Tile Palettes存放外部导入的瓦片图片,Tiles存放瓦片数据。

打开Tile Palette面板,位于【Window -> 2D -> Tile Palette】。

(2)创建GroundTileSet

在Assets -> Tilemap -> Tiles下再创建子目录GroundTileSet。

在Tile Palette面板下新建一个Palette命名为GroundTileSet。

点击Create之后,保存到Assets -> Tilemap -> Tile Palettes目录下。

将Assets -> Sprites -> Tile Sprites下的GroundTileSet拖入Tile Palette如下:

拖入后提示保存位置时,选择Assets -> Tilemap -> Tiles -> GroundTileSet目录。

选中Assets -> Tilemap -> Tiles -> GroundTileSet下生成的所有Tile,切换到Inspector面板,设置Collider Type为None。我们不希望这些Ground类型的Tile与物理系统发生交互。

(3)通过Bush绘图

1)选择Coordinate Brush

在Tile Palette面板中选择Coordinate Brush,该Brush会在绘画时实时显示坐标的信息。

第一个选项的值“Ground1”对应Hierarchy -> Scene1_Farm -> Tilemap Grid中的Ground1,后续手工绘制时创建的tiles都属于Hierarchy -> Scene1_Farm -> Tilemap Grid -> Ground1对象。

2)创建地图4个顶点

现在我们要创建80*60的地图,所以X方向是40,Y方向是30,两个方向都是从0开始的。

我们选择一个Tile,分别放到(40,30,0),(-40,30,0),(40,-30,0),(-40,-30,0)。

以上4个点确定了农场的大小。

3)使用Pick进行复制

我们拖动Tile创建一条边如下:

然后使用Tile Palette中的Pick工具选择这条边进行快速的复制。

处理完之后效果如下:

目前草地上草的图案一模一样有点假,需要选择其他几种草的Tile随机点缀在某一块区域,然后在将该区域复制到整个草坪上。这样整个草坪都是各种各样的草图案。

如上面的草坪,就不会单一了。

4)绘制路面

绘制的路面如下图土灰色部分。

5)路面镶边

6)在Ground2上种花

7)在Ground3放石块和篱笆

石块的分布点如下:

创建篱笆后整体效果如下:

角色散步的画面如下:

5、创建农舍

(1)导入Tilemap

创建新的Palette

存储到Assets -> Tilemap -> Tile Palettes下:

将Sprites Textures -> Buildings下的Farmhouse 拖入到Tile Palette,并将tilemap存到Assets -> Tilemap -> Tiles -> Buildings。

设置所有的Tiles的Collider Type为None.

(2)绘图

为了形成深度的错觉,房子会切分成两部分绘制,上部分的显示层级高于人,下部分的显示层级低于人。这样人可以走到屋子的前面,只能走到屋顶的后面。

这部分选择Ground2.

这部分选择Front1。

在Scene中重新组装后如下:

6、添加碰撞

(1)导入Tile

目前房子、围栏、石块等人都是可以穿过去的,这个是不正确的,需要在一些物体上添加碰撞体,这样人就不用穿透过去了。

创建新的Pallete名为"Custom Tiles",并保存到Assets -> Tilemap -> Tile Palettes下。

把”Collision Tile Diagonal / CollisionTile / HalfCollisionTile"三个拖入到Palettes中,并且保存到Assets -> Tilemap -> Tiles -> Custom Tiles目录下。

确保这3个Tile的Collider Type为"Sprite"。

我们要做的是将一个Tilemap Collision 2D组件附加到我们的collision层上,通过碰撞器可以防止玩家穿透他们。

(2)给玩家添加box collider组件

给玩家添加Box Collider 2D组件。

修改Offset和Size的值,使得碰撞器只出现在玩家的脚下。

(3)绘制Collisions Tilemap

先给房屋添加Custom Tiles中的Tilemap,Target选择"Collisions"对象。

绘制后的效果如下:

(4)Collisions对象添加Tilemap Collider组件

此时角色不能再穿透蓝色标记部分的区域。

反勾选Tilemap Renderer组件,使得Collisions对象(蓝色部分)不要显示出来。

(5)添加Composite Collider组件

此时在Scene界面中显示如下:

每一个绿色边缘的方块代表一个碰撞器,当角色移动时可能要触发与N个碰撞体的碰撞检测,这个效率太低了。

所以,需要把所有这些合并起来。一个区域设置为一个单独的碰撞器即可。所以连在一起的区域的创建一个复合碰撞器。

Collisions对象添加Composite Collider 2D组件,并且设置Geometry Type为"Polygons"。

Collisions对象的Tilemap Collider 2D组件下,勾选"Used By Composite"。

此时我们看到原来N个碰撞器合并成了一个平铺的多边形的碰撞器。

为了提高性能,设置Collisions对象下Rigidbody 2D组件的Body Type属性为"Static"。

(6)整个Scene绘制Collisions对象

重新打开Collisions的Tilemap Renderer组件进行绘制。

绘制完毕后再反选"Tilemap Renderer"组件进行关闭。

7、添加树

在Hierarchy -> Scene1_Farm下创建空物体命名为Scenary。

然后在Scenary下创建空物体命名为Bushes。

在Assets -> Prefabs下创建目录Scenary,以便保存相关的预设体。

(1)创建Bush

Assets -> Sprites -> Sprite Textures -> Scenary下,将TumbleweedThistle放到Scene中,并且Hierarchy放到Scenary -> Bushes下。

设置TumbleweedThistle属性如下:

为了让角色不能穿透Bush,给TumbleweedThistle对象添加Box Collider 2D组件,其属性设置如下:

TumbleweedThistle对象修改让所有预设体生效,点击其Overrides选项,再点击"Apply All"。

此时再查看预设体的Inspector,看到也已经有了Box Collider 2D组件。

然后在Scene里面放置多个Bush。

(2)创建风景树

使用Assets -> Sprites -> Sprite Textures -> Scenary下的WildOakScenary素材。

相关的设置如下:

这个树只是作为风景树使用,是不能采伐的。

然后在Scene中多创建一些WildOakScenary对象。

(3)创建可砍伐树

使用Assets -> Sprites -> Sprite Textures -> Trees下的CanyonOa素材。

设置Sorting Layer为1,其Order in Layer为1,因为要比Trunk的优先级要高。然后放到Prefab目录下。

Trunk素材 也在Assets -> Sprites -> Sprite Textures -> Trees下。注意设置其Order in Layer为0。

然后在Scene中多创建一些CanyonOa对象。

最终效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/947259.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 定时任务:轻松创建与精准执行

Linux 定时任务:轻松创建与精准执行 在 Linux 系统的运维与自动化管理领域,定时任务扮演着举足轻重的角色。它能够让系统在预设的时间点或周期性时段,自动执行特定的脚本、命令,极大地减轻了管理员的工作负担,提升工作…

Linux驱动开发:深入理解I2C时序(二)

在Linux驱动开发中,I2C时序的理解和正确处理是保证I2C设备正常工作和通信的关键。I2C协议的时序特性决定了数据的有效传输和设备间的协作。因此,掌握I2C的时序细节,以及如何在Linux内核中进行时序处理,能够让开发者更好地处理设备通信问题。 本文将继续深入探讨I2C通信协议…

国产编辑器EverEdit - 常用资源汇总

1 国产编辑器EverEdit-常用资源汇总 EverEdit是一款国产文本编辑器,历经超过15年的更新和维护,拥有不输业界顶级商业文本编辑器(EmEditor、UltraEdit)的实力,甚至在某些方面的功能更强(当然,各有千秋),开发者对文本编辑…

解决uniapp H5页面限制输入框只能输数字问题

工作记录 最最近在做 uniapp 开发的移动端 H5 页面,有个需求是金额输入框只能输入数字,不能输入小数点和其他字符,经过各种尝试,发现其他字符可以通过正则过滤掉,但是输入小数点的话,因为没有触发 input 和…

面试准备备备备

职业技能 放到简历的黄金位置(HR刷选简历的重要参考) 基本准则:写在简历上的必须能聊,不然就别写 参考公式:职业技能 必要技术 其他技术 针对性的引导面试官(让他问一些你想让他问的) 寻找合…

npm install --global windows-build-tools --save 失败

注意以下点 为啥下载windows-build-tools,是因为node-sass4.14.1 一直下载不成功,提示python2 没有安装,最终要安装这个,但是安装这个又失败,主要有以下几个要注意的 1、node 版本 14.21.3 不能太高 2、管理员运行 …

Jenkins 中自动化部署 Spring Boot 项目

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…

【DSP/matlab】fftshift 是什么意思?在信号处理中有什么作用?

文章目录 前言一、定义什么是 fftshift?fftshift 在信号处理中的作用: 前言 dsp_paper 一、定义 fftshift 是一个在信号处理和数字信号处理中常用的函数,特别是在使用快速傅里叶变换(FFT)时。这个函数的主要作用是将…

【PCIe 总线及设备入门学习专栏 4.2 -- PCI 总线的三种传输模式 】

文章目录 OverviewProgrammed I/O(PIO)Direct Memory Access (DMA)Peer-to-Peer 本文转自:https://blog.chinaaet.com/justlxy/p/5100053095 Overview 本文来简单地介绍一下PCI Spec规定的三种数据传输模型:Programmed I/O&…

SpringBoot_第二天

SpringBoot_第二天 学习目标 Mybatis整合&数据访问 使用SpringBoot开发企业项目时,持久层数据访问是前端页面数据展示的基础,SpringBoot支持市面上常见的关系库产品(Oracle,Mysql,SqlServer,DB2等)对应的相关持久层框架,当然除了对于关系…

分类模型评估利器-混淆矩阵

相关文章 地理时空动态模拟工具介绍(上) 地理时空动态模拟工具介绍(下)地理时空动态模拟工具的使用方法 前言 混淆矩阵(Confusion Matrix)是机器学习领域中用于评估分类模型性能的一种工具。它通过矩阵的…

【SpringMVC】拦截器

拦截器(Interceptor)是一种用于动态拦截方法调用的机制。在 Spring MVC 中,拦截器能够动态地拦截控制器方法的执行过程。以下是请求发送与接收的基本流程: 当浏览器发出请求时,请求首先到达 Tomcat 服务器。Tomcat 根…

el-table 实现纵向多级表头

为了实现上图效果,最开始打算用el-row、el-col去实现,但发现把表头和数据分成两大列时,数据太多时会导致所在格高度变高。但由于每一格数据肯定不一样,为保持高度样式一致,就需要我们手动去获取最高格的高度之后再设置…

[paddle] 非线性拟合问题的训练

利用paddlepaddle建立神经网络,模拟有限个数据的非线性拟合 本文仍然考虑 f ( x ) sin ⁡ ( x ) x f(x)\frac{\sin(x)}{x} f(x)xsin(x)​ 函数在区间 [-10,10] 上固定数据的拟合。 import paddle import paddle.nn as nn import numpy as np import matplotlib.…

深入理解Python中的常用数据格式(如csv、json、pickle、npz、h5等):存储机制与性能解析

在数据科学与工程领域,数据的存储与读取是日常工作中不可或缺的一部分。选择合适的数据格式不仅影响数据处理的效率,还关系到存储空间的利用与后续分析的便捷性。本文将以通俗易懂的方式,深入探讨Python中几种常用的数据读写格式(…

算法 class 005 (对数器C语言实现)

对数器的概念: 用来测试你的算法是否正确。 怎么做呢? 1:比如,写个冒泡排序,作为对比的对象 2:生成一个随机数 数组,用来测试 3:用冒泡排序和你想要验证的那个排序算法,同…

基于AT89C51单片机的可暂停八路抢答器设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/90196607?spm1001.2014.3001.5503 C15 部分参考设计如下: 摘要 随着社会进步和科技发展,电子设备在各类活动中的应用日益普遍&#xff0c…

IoC设计模式详解:控制反转的核心思想

前言:在软件开发中,设计模式是一种经过验证的、在特定场景下能有效解决问题的解决方案。控制反转(Inversion of Control,IoC) 作为一种设计模式,通过让程序的控制流和对象管理反转,从而使得代码…

使用C#构建一个论文总结AI Agent

前言 我觉得将日常生活中一些简单重复的任务交给AI Agent,是学习构建AI Agent应用一个很不错的开始。本次分享我以日常生活中一个总结论文的简单任务出发进行说明,希望对大家了解AI Agent有所帮助。任务可以是多种多样的,真的帮助自己提升了…

[Qt] 常用控件 | QWidget | “表白程序2.0”

目录 一、控件概述 控件体系的发展阶段: 二、QWidget 核心属性 核心属性概览: 1、enabled 2、Geometry 实例 1: 控制按钮的位置 实例 2: 表白 程序 i、Window Frame 的影响 ii、API 设计理念 iii、Geometry 和 FrameGeometry 的区别 &#xf…