Unity3D仿星露谷物语开发46之种植/砍伐橡树

1、目标

种植一棵橡树,从种子变成大树。

然后可以使用斧头砍伐橡树。

2、删除totalGrowthDays字段

修改growthDays的含义,定义每个值为到达当前阶段的累加天数。此时最后一个阶段就是totalGrowthDays的含义。所以就可以删除totalGrowthDays字段。

(1)修改SO_CropDetailsList的配置信息

修改前的GrowthDays的配置信息:

修改后的GrowthDays的配置信息:

每个值换成了累加的方式。

(2)修改CropDetails.cs脚本

删除totalGrowthDays字段。

(3)修改GridPropertiesManager.cs脚本

找出目前所处的成长阶段换成如下的代码:

// 找出目前所处的成长阶段
for (int i = growthStages - 1; i >= 0; i--)
{if (gridPropertyDetails.growthDays >= cropDetails.growthDays[i]){currentGrowthStage = i;break;}
}

(3)修改GridCursor.cs脚本

Check if crop fully grown的逻辑修改如下:

3、修改CropStandard预制体的配置

修改CropSprite的Sprite Sort Point为Pivot。

修改CropHarvestedSprite的Sprite Sort Point为Pivot,Order in Layer为1。

调整完成后,收获的防风草会显示在Player之前,如下所示:

4、动画系统

已有的动画为:

查看TreeFallingLeft节点:

根级别的Sprite Renderer值为0,被禁用了。

子级别有Top和Trunk两个Sprite Renderer组件。

这就要求动画绑定的预设体有同样的结构。

5、创建橡树预设体

(1)创建CropTreeCanyonOak

在Hierarchy -> PersistentScene下新创建一个物体命名为CropTreeCanyonOak。

添加Box Collider 2D组件和Crop组件,相关配置信息如下:

(2)创建CropSprite

在CropTreeCanyonOak下创建子物体命名为CropSprite。

添加Sorting Group、Sprite Renderer、Animator组件,相应的配置信息如下:

双击Animator下的Controller(Tree),在Animation界面可以看到相关配置被黄色高亮显示,这表明animator识别不到相关的对象。

(3)创建Trunk

在CropSprite下创建物体命名为Trunk,添加组件信息如下:

Auto Tiling(自动贴片)的作用:要是你把 Box Collider 2D 组件添加到使用了瓦片精灵的 Sprite(精灵)上,并且开启了 Auto Tiling,这个组件就能够依据精灵的瓦片布局,自动对碰撞体的形状和大小进行调整。

  1. 贴合瓦片形状:它会按照精灵所使用的瓦片图集的边界,自动调整碰撞体的轮廓,让碰撞检测与精灵的视觉外观精准匹配。
  2. 处理多瓦片精灵:当精灵由多个瓦片组合而成时,Auto Tiling 能够自动生成一个覆盖所有瓦片的组合碰撞体,而无需你手动去调整每个瓦片的碰撞体。
  3. 提升效率:对于复杂的瓦片地图,开启 Auto Tiling 可以节省大量手动设置碰撞体的时间,避免逐个为瓦片添加碰撞体。

添加完成后,Animation下的Trunk立马置灰(正常状态)。

(4)创建Top

在CropSprite下创建子物体命名为Top,添加相关组件的配置信息如下:

添加完成后,Animation下的Top立马置灰(正常状态)。

(5)查看特效

点击CropSprite,点击Animation下的播放,可以看到特效。

(6)移动Prefab

将CropTreeCanyonOak从Hierarchy移动到Assets -> Prefabs -> Crop下。

并且删除Hierarchy下的CropTreeCanyonOak。

6、SO_CropDetailsList添加配置

因为Growth Prefab第5个Prefab已经有图片信息,所以Growth Sprite第5个不再需要图片信息。

7、运行游戏1

首先挖5块土,然后放入橡木种子。

走过未成熟的橡木时,树木会左右晃动。经过成熟的橡木后方时,会有褪色的效果。

