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 的首页,持续学…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...