技能系統詳解(2)——特效表現

特效會有個EffectManager用于統一管理所有特效,技能特效只是各類特效中的一種

EffectManager需要提供特效的創建,返回被封裝為EffectHandle

每類特效都有各種不同的配置參數,這些配置參數會傳遞給EffectManager用于生成EffectHandler

為支持實現更復雜的特效表現,EffectManager應當提供接口支持根據需要動態修改配置參數

技能的特效分為三類:隨身特效、表現特效、場景特效

隨身特效是指跟隨角色的特效,例如角色的拖尾、飄帶,這些特效通常位于角色身上的某個掛載點

表現特效,指為豐富畫面或技能表現而出現的特效,例如技能釋放瞬間的閃光特效

場景特效,指創建出來較大的特效,創建完成后會固定在場景內基本不動

注意,這里的特效不動只是相對于掛載目標而言的,其自身可以有不同的運動形式,當掛載點運動,其也會跟著運動

【特效參數】

基礎參數

  • 特效名字
  • 特效ID
  • 特效Prefab
  • 特效路徑
  • 特效類型

位置參數

  • 掛載目標
    • 隨身特效一般為角色自身,通常特效一直跟隨角色,會在角色身上的某個點做掛載
    • 表現特效一般為角色周圍的某個空間的位置
    • 場景特效一般為角色周圍的場景中的某個位置,需要通過技能指向動態計算得到
  • 掛載點
  • 初始位置、偏移位置、初始朝向、初始偏移(在工程實踐中,位置通常都不是單個的精確值,通常都是基礎+偏移)

存活參數

  • 存活方式
    • 隨身特效通常跟隨技能,尤其是狀態或者限時類技能,也即通常該類特效跟隨技能生命周期,即進入技能時,該特效就出現,退出技能時就消失,但不是完全絕對的,可能消失有個FadeOut
    • 表現特效通常是固定時間,時間通常不長
    • 場景特效可以是跟隨技能的、固定時間的,還有可能是固定范圍的,即距離角色一定范圍內有效,超出范圍即失效
  • 漸出時間
  • 有效距離

其他各類特效相關參數