接下来处理使用斧头砍伐成年橡树的逻辑。

8、修改GridCursor.cs脚本

修改IsCursorValidForTool函数,添加下面一行代码:

9、修改Player.cs脚本

在ProcessPlayerClickInput函数中添加一行代码:

在ProcessPlayerClickInputTool函数中,添加一个case如下:

case ItemType.Chopping_tool:if (gridCursor.CursorPositionIsValid){ChopInPlayerDirection(gridPropertyDetails, itemDetails, playerDirection);}break;

添加ChopInPlayerDirection函数如下:

private void ChopInPlayerDirection(GridPropertyDetails gridPropertyDetails, ItemDetails itemDetails, Vector3Int playerDirection)
{// Trigger animationStartCoroutine(ChopInPlayerDirectionRoutine(gridPropertyDetails, itemDetails, playerDirection));    
}

添加ChopInPlayerDirectionRoutine函数如下:

private IEnumerator ChopInPlayerDirectionRoutine(GridPropertyDetails gridPropertyDetails, ItemDetails equippedItemDetails, Vector3Int playerDirection)
{PlayerInputIsDisabled = true;playerToolUseDisabled = true;// Set tool animation to axe in override animationtoolCharacterAttribute.partVariantType = PartVariantType.axe;characterAttributeCustomisationList.Clear();characterAttributeCustomisationList.Add(toolCharacterAttribute);animationOverrides.ApplyCharacterCustomisationParameters(characterAttributeCustomisationList);ProcessCropWithEquippedItemInPlayerDirection(playerDirection, equippedItemDetails, gridPropertyDetails);yield return useToolAnimationPause;// After animation pause yield return useToolAnimationPause;PlayerInputIsDisabled = false;playerToolUseDisabled = false;
}

修改ProcessCropWithEquippedItemInPlayerDirection如下,添加了对case ItemType.Chopping_tool的支持。

private void ProcessCropWithEquippedItemInPlayerDirection(Vector3Int playerDirection, ItemDetails equippedItemDetails, GridPropertyDetails gridPropertyDetails)
{switch (equippedItemDetails.itemType){case ItemType.Chopping_tool:if(playerDirection == Vector3Int.right){isUsingToolRight = true;}else if(playerDirection == Vector3Int.left){isUsingToolLeft = true;}else if(playerDirection == Vector3Int.up){isUsingToolUp = true;}else if(playerDirection == Vector3Int.down){isUsingToolDown = true;}break;case ItemType.Collecting_tool:if (playerDirection == Vector3Int.right){isPickingRight = true;}else if (playerDirection == Vector3Int.left){isPickingLeft = true;}else if (playerDirection == Vector3Int.up){isPickingUp = true;}else if (playerDirection == Vector3Int.down){isPickingDown = true;}break;case ItemType.none:break;}// Get crop at cursor grid locationCrop crop = GridPropertiesManager.Instance.GetCropObjectAtGridLocation(gridPropertyDetails);// Execute Process Tool Action For cropif(crop != null){switch (equippedItemDetails.itemType){case ItemType.Chopping_tool:crop.ProcessToolAction(equippedItemDetails, isUsingToolRight, isUsingToolLeft, isUsingToolDown, isUsingToolUp);break;case ItemType.Collecting_tool:crop.ProcessToolAction(equippedItemDetails, isPickingRight, isPickingLeft, isPickingDown, isPickingUp);break;}}
}

10、运行游戏2

存在一个问题:就是砍树的时候,用的不是斧头,而是锄头。这是因为使用了默认的Tool即Hoe。

之前,当玩家携带一个道具时,我们为动画创建了一些脚本对象资产,以便可以在携带道具和不携带之间切换。

现在,我们需要对use tool动画做类似的事情,以便在axe和hoe两个工具之间切换。

11、新建Animation Type

在Assets -> Scriptable Object Assets -> Animation -> Animation Types下新建tool目录,在其下再创建目录NoneAxe。

