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对象。
最终效果如下:
相关文章:

Unity3D仿星露谷物语开发9之创建农场Scene
1、目标 绘制农场的场景。通过不同Sorting Layer控制物体的显示优先级,绘制Tilemap地图,添加Tilemap Collider碰撞器,同时添加Composite Collider碰撞器优化性能。 ps:绘制Tilemap的技巧:通过"Shift [" 可…...

STM32-笔记20-测量按键按下时间
1、按键按下的时间-思路 我们先检测下降沿信号,检测到以后,在回调函数里切换成检测上升沿信号,当两个信号都检测到的时候,这段时间就是按键按下的时间,如图所示:>N*(ARR1)CCRx的值 N是在这段时间内&…...

2024年12月30日Github流行趋势
项目名称:free-programming-books 项目地址url:https://github.com/EbookFoundation/free-programming-books项目语言:HTML历史star数:343,398今日star数:246项目维护者:vhf, eshellman, davorpa, MHM5000,…...

SAP PP bom历史导出 ALV 及XLSX 带ECN号
bom总数 104W PS超过XLSX上限 ,那就分文件 *&---------------------------------------------------------------------* *& Report ZRPT_PP_BOM_HIS_ECN *&---------------------------------------------------------------------* *& tcode:zpp0…...
使用WebRTC进行视频通信
一、WebRTC技术简介 什么是WebRTC? 是一种支持浏览器之间实时音频、视频和数据传输的开放源代码项目。它允许开发者在不需要任何第三方插件或软件的情况下实现点对点的实时通信。WebRTC已经成为现代Web应用中的关键技术,为开发者提供了强大的工具和API…...

npm ERR! ECONNRESET 解决方法
问题:npm 命令遇到的错误是 ECONNRESET,这通常与网络连接问题相关。设置代理解决问题。 一、查看当前代理设置 npm config get proxy npm config get https-proxy二、设置代理 npm config set proxy http://your-proxy-address:port npm config set h…...

【连续学习之SS-IL算法】2021年CPVR会议论文Ss-il:Separated softmax for incremental learning
1 介绍 年份:2021 期刊: 2021CPVR Ahn H, Kwak J, Lim S, et al. Ss-il: Separated softmax for incremental learning[C]//Proceedings of the IEEE/CVF International conference on computer vision. 2021: 844-853. 本文提出的SS-IL(…...

Go+chromedp实现Web UI自动化测试
1.为什么使用go进行UI自动化测试? 速度:Go速度很快,这在运行包含数百个UI测试的测试套件时是一个巨大的优势 并发性:可以利用Go的内置并发性(goroutines)来并行化测试执行 简单:Go的简约语法允许您编写可读且可维护…...
【MySQL 高级特性与性能优化】
MySQL 高级特性与性能优化 一、MySQL 存储引擎 (一)InnoDB 存储引擎 1. 特点 支持事务:InnoDB 是 MySQL 中提供完整 ACID 事务支持的存储引擎,这意味着它能够保证数据库操作在复杂的并发环境下的一致性、隔离性、原子性和持久…...

Spring Boot教程之三十九: 使用 Maven 将 Spring Boot 应用程序 Docker 化
如何使用 Maven 将 Spring Boot 应用程序 Docker 化? Docker是一个开源容器化工具,用于在隔离环境中构建、运行和管理应用程序。它方便开发人员捆绑其软件、库和配置文件。Docker 有助于将一个容器与另一个容器隔离。在本文中,为了将Spring B…...
微信小程序开发示例
微信小程序开发涉及多个方面,包括页面布局、交互逻辑、数据处理等。以下是一个简单的微信小程序开发示例,包括页面布局、样式定义、交互逻辑等方面的内容。 一、页面布局(WXML) <!-- index.wxml --> <view class"…...
【机器学习】概述
文章目录 1. 机器学习三步骤2. 机器学习图谱2.1 任务类型 (Task)2.2 模型选择 (Methods)2.3 学习场景 (Scenario) 1. 机器学习三步骤 定义一个模型 (Define a set of function) 选择一组合适的函数来表示模型。 评估模型好坏 (Goodness of function) 找到一个损失函数…...

音视频采集推流时间戳记录方案
音视频同步更多文章 深入理解音视频pts,dts,time_base以及时间数学公式_视频pts计算-CSDN博客 ffplay音视频同步分析_ffplay 音视频同步-CSDN博客 音视频采集打时间戳设计 实时音视频数据的采集和处理场景。具体来说: 采集阶段: 在音视频数据采集过…...

【Linux】:线程安全 + 死锁问题
📃个人主页:island1314 🔥个人专栏:Linux—登神长阶 ⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞 1. 线程安全和重入问题&…...

【深度学习】时间序列表示方法
自然界除了2D的图片数据之外,还有语音、文字,这些数据都有时间的先后顺序的。对于2D的图像的数据,可以用RGB值来表示像素的色彩度。语音可以用信号幅度值来表示,而Pytorch没有自带String支持,在表示文字之前需要进行Em…...

1.微服务灰度发布落地实践(方案设计)
文章目录 前言灰度发布的优点设计概要系统架构图流量控制客户端服务端 路由路径应用客户端实现核心组件分析1.网关2. spring-cloud3. dubbo4. nocas5. thread6. message queue 前言 微服务架构中的灰度发布(也称为金丝雀发布或渐进式发布)是一种在不影响…...

【UE5 C++课程系列笔记】15——Assert的基本使用
目录 概念 一、Check 二、Verify 三、Ensure 对比 基本使用 一、check的基本使用 二、ensure的基本使用 三、verify的基本使用 概念 assert 可在开发期间帮助检测和诊断不正常或无效的运行时条件。这些条件通常检查是否指针为非空、除数为非零、函数并非递归运行&…...

kubernetes Gateway API-1-部署和基础配置
文章目录 1 部署2 最简单的 Gateway3 基于主机名和请求头4 重定向 Redirects4.1 HTTP-to-HTTPS 重定向4.2 路径重定向4.2.1 ReplaceFullPath 替换完整路径4.2.2 ReplacePrefixMatch 替换路径前缀5 重写 Rewrites5.1 重写 主机名5.2 重写 路径5.2.1 重新完整路径5.2.1 重新部分路…...

likeAdmin架构部署(踩坑后的部署流程
1、gitee下载 https://gitee.com/likeadmin/likeadmin_java.git 自己克隆 2、项目注意 Maven:>3.8 ❤️.9 (最好不要3.9已经试过失败 node :node14 (不能是18 已经测试过包打不上去使用14的换源即可 JDK:JDK8 node 需要换源 npm c…...

【一款超好用的开源笔记Logseq本地Docker部署与远程使用指南】
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...