Unity2D - 基本戰斗系統(Battle System Design)

1. 攻擊邏輯

在Entity中初始化兩個變量,因為在每個角色幾乎都擁有攻擊狀態。這兩個變量分別是transform類,接收一個坐標和一個半徑畫一個圓作為攻擊的判定范圍

public Transform attackCheck;
public float attackCheckRadius;

為了可視化攻擊范圍,我們使用輔助畫圖幫助我們對范圍進行設定

protected virtual void OnDrawGizmos()
{Gizmos.DrawWireSphere(attackCheck.position,attackCheckRadius);
}

對于敵人的處理也是如此,不要忘記將我們實體Transform傳入我們的變量。

之后將創建attack方法,作用于動畫中的某一幀,在這一幀中才是真正造成了攻擊,也就是應用到了某一函數方法。有經驗的讀者想必已經想到了事件功能。

創建一個新的腳本命名為PlayerAnimationTrigger,將動畫中某一幀與這個腳本中的某一個方法相結合就可以產生當動畫執行至某一幀后執行當前腳本事件的效果。

我們編寫腳本在動畫這一幀中檢查二維空間中所有與這個圓重疊的Collider2D的組件,并將這些組件存儲在colliders數組中。

private void AttackTrigger()
{Collider2D[] colliders = Physics2D.OverlapCircleAll(player.attackCheck.position,player.attackCheckRadius);foreach (var hit in colliders){if (hit.GetComponent<Enemy>() != null){hit.GetComponent<Enemy>().Damage();}}
}
  • Physics2D.OverlapCircleAll:這是Unity Physics2D模塊中的一個靜態方法,用于檢測并返回與指定圓形區域相交的所有Collider2D組件。這個方法不依賴于物理引擎的碰撞檢測(即不依賴于速度或力的計算),而是直接基于碰撞體的幾何形狀和位置進行判斷。

  • 注意:默認情況下,Physics2D.OverlapCircleAll會檢測所有層的碰撞體。如果你只想檢測特定層的碰撞體,可以使用Physics2D.OverlapCircleAll(Vector2 position, float radius, int layerMask)的重載版本,其中layerMask參數允許你指定要檢測的層

然后獲取敵人組件中Enemy腳本,若不為空,則執行其中的Damage方法。

2. 碰撞器檢測

在默認情況下,兩個碰撞體相互碰撞會造成位移,為了防止敵人與玩家之間造成位移,我們需要修改如下設定:點擊左上角Edit,選中Project Settings,找到Physics2D中的layer Collision Matrix,將對應兩個圖層勾選取消即可。

3. 被擊打效果

3.1 被擊打變色

我們需要創建一個新的材料作為被擊打時變換的樣子,將shader(著色器)搜索設定為GUI

被擊打變色的底層邏輯就是在某一事件發生后,將物體的材料改變,持續多久之后恢復原有狀態。

新建一個協程EntityFX

public class EntityFX
{private SpriteRenderer sr;[SerializeField] private Material hitMat;private Material originalMat;private void Start(){sr = GetComponentInChildren<SpriteRenderer>();originalMat = sr.material;}private IEumerator FlashFX(){sr.material = hitMat; //更改材料yield return new WaitForSeconds(.2f); //暫停協程,等待0.2ssr.material = originalMat; }
}