该目录右击,Create -> Scriptable Objects -> Animation -> Animation Type,重命名为ToolNoneAxeUseToolDown。

配置ToolNoneAxeUseToolDown的相关信息:

以同样的方式,分别创建ToolNoneAxeUseToolLeft、ToolNoneAxeUseToolRight、ToolNoneAxeUseToolUp。

比如ToolNoneAxeUseToolRight的参数如下:

在tool目录下再创建目录NoneHoe,相应地创建4个AnimationType,比如ToolNoneHoeUseToolDown如下:

在tool目录下再创建目录NoneScythe,相应地创建4个AnimationType,比如ToolNoneScytheSwingToolDown如下:

在tool目录下再创建目录NoneWateringCan,相应地创建4个AnimationType,比如ToolNoneWateringCanLiftToolUp如下:

新建完毕后,将上面16个添加到Player的CharacterCustomiser下:

添加完毕后,相应的数量从24变为40。

12、运行游戏3

再次砍树,发现正确使用了斧头这个工具

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

容器化-K8s-镜像仓库使用和应用

一、K8s 镜像仓库使用 1、启动镜像仓库 cd/usr/local/harbor ./install.sh2、配置镜像仓库地址 在 master 节点和 slaver 节点上,需要配置 Docker 的镜像仓库地址,以便能够访问本地的镜像仓库。编辑 Docker 的配置文件 vi /etc/docker/daemon.json(如果不存在则创建),添…

塔式服务器都有哪些重要功能?

塔式服务器作为一种拥有着独特立式设计的服务器,能够帮助企业节省一定的放置空间,提供一系列的功能和优势,可以运用在多种应用场景当中,下面将探讨一下塔式服务器的主要功能都有哪些? 塔式服务器可以支持基本的应用程序…

2025年- H36-Lc144 --739. 每日温度(单调栈)--Java版

1.题目描述 2.思路 (1)单调栈维护单调递增或者单调递减的数列 (2)因为要求找到当前元素 右边区域,第一个比当前元素大的元素,所以取单调增数量。 (3)单调栈存储元素的索引。如果遇到…

架构选择/区别

目录 一、分层架构(Layered Architecture) 二、微服务架构(Microservices Architecture) 三、分布式架构(Distributed Architecture) 四、单体架构(Monolithic Architecture) 五…

Python----循环神经网络(WordEmbedding词嵌入)

一、编码 当我们用数字来让电脑“认识”字符或单词时,最简单的方法是为每个字符或单词分配一个唯一的编号,然后用一个长长的向量来表示它。比如,假设“我”这个字在字典中的编号是第10个,那么它的表示就是一个很多0组成的向量&…

深入解析Spring Boot与微服务架构:从入门到实践

深入解析Spring Boot与微服务架构:从入门到实践 引言 随着云计算和分布式系统的快速发展,微服务架构已成为现代软件开发的主流模式。Spring Boot作为Java生态中最受欢迎的框架之一,为开发者提供了快速构建微服务的强大工具。本文将深入探讨…

DeepSeek 赋能数字孪生:重构虚实共生的智能未来图景

目录 一、数字孪生技术概述1.1 数字孪生的概念1.2 技术原理剖析1.3 应用领域与价值 二、DeepSeek 技术解读2.1 DeepSeek 的技术亮点2.2 与其他模型的对比优势 三、DeepSeek 赋能数字孪生3.1 高精度建模助力3.2 实时数据处理与分析3.3 智能分析与预测 四、实际案例解析4.1 垃圾焚…

Amazon Q 从入门到精通 – 测试与重构

Amazon Q Developer 是亚马逊推出的一个专为专业开发人员设计的人工智能助手,旨在提升代码开发和管理效率。其主要功能包括代码生成、调试、故障排除和安全漏洞扫描,提供一站式代码服务。 众所周知,在软件开发领域,测试代码是软件…

专题五:floodfill算法(图像渲染深度优先遍历解析与实现)

