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.pswp.cn/web/80748.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80748.shtml
英文地址,請注明出處:http://en.pswp.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的訓練過程,…