  • sr.material = hitMat;:這行代碼將某個渲染器(假設為?sr)的材質更改為?hitMat。這通常用于顯示一個“被擊中”或“激活”的視覺效果。
  • yield return new WaitForSeconds(.2f);:這行代碼暫停協程的執行,等待 0.2 秒。WaitForSeconds?是一個特殊的 yield 指令,用于在協程中創建等待時間。
  • sr.material = originalMat;:等待時間過后,將渲染器的材質改回原始材質?originalMat,從而完成閃爍效果

將上述類定義好之后,我們還需要在角色父類中實例化此類才可進行調用。

對于我們的damage方法,我們添加:

Public virtual void Damage()
{fx.StartCoroutine("FlashFX");
}

其中StartCoroutine是一個協程函數,允許你在游戲運行時異步執行代碼,而不需要使用多線程的復雜性。協程(Coroutine)可以視為一個可以暫停和恢復的函數。

協程函數通常返回一個IEnumerator類型,這是通過System.Collections命名空間提供的。在協程函數內部,你可以使用yield return語句來暫停協程的執行,并在未來的某個時間點恢復執行。

3.2 擊退狀態

在角色父類中定義擊退相關信息

[SerializeField] protected Vector2 knockbackDirection;
protected bool isKnocked;
[SerializeField] protected float knockbackDuration;

聲明擊退函數,被擊打了向后退一定距離。

protected virtual IEnumerator Hitknockback()
{isKnocked = true;rb.velocity = new Vector2(knockbackDirection.x * -facingDir,knockbackDirection.y);yield return new WaitForSeconds(knockbackDuration);isKnocked = false;
}//在前進函數中我們需要設定,如果被擊退則無法繼續前進
public void SetVelocity(float _xvelocity,float _yvelocity)
{if (isKnocked){return;}
}

在damage方法中加入這一事件:

public virtual void Damage()
{StartCoroutine("HitKnockback");
}

4. 防守與反擊效果

4.1 敵人被反擊效果

將相關動畫以及動畫參數,邏輯設定好之后,根據狀態機創建一個新的狀態,不要忘記在角色中聲明該狀態SkeltonStunnedState,然后聲明相應的構造函數以及重構。

與之前一樣,在主函數中聲明相應信息。stunDuration,stunDirection。

public class SkeltonStunnedState
{public override void Enter(){base.Enter();stateTimer = enemy.StunDuration;rb.velocity = new Vector2(-enemy.facingDir * enemy.stunDirection.x,enemy.stunDirection.y);}public override void Update(){base.Update();if (stateTimer < 0){statemachine.changeState(enemy.idleState);}}
}

讓我們會到EntityFX渲染類中,對攻擊效果進行進一步設定,有著閃爍的效果,相應的也要設定取消這個效果的方法。

private void RedcolorBlink()
{if (sr.color != Color.white){sr.color = Color.white;}else{sr.color = Color.red;}
}private void CancelRedBlink()
{CancelInvoke();sr.color = Color.white;
}

在進入狀態時聲明閃爍相應秒數:

public override void Enter()
{enemy.fx.InvokeRepeating("RedColorBlink",0,.1f); //分別是調用方法,延遲時間,持續時間
}public override void Exit()
{base.Exit();enemy.fx.Invoke("CancelRedBlink",0);
}

Invoke函數是MonoBehaviour類中的一個非常有用的方法,它允許你在指定的延遲時間后自動調用另一個MonoBehaviour中的方法,而無需使用額外的線程或定時器。

4.2 防守反擊

將動畫的邏輯與相關參數設定好之后進行腳本的編輯

public class PlayerCounterAttackState:PlayerState
{//構造函數public override void Enter(){base.Enter();stateTimer = player.counterAttackDuration;player.anim.SetBool("SuccessfulCounterAttack",false); //反擊成功參數先設置為0}public override void Exit(){}public override void Update(){base.Update();player.ZeroVelocity(); //防守期間不能移動Collider2D[] colliders = Physics2D.OverlapCircleAll(player.attackCheck.position,player.attackCheckRadius);foreach (var hit in colliders) //如果防守期間檢測到攻擊{if (hit.GetComponent<Enemy>() != null){stateTimer = 10;player.anim.SetBool("SuccessfulCounterAttack",true);}}if (stateTimer < 0 || triggerCalled){stateMachine.ChangeState(player.idleState); //時間到了或者動畫結束,自動結束該狀態}}
}

后續對于玩家進行指定的事件操作即可。

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

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

相關文章

Python的多態

在 Python 中&#xff0c;多態&#xff08;Polymorphism&#xff09;是指不同的對象可以對相同的消息&#xff08;方法調用&#xff09;做出不同的響應。 簡單來說&#xff0c;多態允許使用一個統一的接口來操作不同類型的對象&#xff0c;而這些對象會根據自身的類型來執行相應…

某水利集團晉升體系優化項目成功案例紀實

——通過多元化職業晉升通道&#xff0c;激發員工潛力 【客戶行業】水務行業&#xff1b;水利處理 【問題類型】晉升體系優化&#xff1b;人才管理系統 【客戶背景】 某水利處理集團是國內領先的綜合性水資源管理與水務服務供應商。該集團專注于提供包括原水供應、自來水生…

基于ROS的智能網聯車遠程交互軟件,全UI無需記憶指令,劍指核心原理。

基于ROS的智能網聯車遠程交互軟件&#xff0c;全UI無需記憶指令&#xff0c;劍指核心原理。 服務于中汽恒泰&#xff0c;偉大的項目&#xff0c;希望看官點贊&#xff0c;謝謝~~ 進程&#xff08;節點&#xff09;列表化&#xff0c;參數面板化&#xff0c;實現快速機器人配置…

Linux--V4L2攝像頭驅動框架及UVC淺析

一、前言 對于一個usb攝像頭&#xff0c;它的內核驅動源碼位于/drivers/media/usb/uvc/ 核心層&#xff1a;V4L2_dev.c文件 硬件相關層&#xff1a; uvc_driver.c文件 本篇記錄基于對6.8.8.8內核下vivid-core.c文件&#xff08;虛擬視頻驅動程序&#xff09;的分析&#xff…

推薦系統中Prior Belief的概念(附代碼)

在推薦系統中&#xff0c;先驗信念&#xff08;prior belief&#xff09;是指在沒有觀察到實際數據之前&#xff0c;我們對某些參數或變量的初始假設或預期。這種先驗信念可以幫助模型在數據稀疏或噪聲較多的情況下做出更好的預測。 先驗信念&#xff08;Prior Belief&#xf…

獨立站運營招聘:尋找璀璨之星,開啟運營之旅

尊敬的各位同仁&#xff0c;我乃大家熟知的獨立站長&#xff0c;對于運營獨立站點始終保持著滿腔熱情。今日&#xff0c;我欲與諸位共同探討一熱門議題—獨立站運營招聘。此次招聘不再僅為職位爭奪&#xff0c;更為尋找璀璨之星的探險之旅。 獨立站的靈魂&#xff1a;什么是獨…

Mysql中視圖的使用以及常見運算符的使用示例和優先級

場景 基礎知識回顧&#xff1a;mysql中視圖的基礎使用以及常見運算符的使用示例。 注&#xff1a; 博客&#xff1a;霸道流氓氣質-CSDN博客 實現 Mysql中視圖的使用 視圖的創建 CREATE VIEW stu_view AS SELECT * FROM bus_student; 視圖查詢 SELECT * FROM stu_view;…

澳大利亞媒體發稿:怎樣用圖表提高易讀性?-華媒舍

媒體發稿的可讀性變得尤為重要。讀者們不會再有時間與耐心去閱讀文章繁瑣的文本&#xff0c;他們更喜歡簡潔明了的信息展現形式&#xff0c;在其中圖表是一種極為高效的專用工具。下面我們就詳細介紹怎么使用圖表提高澳大利亞新聞媒體發稿的可讀性&#xff0c;以適應讀者的需要…

java 柵欄(CyclicBarrier)

Java中的柵欄&#xff08;CyclicBarrier&#xff09;是一種用于協調多個線程并發工作的同步輔助類。與CountDownLatch不同&#xff0c;CyclicBarrier允許一組線程相互等待&#xff0c;直到所有線程都到達一個共同的屏障點&#xff08;barrier&#xff09;后&#xff0c;才繼續執…

CSS 【詳解】樣式選擇器(含ID、類、標簽、通配、屬性、偽類、偽元素、Content屬性、子代、后代、兄弟、相鄰兄弟、交集、并集等選擇器)

CSS 樣式選擇器&#xff0c;用于選中頁面中的 html 元素&#xff0c;以便添加 CSS 樣式。 按渲染性能由高到低 依次是&#xff1a; ID 選擇器 #id 通過元素的 id 屬性選中元素&#xff0c;區分大小寫 <p id"p1" >第一段</p>#p1{color: red; }但不推薦使…

【LinuxC語言】手撕Http之處理POST請求

文章目錄 前言聲明POST的組成讀取POST信息讀取消息體長度讀取消息體解析消息體How to use?總結前言 在互聯網的世界中,HTTP協議無疑是最重要的協議之一。它是Web的基礎,支持著我們日常生活中的大部分在線活動。盡管有許多現成的庫可以處理HTTP請求,但了解其底層工作原理是…

全面解析:兒童編程等級考試及其區別

目錄 1. 前言2. 兒童編程等級考試的重要性3. 兒童編程等級考試的特點4. 兒童編程等級考試4.1 非專業級軟件能力認證(CSP-J/S)4.2 GESP編程能力等級認證4.3 青少年編程能力等級測試(CPA)4.4 全國青少年軟件編程等級考試4.5 全國青少年編程能力等級考試(PAAT)1. 前言 近年來…

【學習筆記】Mybatis-Plus(四):MP中內置的插件

內置插件 目前MP已經存在的內部插件包括如下&#xff1a; 插件類名作用PaginationInnerInterceptor分頁插件。可以代替以前的PageHelperOptimisticLockerInnerInterceptor樂觀鎖插件。用于冪等性操作&#xff0c;采用版本更新記錄DynamicTableNameInnerInterceptor動態表名Te…

【Rust】Cargo介紹

一、Cargo簡介 Cargo 是Rust語言的包管理工具&#xff0c;它幫助我們管理我們項目的依賴。做js開發的同學應該了解nodejs的包管理工具npm&#xff0c;Cargo和npm做的事情是一樣的。C和C的同學可能對這個就比較陌生了&#xff0c;C/C語言沒有統一的依賴管理工具&#xff0c;各個…

Spring中常見知識點及使用

Spring Framework 是 Java 生態系統中最流行的開源框架之一&#xff0c;它提供了一系列強大的功能&#xff0c;用于構建企業級應用。以下是一些常見的 Spring 知識點及其使用方法&#xff1a; 1. 依賴注入&#xff08;Dependency Injection&#xff09; 依賴注入是 Spring 的…

【SpringCloud應用框架】Nacos集群架構說明

第六章 Spring Cloud Alibaba Nacos之集群架構說明 文章目錄 前言一、Nacos支持三種部署模式二、集群部署說明三、預備環境 前言 到目前為止&#xff0c;已經完成了對Nacos的一些基本使用和配置&#xff0c;接下來還需要了解一個非常重要的點&#xff0c;就是Nacos的集群相關的…

【芯片制造】【問題整理】明場檢測和暗場檢測

背景&#xff1a; 什么是明場檢測和暗場檢測 主要功能&#xff1a; 1、在明場檢測中&#xff0c;光源直接照射到樣品表面&#xff0c;透射光或反射光被收集并成像。樣品上的顆粒、劃痕、凹坑會改變光的反射和透射&#xff0c;形成對比&#xff0c;能夠快速掃描大面積樣品。 2、…

SAP - 初識

人過三十不學藝&#xff1b;活到老學到老。。。。。。 怎么說都有理&#xff0c;說不如做 低頭做事&#xff0c;抬頭看天 先做&#xff0c;至少了解下是個什么&#xff1f; 1. SAP是什么 https://www.sap.cn/ -- 思愛普中國 https://www.sap.cn/about/wha…

金斗云 HKMP智慧商業軟件 任意用戶創建漏洞復現

0x01 產品簡介 金斗云智慧商業軟件是一款功能強大、易于使用的智慧管理系統,通過智能化的管理工具,幫助企業實現高效經營、優化流程、降低成本,并提升客戶體驗。無論是珠寶門店、4S店還是其他零售、服務行業,金斗云都能提供量身定制的解決方案,助力企業實現數字化轉型和智…

無人機遙控器指令加密方法

遙控信息的安全問題是無人機遙控系統設計和任務實施過程中最重要的問題之一。然而日益發展的電子偵察和電子對抗技術&#xff0c;使第三方可以截獲已方所發送的遙控指令&#xff0c;分析和竊取遙控信息的內容&#xff0c;從而偽造遙控信息&#xff0c;對己方無人機構成嚴重威脅…