以leetcode733题为例 题目解析: 给一个初始坐标(sr,sc)比如示例中的粉色的1,如果周围上下左右都是1,就是连通块(性质相同的地方),把它涂上颜色(2&#xff09…

在金融发展领域,嵌入式主板有什么优点?

在金融发展领域,嵌入式主板能够有力推动金融行业的智能化与高效化进程。主板的强大计算能力可以保障业务高效运行。例如在银行的高频交易场景下,其强大计算能力可确保系统在高负荷下依然保持流畅稳定,快速响应用户需求,大大提升金…

《Python星球日记》 第94天:走近自动化训练平台

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、自动化训练平台简介1. Kubeflow Pipelines2. TensorFlow Extended (TFX)二、自动化训练流程1. 数据预处理2. 模型训练3. 评估与部署三、构建…

PHP、JAVA、Shiro反序列化

目录 一、PHP反序列化 二、JAVA反序列化 三、Shiro反序列化 Shiro-550 反序列化漏洞原理 Shiro-721 反序列化漏洞原理 Padding Oracle 漏洞补充: 防御措施: 一、PHP反序列化 主要是分为有类和无类: 1、有类:就有相关的魔术…

AM32电调学习解读六:main.c文件的函数介绍

最近在学习AM32电调的2.18版本的源码,我用的硬件是AT32F421,整理了部分流程处理,内容的颗粒度是按自己的需要整理的,发出来给有需要的人参考。按自己的理解整理的,技术能力有限,可能理解有误,欢…

WebSocket实时双向通信:从基础到实战

一、WebSocket 基础概念 1. 什么是 WebSocket? 双向通信协议:与 HTTP 的单向请求不同,WebSocket 支持服务端和客户端实时双向通信。 低延迟:适用于聊天室、实时数据推送、在线游戏等场景。 协议标识:ws://&#xff…

【算法】分支限界法和贪心、动态规划、回溯、分治法的区别是

什么是分支限界法 分支限界法是一种用于求解最优化问题的算法,其核心思想是通过剪枝策略减少搜索空间。 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。 在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就…

[自动化集成] 使用明道云上传附件并在Python后端处理Excel的完整流程

在企业日常自动化场景中,使用低代码平台如明道云搭建前端界面,结合自定义Python后端服务,实现灵活数据处理是一种高效的组合方式。本文将分享一个典型的集成用例:用户通过明道云上传文本和Excel附件,Python后端接收并解析这些信息,最终实现完整的数据处理闭环。 项目背景…

ubuntu下实时检测机械硬盘和固态硬盘温度

sudo apt update sudo apt install smartmontools然后,使用smartctl命令查看硬盘的详细信息,包括温度: sudo smartctl -a /dev/sda实时监控硬盘温度 虽然smartctl不能直接实时显示温度,你可以使用watch命令结合smartctl来定期查…

游戏开发实战(二):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】

文章目录 奇美拉和队列奇美拉被动技能多对多观察者关系实现自定义元类奇美拉基类 管理奇美拉的队列奇美拉队列类心得体会扩展 规则定义工作相关奇美拉相关 奇美拉属性 在本篇博文,我将介绍本项目的整体框架,以及“编码规则”,这些规则保证了本…

Redis实现分布式锁的进阶版:Redisson实战指南

一、为什么选择Redisson? 在上一篇文章中,我们通过Redis原生命令实现了分布式锁。但在实际生产环境中,这样的基础方案存在三大痛点: 锁续期难题:业务操作超时导致锁提前释放不可重入限制:同一线程无法重复…

大语言模型 12 - 从0开始训练GPT 0.25B参数量 MiniMind2 补充 训练开销 训练步骤 知识蒸馏 LoRA等

写在前面 GPT(Generative Pre-trained Transformer)是目前最广泛应用的大语言模型架构之一,其强大的自然语言理解与生成能力背后,是一个庞大而精细的训练流程。本文将从宏观到微观,系统讲解GPT的训练过程,…