學習游戲制作記錄(將各種屬性應用于戰斗以及實體的死亡)8.5

1.將各種屬性應用于戰斗

我們希望將上節課的CharactorState腳本作為一個父類,而玩家和敵人的屬性狀態都是繼承自它的

創建PlayerStats腳本:

public class PlayerStats : CharactorState
{
private Player player;//獲取玩家腳本

? ? protected override void Start()
{
base.Start();//初始化血量

? ? ? ? player = GetComponent<Player>();
}

? ? public override void TakeDamage(int _damage)//直接在傷害函數實現生命的減少以及敵人和玩家被擊中的效果
{
base.TakeDamage(_damage);

? ? ? ? player.DamageEffect();
}
}

創建EnemyStats腳本:

public class EnemyStats : CharactorState//同樣的操作
{
private Enemy enemy;

? ? protected override void Start()
{
base.Start();

? ? ? ? enemy = GetComponent<Enemy>();
}

? ? public override void TakeDamage(int _damage)
{
base.TakeDamage(_damage);

? ? ? ? enemy.DamageEffect();
}
}

CharactorState腳本:

?public State strength;//力量狀態,會改變傷害狀態

? ? public virtual void DoDamage(CharactorState _target)//最終實現傷害的函數,需要接受目標的屬性狀態
{
int totalDamage =damage.GetValue()+strength.GetValue();//傳遞最終的傷害

? ? ? ? _target.TakeDamage(totalDamage);

? ? }

PlayerAnimationTriggers腳本:

? ? private void AttackTrigger()
{
Collider2D[] collider2Ds = Physics2D.OverlapCircleAll(player.attackCheck.position, player.attackCheckRadius);

? ? ? ? foreach(var hit in collider2Ds)
{
if(hit.GetComponent<Enemy>()!=null)
{
EnemyStats EnemyTarget = hit.GetComponent<EnemyStats>();//獲取敵人狀態屬性

? ? ? ? ? ? ? ? player.state.DoDamage(EnemyTarget);

? ? ? ? ? ? ? ??
}
}
}

Enemy_SkeletonAnimationTrigger腳本:

? ? private void AttackTrigger()
{
Collider2D[] collider2Ds = Physics2D.OverlapCircleAll(enemy.attackCheck.position, enemy.attackCheckRadius);

? ? ? ? foreach (var hit in collider2Ds)
{
if (hit.GetComponent<Player>() != null)
{
PlayerStats playerEnemy=hit.GetComponent<PlayerStats>();//同理

? ? ? ? ? ? ? ? enemy.state.DoDamage(playerEnemy);
}
}
}

演示:

2.實現玩家的死亡

準備好玩家的死亡以及參數Die

創建PlayerDeadState腳本并在Player中初始化:

? ? public override void Update()//死亡則設置速度為0
{
base.Update();

? ? ? ? _Player.SetZeroVelocity();
}

Entity腳本:

? ? public virtual void Die()//只是為了便于重寫
{

? ? }

Player腳本:

? ? public override void Die()
{
base.Die();

? ? ? ? stateMachine.ChangeState(deadState);//進入死亡狀態
}

PlayerStats腳本:

? protected override void Die()//調用player的死亡函數
{
base.Die();

? ? ? ? player.Die();
}

3.實現敵人死亡

敵人的死亡與玩家不同,我們希望敵人死亡時會暫停動畫并向上偏移一段距離后落下

因此我們需要獲得敵人死亡前對應的動畫參數名稱

Enemy腳本:

? public string lastAnimBoolName;//記錄當前動畫參數

? ? public void AssignAnimName(string _animBoolName)//分配參數的函數
{
lastAnimBoolName = _animBoolName;
}

創建SkeletonDeadState腳本:

自行在EnemySkeleton中初始化該狀態

public class SkeletonDeadState : EnemyState
{
private EnemySkeleton enemy;
public SkeletonDeadState(EnemyStateMachine _enemyStateMachine, Enemy _enemybase, string _animBoolName, EnemySkeleton enemy) : base(_enemyStateMachine, _enemybase, _animBoolName)
{
this.enemy = enemy;
}

? ? public override void Enter()
{
base.Enter();

? ? ? ? enemy.anim.SetBool(enemy.lastAnimBoolName, true);//進入后接著播放死亡前的動畫
enemy.anim.speed = 0;//暫停動畫
enemy.cd.enabled = false;//設置無碰撞器,這樣敵人會掉落下去
stateTimer = .2f;//上升時間
}

? ? public override void Update()
{
base.Update();

? ? ? ? if (stateTimer > 0)
{
rb.velocity = new Vector2(0, 10);//給予上升速度
}
}
}

EnemySkeleton腳本:

? ? public override void Die()//重寫die函數
{
base.Die();

? ? ? ? enemyStateMachine.ChangeState(deadState);//切換到死亡狀態
}

EnemyState腳本:

? ? public virtual void Exit()
{
enemyBase.anim.SetBool(animBoolName, false);
enemyBase.AssignAnimName(animBoolName);//退出狀態時記錄當前狀態
}

EnemyStats腳本:

? ? protected override void Die()//死亡調用函數
{
base.Die();

? ? ? ? enemy.Die();
}

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

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

相關文章

Higgsfield平替,地球轉場+動物豎中指AI視頻教程

大家好&#xff0c;這里是K姐。 一個幫助你把AI真正用起來的女子。 最近TikTok上的網友已經集體瘋魔了——刷到的視頻總以高空航拍開場&#xff0c;鏡頭從地球拉近后&#xff0c;要么是橘貓蹲在白宮草坪比中指&#xff0c;要么是柴犬在富士山頂比中指…… 這種堪比好萊塢運鏡…

界面規范的其他框架實現-列表-layui實現

另一個要改造的系統使用了layui&#xff0c;改造方式如下&#xff1a;斑馬線&#xff1a;.layui-table[lay-even] tr:nth-child(even) {background-color: #f2f2f2 }鼠標滑過&#xff1a;.layui-table tbody tr:hover{background-color: #8dccff }標題行&#xff1a;.layui-tab…

STM32學習筆記2-GPIO的輸出模式

GPIOGPIO&#xff1a;通用輸入輸出口&#xff1b;可配置8種輸入輸出模式引腳電平&#xff1a;0V-3.3V&#xff0c;部分引腳可容忍5V也可認為高電平&#xff0c;但是對于輸出而言&#xff0c;最大就只能輸出3.3V&#xff0c;因為供電就只有3.3V&#xff0c;能容忍5v的在以下的引…

Linux系統學習2之磁盤管理

了解磁盤內容&#xff1a;df&#xff1a;df -a &#xff08;-a是列出所有&#xff0c;-k以kb顯示&#xff0c;-h以Gb顯示&#xff0c;-m以Mbyte顯示&#xff0c;-H為用1000b代替1024b&#xff0c;-t為顯示文件類型&#xff0c;-i為用inode顯示容量&#xff09;&#xff1a;&a…

北大、螞蟻三個維度解構高效隱私保護機器學習:前沿進展+發展方向

在數據隱私日益重要的 AI 時代&#xff0c;如何在保護用戶數據的同時高效運行機器學習模型&#xff0c;成為了學術界和工業界共同關注的難題。北大團隊最新完成的綜述《Towards Efficient Privacy-Preserving Machine Learning: A Systematic Review from Protocol, Model, and…

計算機網絡:如何在實際網絡中進行子網劃分