【代碼實現】

    public class EffectConfigData : ScriptableObject, IData{[FoldoutGroup("基礎參數")][LabelText("特效名字")]public string effectName;[FoldoutGroup("基礎參數")][LabelText("特效Id"), ReadOnly]public int effectId;//todo:根據名字生成[FoldoutGroup("基礎參數")][LabelText("特效Prefab")]public GameObject effectGo;[FoldoutGroup("基礎參數")][LabelText("特效路徑"), ReadOnly]public string effectPath;[FoldoutGroup("基礎參數")][LabelText("特效類型")]public SkillEffectType type;[FoldoutGroup("初始位置參數")][LabelText("掛載目標")]public AttachTarget target;[FoldoutGroup("初始位置參數")][LabelText("掛載點")]public int slotId;[FoldoutGroup("初始位置參數")][LabelText("位置偏移")]public Vector3 offsetPos;[FoldoutGroup("初始位置參數")][LabelText("初始朝向")]public Vector3 foward;[FoldoutGroup("初始位置參數")][LabelText("朝向偏移")]public Vector3 offsetRot;[FoldoutGroup("存活參數")][LabelText("朝向偏移")]public LifeTimeType lifeTimeType;[FoldoutGroup("存活參數")][LabelText("存活時間")]public float liftTime;[FoldoutGroup("存活參數")][LabelText("漸出時間")]public float fadeOutTime;[FoldoutGroup("存活參數")][LabelText("存活距離")]public float liftDistance;public void Dispose(){}//其他特效相關參數}public enum AttachTarget{Self,Round,Scence,}public enum SkillEffectType{Role,Attack,Scene,}public enum LifeTimeType{FollowSkill = 1 << 0,FixedTime = 1 << 1,FixedDistance = 1 << 2,}public class EffectComponent:SkillLogicComponent{private GameObject prefab;private bool hasTick = false;private float curTime;protected override void OnInit(){base.OnInit();configData = EffectConfigDataSystem.Instance.GetOrCreateData(dataId);}protected override void OnStart(){base.OnStart();//根據路徑在這里加載Prefab,或者傳入路徑,交給特效系統做加載調用//(configData as EffectConfigData).effectPath;}protected override void OnExcute(){base.OnExcute();if (prefab != null){prefab.SetActive(true);//調用prefab上的其他腳本var data = configData as EffectConfigData;if ( (data.lifeTimeType & LifeTimeType.FixedTime) != 0){GetOrReleaseTick(true);curTime = 0;}else if((data.lifeTimeType & LifeTimeType.FixedDistance) != 0 ){GetOrReleaseTick(true);}}}protected override void OnEnd(){base.OnEnd();if( ((configData as EffectConfigData).lifeTimeType & LifeTimeType.FollowSkill) != 0){DeActiceEffect();}}public override void OnDestroy() { base.OnDestroy();}private void DeActiceEffect(){GetOrReleaseTick(false);if (prefab != null){prefab.SetActive(false);//調用prefab上的其他腳本//也可以銷毀}}private void GetOrReleaseTick(bool register){if(register){if(!hasTick){ComponentTick.RegisterComTick(instanceId, this, OnTick);hasTick = true;}}else{if(hasTick){ComponentTick.UnRegisterComTick(instanceId);}}}private void OnTick(float deltaTime){var data = configData as EffectConfigData;if ((data.lifeTimeType & LifeTimeType.FixedTime) != 0){curTime += deltaTime;if(curTime >= data.liftTime){DeActiceEffect();}}else if ((data.lifeTimeType & LifeTimeType.FixedDistance) != 0){//獲取特效和角色的距離//var dis = (prefab.transform.position - playerPos).magnitude;var dis = 10;if(dis > data.liftDistance){DeActiceEffect();}}}}public class EffectConfigDataSystem:DataSystem<EffectConfigDataSystem, EffectConfigData>{public override string dataPath => "Assets/ConfigData/SkillEffectConfigData.asset";}public class ComponentTick//不通過層層調用做Tick,將需要Tick的Component做統一管理,可以擴展為通過優先級做先后Tick的調度{public static Dictionary<long, TickInfo> Id2Com = new Dictionary<long, TickInfo>();public struct TickInfo{public long Id;public Component com;public Action<float> cb;}public static void Tick(float deltaTime){foreach (var item in Id2Com.Values){if(item.com.Enable){item.cb?.Invoke(deltaTime);}}}public static void RegisterComTick(long instanceId,Component com,Action<float> cb){if(!Id2Com.TryGetValue(instanceId, out var info)){info = new TickInfo(){Id = instanceId,com = com,cb = cb,};Id2Com.Add(instanceId, info);}else{Debug.Log($"重復注冊:{instanceId}");}}public static void UnRegisterComTick(long instanceId){if(Id2Com.TryGetValue(instanceId,out var info)){Id2Com.Remove(instanceId);}}}

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

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

相關文章

12.OpenCV—基礎入門

01讀取圖像 02創建空白圖像 03保存圖像 04更改圖像亮度 05更改圖像對比度 06灰度直方圖均衡 07彩色直方圖均衡 08五種濾波方式 09形態學操作 10仿射變換 11角度縮放仿射變換 12透視變換 13坐標映射 14模板匹配 15多模板匹配 16查找輪廓線 17輪廓線匹配 17繪制…

【Python】Python之什么是生成器?什么是迭代器?

目錄 專欄導讀前言什么是迭代器&#xff08;Iterator&#xff09;&#xff1f;迭代器的定義迭代器協議可迭代對象 vs 迭代器自定義迭代器迭代器的優勢 什么是生成器&#xff08;Generator&#xff09;&#xff1f;生成器的定義生成器函數生成器表達式復雜的生成器示例生成器的狀…

Python中實現簡單爬蟲并處理數據

在當今數據驅動的時代&#xff0c;能夠從互聯網上高效地抓取信息變得越來越重要。Python因其簡潔易學的特性&#xff0c;成為了編寫網絡爬蟲的首選語言之一。接下來&#xff0c;我將介紹如何使用Python來實現一個基礎的網絡爬蟲&#xff0c;并對收集到的數據進行初步處理。 首先…

免費wordpress主題網

免費WordPress主題網 WP模板牛 WP模板牛是一個提供免費WordPress主題的網站&#xff0c;用戶可以在這里找到大量高質量的模板&#xff0c;適用于各種網站類型。該網站致力于為用戶提供簡單、高效的建站體驗。 官網鏈接&#xff1a; https://wpniu.com 建站哥模板 建站哥模板…

為什么需要MyBatis-Plus條件構造器?

目錄 前言 一、傳統SQL編寫的痛點 二、條件構造器的核心優勢 1. 防SQL注入&#xff08;安全性&#xff09; 2. 面向對象編程&#xff08;可讀性&#xff09; 3. 動態條件構建&#xff08;靈活性&#xff09; 4. 數據庫無關性&#xff08;可移植性&#xff09; 三、典型應…

【從零學習JVM|第九篇】常見的垃圾回收算法和垃圾回收器

前言&#xff1a; 我們知道在堆內存中&#xff0c;會有自動的垃圾回收功能&#xff0c;那今天這篇文章將會向你介紹&#xff0c;這個功能實現的方式&#xff0c;還有實現的對象&#xff0c;接下來就由我來給你們詳細介紹垃圾回收的算法和實現算法的回收器。 目錄 前言&#…

品牌竄貨治理解決方案

在渠道網絡的暗潮中&#xff0c;竄貨猶如隱秘的漩渦&#xff0c;某知名白酒品牌曾因區域竄貨導致終端價格體系崩潰&#xff0c;半年內損失超3億元。竄貨行為不僅破壞市場秩序&#xff0c;更會引發信任危機。隨著電商平臺的多元化與分銷層級的復雜化&#xff0c;品牌方亟需構建一…

車載電子電器架構 --- 法律和標準對電子電氣架構的影響

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

一種通用跨平臺實現SEH的解決方案

一. 前言 眾所周知&#xff0c;在軟件的代碼中&#xff0c;處理軟件本身的邏輯只要大約1/3的代碼&#xff0c;另外2/3的代碼實際上是在處理各種各樣的異常情況。 這些異常情況一方面是因為不同用戶之間不同的硬件軟件環境要處理。另一方面是程序中可能出現的bug。比較典型的情…

25.6.19學習總結

什么是堆&#xff08;Heap&#xff09;&#xff1f; 堆是一種特殊的樹形數據結構&#xff0c;它滿足以下兩個主要屬性&#xff1a; 結構性&#xff08;完全二叉樹&#xff09;&#xff1a; 堆總是一個完全二叉樹 (Complete Binary Tree)。這意味著&#xff0c;除了最后一層&am…

【前后前】導入Excel文件閉環模型:Vue3前端上傳Excel文件,【Java后端接收、解析、返回數據】,Vue3前端接收展示數據

【前后前】導入Excel文件閉環模型&#xff1a;Vue3前端上傳Excel文件&#xff0c;【Java后端接收、解析、返回數據】&#xff0c;Vue3前端接收展示數據 一、Vue3前端上傳&#xff08;導入&#xff09;Excel文件 ReagentInDialog.vue <script setup lang"ts" na…

網絡基礎入門:從OSI模型到TCP/IP協議詳解

網絡基礎入門&#xff1a;從OSI模型到TCP/IP協議詳解 一、網絡基礎概念與OSI七層模型 1.1 網絡通信的本質 計算機網絡的核心是將抽象語言轉換為二進制數據進行傳輸與計算&#xff0c;這一過程涉及多層抽象與轉換&#xff1a; 應用層&#xff1a;人機交互—抽象語言------編…

Linux致命漏洞CVE-2025-6018和CVE-2025-6019

Qualys 最近披露了兩個影響主流 Linux 發行版的本地權限提升 (LPE) 漏洞&#xff0c;分別是 CVE-2025-6018 和 CVE-2025-6019。這兩個漏洞可以被串聯利用&#xff0c;使得非特權用戶在幾秒鐘內獲得系統的 root 權限&#xff0c;從而實現對系統的完全控制。 一、漏洞詳情 這兩…

【Docker基礎】Docker鏡像管理:docker push詳解

目錄 引言 1 Docker鏡像推送基礎概念 1.1 什么是Docker鏡像推送 1.2 鏡像倉庫概述 1.3 鏡像標簽與版本控制 2 docker push命令詳解 2.1 基本語法 2.2 常用參數選項 2.3 實際命令示例 2.4 推送流程 2.5 步驟描述 3 鏡像推送實踐示例 3.1 登錄管理 3.2 標簽管理 3…

FPGA基礎 -- Verilog行為建模之循環語句

行為級建模&#xff08;Behavioral Modeling&#xff09;是 Verilog HDL 中最接近軟件編程語言的一種描述方式&#xff0c;適用于功能建模和仿真建模的初期階段。在行為級中&#xff0c;循環語句&#xff08;loop statements&#xff09;是常見且重要的控制結構&#xff0c;用于…

從C學C++(7)——static成員

從C學C(7)——static成員 若無特殊說明&#xff0c;本博客所執行的C標準均為C11. static成員和成員函數 對于特定類型的全體對象而言&#xff0c;有時候可能需要訪問一個全局的變量。比如說統計某種類型對象已創建的數量。 通常在C中使用全局變量來實現&#xff0c;如果我們…

大模型和ollama一起打包到一個docker鏡像中

如何將大模型鏡像和 Ollama 鏡像打包在一個 Docker 鏡像中 最近工作中有個需求是將ollama和大模型一起打成一個鏡像部署&#xff0c;將自己的操作步驟分享給大家。將大模型與 Ollama 服務打包在同一個 Docker 鏡像中&#xff0c;可以簡化部署流程并確保環境一致性。下面詳細介…

2025年滲透測試面試題總結-攻防研究員(應用安全)(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 攻防研究員(應用安全) 一、基礎部分 1. HTTP狀態碼對比 2. HTTP請求方法核心作用 3. 網絡分層協議速查表…

SpringBoot新聞項目學習day3--后臺權限的增刪改查以及權限管理分配

新增管理員修改管理員刪除管理員登錄 新增管理員 1.點擊新增按鈕打開一個對話框 2.確定新增對話框要顯示哪些內容 3.提交 4.后端處理、保存 5.響應前端 vue代碼 <template><!-- 新增代碼內容是比較多的,建議抽取出來,定義到一個獨立的vue文件中在列表組件中導入…

算法導論第二十五章 深度學習的倫理與社會影響

第二十五章 深度學習的倫理與社會影響 技術的光芒不應掩蓋倫理的陰影 隨著深度學習技術在各領域的廣泛應用&#xff0c;其引發的倫理和社會問題日益凸顯。本章將深入探討這些挑戰&#xff0c;并提供技術解決方案和最佳實踐&#xff0c;引導讀者構建負責任的人工智能系統。 25.…