Unity學習筆記(五)——3DRPG游戲(2)

添加更多的敵人

編輯EnemyController,解決報錯導致敵人無法注冊觀察者模式,從而無法執行敵人慶祝動畫

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public enum EnemyStatus { GUARD,PATROL,CHASE,DEAD } //分別表示守衛(站樁)、巡邏(來回走動)、追逐、死亡狀態
[RequireComponent(typeof(NavMeshAgent))]  //拖拽時自動添加component
public class EnemyController : MonoBehaviour,IEndGameObserver
{private EnemyStatus enemyStatus;...void Start(){//在點擊Play時才會執行,在Awake后執行if (isGuard){//如果勾選了站樁,進入守衛模式enemyStatus = EnemyStatus.GUARD;}else {//否則進入巡邏模式enemyStatus = EnemyStatus.PATROL;GetNewWayPoint();//獲取一個巡邏路徑點}//TODO: 場景切換后修改GameManager.Instance.AddOberver(this);}//啟用時//void OnEnable() //在做場景加載時用到//{//    GameManager.Instance.AddOberver(this);//在執行OnEnable時沒有找到GameManger//}//禁用時(與OnDestory區別:銷毀完成后執行)void OnDisable(){//人物消失或游戲停止時執行if (GameManager.isInitialized) return; //如果GameManager沒有生成時直接returnGameManager.Instance.RemoveObserver(this);}...
}

編輯PlayerController,避免Player死亡時仍然可以移動,添加對是否死亡的判斷

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;public class PlayerController : MonoBehaviour
{private NavMeshAgent agent;...public void MoveToTarget(Vector3 target) {StopAllCoroutines(); //這個代碼是用于:當人物向怪物移動攻擊時,如果鼠標點擊了其他地方可以打斷向怪物移動的協程if (isDead) return; //如果已經死亡則returnagent.isStopped = false;//還原非禁止狀態,保證攻擊后人物能繼續移動agent.destination = target; //指定人物移動到的位置}private void EventAttack(GameObject target){if (isDead) return; //如果已經死亡則returnif (target != null) {attackTarget = target;characterStatus.isCritical = UnityEngine.Random.value < characterStatus.attackData.criticalChance;//計算是否暴擊StartCoroutine(MoveToAttackTarget());//執行攜程函數 StartCoroutine:用于創建和啟動協程(Coroutine)的核心函數,可以暫停執行并在之后的某個時間點繼續執行}}...
}

如果再復制一個Slime,當消滅掉一只時,另一只也死亡了,這是因為多個Slime用的同一個Slime Data,因此我們編輯CharacterStatus,創建模板并使用模板創建數據對象

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CharacterStatus : MonoBehaviour
{public CharacterData_SO templateData;//模板數據public CharacterData_SO characterData;public AttackData_SO attackData;[HideInInspector] //不希望在界面中顯示public bool isCritical;//是否暴擊void Awake(){if (templateData != null) {characterData = Instantiate(templateData);//Instantiate:借助已有的預制體(Prefab),能夠創建新的游戲對象實例}}...
}

然后修改兩個Slime的配置如圖

這樣就不會互相影響了

添加新的怪物:將其拖拽到Hierarchy

刪除其原有的Controller

編輯EnemyController,添加新的RequireComponent

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public enum EnemyStatus { GUARD,PATROL,CHASE,DEAD } //分別表示守衛(站樁)、巡邏(來回走動)、追逐、死亡狀態
[RequireComponent(typeof(NavMeshAgent))]  //拖拽時自動添加component
[RequireComponent(typeof(CharacterStatus))]  //拖拽時自動添加component
public class EnemyController : MonoBehaviour,IEndGameObserver
{private EnemyStatus enemyStatus;private NavMeshAgent agent;...
}

如圖進行添加

然后將其Tag設為Enemy,并添加Box Collider組件

設置Agent屬性

創建基礎數值對象(Create->Character Status->Data)取名為TurtleShell Data,設置如圖

創建攻擊數據對象(Create->Attack->Attack Data)取名為TurtleShell BaseAttackData,設置如圖

綁定攻擊數據對象和基礎數據對象

配置EnemyController屬性

在Animator下創建Animator Override Controller,取名為Enemy_TurtleShell

在Enemy_TurtleShell屬性界面中選擇Enemy_Slime作為需要覆蓋的原始類,下面的是原始類已有的動畫,將需要的替換即可

ctrl+D復制Attack01和Attack02,然后拖拽到Enemy/TurtleShell(需新建此文件夾)下

綁定Enemy_TurtleShell

然后逐一去替換TurtleShell下動畫

如果發現多了一個CharactorStatus一定要記得刪掉

引入新的素材

Mini Legion Grunt PBR HP Polyart | Characters | Unity Asset Store

Mini Legion Rock Golem PBR HP Polyart | Characters | Unity Asset Store

將其添加到我的資源,然后進行Download、Import,然后將其放在Assets Packs下,如圖

同樣不要忘了選擇Edit->Render Pipline,如圖選擇將所有素材都適配渲染組件,然后選擇Proceed

然后我們將Prefab下的素材拖拽到Hierarchy創建兩個敵人,將其擺放到想要的位置

將Hierarchy的TurtleShell拖拽到Prefebs/Characters下,選擇Original Prefab

為GruntPolyart新建Box Collider組件,然后調整其范圍(使用矩形面上的小點);設置Tag為Enemy;刪掉原有的Controller;

另一個怪物同理,另外需要改一下它的名字

修改野人、石頭人身體材質(修改后身體顏色會更亮、反光效果)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89780.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89780.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89780.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025測繪程序設計國賽實戰:一輪終章 | 單向后方交會C#實現

前言本文是小編對六道國賽試題中的最后一個試題&#xff0c;單向后方交會的一篇學習日志。本文的整體架構&#xff0c;依舊首先拿訓練數據跟大家介紹本題涉及到的數據的屬性含義&#xff0c;涉及到算法的原理、執行流程和終極目的。然后附上小編用C#來實現的程序&#xff0c;從…

基于Echarts的氣象數據可視化網站系統的設計與實現(Python版)

本系統旨在構建一個基于Echarts的氣象數據可視化系統&#xff0c;本系統能夠從中國天氣網爬取實時天氣數據&#xff0c;并進行存儲、分析和可視化展示。用戶可以通過網頁界面查看不同地區的天氣情況&#xff0c;以及歷史天氣數據的變化趨勢。 技術棧&#xff1a;Python語言、My…

HarmonyOS 啟動提速秘籍:懶加載全鏈路實戰解析

摘要 隨著移動應用功能越來越復雜、界面越來越豐富&#xff0c;應用啟動慢、內存占用高等問題也越來越普遍。特別是在 HarmonyOS NEXT 應用開發中&#xff0c;如果不加優化&#xff0c;用戶打開頁面時可能要等好幾秒&#xff0c;體驗就很差了。 懶加載&#xff08;Lazy Loading…

全新安裝Proxmox VE啟動時卡在Loading initial ramdisk

原因&#xff1a; 使用了Ventoy啟動盤裝載 Proxmox ISO 文件安裝。 要用Ventoy優盤啟動&#xff0c;選擇Advance Option里的Rescue Boot&#xff0c; 修改文件/etc/default/grub.d/installer.cfg&#xff0c;刪除rdinit/vtoy/vtoy運行 update-grub 更新grub配置&#xff0c;重啟…

【Java項目安全基石】登錄認證實戰:Session/Token/JWT用戶校驗機制深度解析

目錄 1.前言 2.正文 2.1Cookie—Session機制 2.1.1核心原理圖解&#xff1a; 2.1.2四步核心流程&#xff1a; 2.1.3存儲架構對比 2.1.4集群部署方案&#xff08;Spring Session Redis&#xff09; 2.2Token令牌 2.2.1核心原理圖解&#xff1a; 2.2.2四步核心流程&am…

融合優勢:SIP 廣播對講聯動華為會議 全場景溝通響應提速?

SIP 廣播對講與華為視頻會議融合解決方案&#xff0c;是基于 SIP 協議將廣播對講系統與華為視頻會議系統進行整合&#xff0c;實現通信資源共享與業務流程聯動&#xff0c;可提升應急響應效率與溝通協作能力。融合原理&#xff1a;SIP 是一種基于文本的應用層協議&#xff0c;具…

Milvus Dify 學習筆記

目錄 docker方式&#xff1a; 模式一&#xff1a;Milvus Lite linux docker方式&#xff1a; 下載yml文件&#xff0c; https://github.com/milvus-io/milvus/releases docker啟動&#xff1a; docker compose up -d from pymilvus import connections connections.conne…

汽車ECU控制器通信架構

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

【Linux】基本指令(入門篇)(上)

目錄 前言 1.目錄操作指令 1.1指令 1.2理論 1.2.1文件 1.2.2目錄與路徑 2.文件操作指令 2.1指令 2.2理論 2.2.1輸出與輸入 2.2.2一切皆文件 前言 這是Linux學習下的第一篇文章&#xff0c;后續Linux的學習也會持續更新分享。 Linux的基本指令是使用Linux操作系統的基礎…

正向代理與反向代理理解

問&#xff1a; 應用a請求ng&#xff0c;然后ng根據不同請求路徑將請求轉發到不同的服務器&#xff0c;對于應用a來說這個ng是正向代理角色還是反向代理呢&#xff1f; 答&#xff1a; 在這個場景中&#xff0c;Nginx 扮演的是反向代理的角色&#xff0c;而不是正向代理。以下是…

【Kafka】深入理解 Kafka MirrorMaker2 - 實戰篇

文章目錄一、把“家伙事兒”都備齊二、部署其實很簡單三、配置 MirrorMaker2四、修改啟動腳本五、集群啟動與驗證六、這集群“結實”嗎&#xff1f;聊聊它的高可用它沒有“大腦”&#xff0c;但活得很好極限測試&#xff1a;干掉兩個節點會怎樣&#xff1f;寫在最后最近在跟 Ka…

借助AI學習開源代碼git0.7之四update-cache

借助AI學習開源代碼git0.7之四update-cache update-cache.c 主要負責對索引&#xff08;index&#xff09;&#xff0c;也即緩存&#xff08;cache&#xff09;&#xff0c;進行增、刪、改操作。現在的高層命令 git add 的部分核心功能就是由這個代碼實現的。 核心功能 該程序的…

【48】MFC入門到精通——MFC 文件讀寫總結 CFile、CStdioFile、CFileDialog

文章目錄1 打開文件1.2 打開文件模式總結2 常用函數2.1 寫文件2.2 讀文件2.3 獲取文件長度3. 文件打開讀寫實力3.1 寫文件 覆蓋寫3.2 文尾追加寫3.3 換行寫4 文件對話框 CFileDialog4.2 文件對話框實例5 CStdioFile 類 讀寫CStingMFC提供了一個文件操作的基類CFile&#xff0c;…

Leetcode 124. 二叉樹中的最大路徑和

遞歸/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode…

MTSC2025參會感悟:手工測試用例的智能化生成

目錄 一、測試用例生成的時代困境與 AI 機遇 1.1 傳統手工測試用例的固有痛點 1.2 AI 時代的測試新挑戰 1.3 智能化轉型的機遇窗口 二、智能用例生成的核心特性與產品功能 2.1 核心特性解析 2.2 四大核心產品功能 功能一&#xff1a;基于 PRD 理解的一鍵生成用例 功能二…

后臺管理系統登錄模塊(雙token的實現思路)

最近在寫后臺管理&#xff0c;這里分享一下我的登錄模塊的實現&#xff0c;我是使用reacttypescript實現的&#xff0c;主要是登錄的邏輯和雙token的處理方式&#xff0c;請求接口的二次封裝aixos1.首先我們需要渲染登錄界面的窗口&#xff0c;這個很簡單就不詳細講解了&#x…

第十四講 | AVL樹實現

AVL樹實現一、AVL的概念二、AVL樹的實現1、AVL樹的結構2、AVL樹的插入&#xff08;1&#xff09;、AVL樹插入一個值的大概過程&#xff08;2&#xff09;、平衡因子更新更新原則更新停止條件插入結點及更新平衡因子的代碼實現3、旋轉&#xff08;1&#xff09;、旋轉的原則&…

《P3398 倉鼠找 sugar》

題目描述小倉鼠的和他的基&#xff08;mei&#xff09;友&#xff08;zi&#xff09;sugar 住在地下洞穴中&#xff0c;每個節點的編號為 1~n。地下洞穴是一個樹形結構。這一天小倉鼠打算從從他的臥室&#xff08;a&#xff09;到餐廳&#xff08;b&#xff09;&#xff0c;而…

錘子助手插件功能六:啟用攔截消息撤回

錘子助手插件功能六&#xff1a;啟用攔截消息撤回錘子助手插件功能六&#xff1a;啟用攔截消息撤回&#x1f6e1;? 插件簡介 攔截撤回消息&#xff0c;信息不再消失&#x1f527; 功能說明?? 使用風險與注意事項&#x1f3af; 適合人群?? 結語錘子助手插件功能六&#xf…

深度解析:基于EasyX的C++黑白棋AI實現 | 算法核心+圖形化實戰

摘要 本文詳解C黑白棋AI實現&#xff0c;使用EasyX圖形庫打造完整人機對戰系統。涵蓋&#xff1a; 遞歸搜索算法&#xff08;動態規劃優化&#xff09; 棋盤狀態評估函數設計 圖形界面與音效集成 勝負判定與用戶交互 附完整可運行代碼資源文件&#xff0c;提供AI難度調節方案…