在實際網絡中,子網劃分是通過“借位”將一個大的IP網絡分割為多個小的子網,以提高IP地址利用率、增強網絡安全性和簡化管理。以下是具體的實施步驟、原理和注意事項: 一、子網劃分的核心目的 提高IP利用率:避免大網絡中IP地址的浪費(例如一個C類地址默認支持254臺主機,若…

《第五篇》基于RapidOCR的圖片和PDF文檔加載器實現詳解

基于RapidOCR的圖片和PDF文檔加載器實現詳解 引言 在構建知識庫時,我們經常需要處理包含圖片和PDF文檔的數據。這些文檔中的文本信息通常以圖像形式存在,需要通過OCR技術來提取。本文將詳細介紹如何使用RapidOCR技術實現圖片和PDF文檔的文本提取加載器。 核心概念 RapidO…

[硬件電路-122]:模擬電路 - 信號處理電路 - 模擬電路與數字電路、各自的面臨的難題對比?

數字電路和模擬電路是電子技術的兩大基礎分支&#xff0c;它們分別處理不同類型的信號&#xff0c;并在設計方法、元件特性、應用場景等方面存在顯著差異。以下是兩者的詳細定義及異同對比&#xff1a;一、定義與核心概念1. 模擬電路&#xff08;Analog Circuit&#xff09;定義…

Linux多線程——線程控制

目錄 1.線程知識補充 1.1 線程私有資源 1.2 線程共享資源 1.3 原生線程庫 2、線程控制接口 2.1 線程創建 2.1.1 一批線程 2.2 線程等待 2.3 線程終止 2.4 線程實戰 2.5 其他接口 2.5.1 關閉線程pthread_cancel 2.5.2 獲取線程 ID pthread_self 2.5.3 線pthread_de…

Python爬蟲實戰:研究spiderfoot工具,構建網絡情報收集系統

1. 引言 1.1 研究背景 在數字化時代,互聯網公開信息已成為國家治理、企業決策與學術研究的戰略資源。據 Statista 統計,2023 年全球互聯網數據總量突破 120ZB,其中可通過公開渠道獲取的情報信息占比超 30%。傳統人工信息收集方式受限于效率與廣度,難以應對海量數據處理需…

在路由器openwrt上安裝openclas

在路由器openwrt上安裝openclas 名詞解釋 las: lash 運行效果圖 安裝 安裝教程參考&#xff1a; 官方&#xff1a;github.com 官方2&#xff1a;openclas.net 如果安裝完成后菜單上沒有&#xff0c;重啟路由后在“服務”菜單下 點擊運行會提示下載內核&#xff0c;按提示…

HIVE 窗口函數處理重復數據

窗口函數row_number()&#xff0c;結合OVER子句中的PARTITION BY和ORDER BY&#xff0c;為數據分組內的每一行生成一個唯一的序號。具體分析如下&#xff1a;函數作用&#xff1a;row_number()&#xff1a;為每個分組內的行分配一個唯一的連續序號&#xff08;從1開始&#xff…

自動駕駛控制算法——MPC控制算法

自動駕駛控制算法——MPC控制算法 文章目錄自動駕駛控制算法——MPC控制算法一、MPC 是什么&#xff1f;1.1 定義與核心思想1.2 MPC 與傳統控制器&#xff08;如 PID&#xff09;的區別1.3 自動駕駛中 MPC 的典型應用場景&#x1f697; 軌跡跟蹤控制&#xff08;Trajectory Tra…

【DL學習筆記】各種卷積操作總結(深度可分離、空洞、轉置、可變形)

Vanilla Convolution 普通卷積 卷積通道數&#xff1a; 卷積核的數量決定輸出的張量的通道數nnn&#xff0c;輸入的張量和每一個核Kernel做卷積運算得到一個channel的輸出。輸入通道數CinC_{in}Cin?決定每一個卷積核的通道數 卷積輸出feature map的尺寸的計算公式&#xff1…

【Ubuntu】請問,`ip -a`顯示的“wlo1”是什么呀?

商量AI wlo1 是 Linux 系統中 無線網絡接口&#xff08;Wi-Fi 網卡&#xff09;的名稱&#xff0c;其命名遵循現代 Linux 的 可預測網絡接口命名規則&#xff08;Predictable Network Interface Names&#xff09;。以下是詳細解析&#xff1a;命名規則拆解 wlo1 的結構由三部分…

Excel商業智能分析報表 【銷售管理分析儀】

1.銷售漏斗&#xff08;Sales Funnel&#xff09;分析&#x1f31f;&#x1f31f; 銷售漏斗定義&#xff1a;科學反映商機狀態及銷售效率的銷售管理模型。適用場景&#xff1a;關系型銷售運營&#xff08;需長期維護客戶關系的銷售模式&#xff09;。核心功能&#xff1a;按銷售…

【論文閱讀|V2M: VISUAL 2-DIMENSIONAL MAMBA FOR IMAGE REPRESENTATION LEARNING】

論文題目:V2M: VISUAL 2-DIMENSIONAL MAMBA FOR IMAGE REPRESENTATION LEARNING 年份:2024 期刊會議: arXiv 代碼鏈接:https://github.com/wangck20/V2M 目錄 現階段存在的問題 1. 二維結構信息丟失 2. 一維 Mamba 架構的局限性 3. 提升視覺任務表現 相關研究 方法 二維…

服務器數據安全:利用阿里云OSS/騰訊云COS實現網站數據自動備份

更多云服務器知識&#xff0c;盡在hostol.com你的網站&#xff0c;就像一座你親手在數字海灘上堆砌起來的、精美絕倫的“沙堡”。你為它設計了獨特的風格&#xff0c;添置了豐富的內容&#xff0c;吸引了越來越多的游客前來參觀。每一篇文章&#xff0c;每一條評論&#xff0c;…

AdGuard 安卓修改版:全方位廣告攔截與隱私保護專家

AdGuard 安卓版是一款功能強大的廣告攔截軟件&#xff0c;能夠有效阻止網頁和應用程序中的廣告和跟蹤器&#xff0c;提升用戶的瀏覽體驗。它不僅提供了廣泛的廣告攔截功能&#xff0c;還通過多種隱私保護功能&#xff0c;確保用戶的個人信息安全。以下是 AdGuard 安卓版的詳細介…

Mysql中的鎖到底是什么?鎖的是什么?

MySQL InnoDB 的鎖&#xff1a;一次從“守衛”到“交通指揮中心”的深度之旅 MySQL InnoDB 的鎖。這個概念常常讓人覺得復雜抽象&#xff0c;但我們需要抓住它的底層設計哲學 忘記那些代碼和術語定義&#xff0c;我們先從最底層的問題開始思考&#xff1a; 思考一&#xff1a;為…