Unity任務系統筆記

數據結構設計

任務基類包括的字段:

string 任務內容;

Transform 任務目的地;

MyCharacter 任務開啟后要更新對話的NPC;

MyTalkData 任務開啟后相關NPC要說的對話數據;

共同方法:開啟任務、完成任務。

每類任務有一些特有的字段和方法。

任務的兩個關鍵行為是觸發和完成,這兩個行為的條件都很多樣:對話、戰斗、取得物品、到達地點、刺殺等。要觸發任務,需要那些可能觸發任務的行為能指向任務,這些行為都要加上可能觸發的任務字段。觸發任務可能是特定行為也可能是一個任務完成。也就是說任務系統不是只加一個系統,還需要對其他系統的行為加回調。

對話完成任務

任務開啟后相關NPC需要記錄所屬的任務,玩家找ta觸發對話時完成任務,且把這個任務變量置空,防止再次對話再次完成任務。為此NPC對話腳本要加一個任務變量。

對話觸發任務

則需要在對話結束后開啟任務,然后NPC不能再觸發這段對話,可能是觸發任務進行中的對話,或者沒有對話。

和上面觸發對話完成任務加起來,對話的開始和結束都要加一個UnityEvent。

戰斗完成任務

字段:要消滅的敵人列表;

敵人列表的每個敵人也記錄自己所屬的任務,每個敵人死時,把敵人移出敵人列表,然后判斷列表是否為空,若是,則任務完成。

由于任務是依次觸發的,一個關卡的任務的數據結構可以是1.鏈表,每個任務記錄自己完成后下一個任務。但是這樣一個關卡的任務先后順序不直觀;但是這樣支持多任務分支;2.列表,一個中心任務管理器有一個任務列表,這樣不支持多任務分支。然而我做了任務列表界面,也就是我一直想做多分支,這就和使用關卡流程任務列表沖突了。現在問題就是,沒有一個圖形化的表示多分支關卡的工具,用一連多的“鏈表”做多分支很混亂。所以在有合適工具前,只能先放棄做多分支。

有一個列表記錄此關依次要執行的任務對象,關卡流程會清楚很多:

但是多任務分支用列表就不行了。

兩種NPC

NPC分為兩類:永遠只能觸發相同對話,對關卡沒有推進的npc(簡稱氛圍NPC);對關卡有推進,不同階段觸發不同對話的npc(簡稱推進NPC)。

對于推進NPC,在關卡不同階段有不同對話,在一個任務進行中觸發同一個對話(如“拜托你了”),實際上出現了完成任務和進行中的多分支。這么多對話的存儲位置有幾種方案。

1.用List全部記錄在NPC對象上。由任務對象指定完成后NPC該說哪一段對話。這樣NPC對象腳本的檢查器上會存一大堆對話數據。也難以看出一段對話對應哪個任務,是觸發任務的對話還是任務進行中的對話。

2.NPC上只記錄一段對話數據,就是當前去找ta會觸發的對話。任務對象上記錄兩段對話,任務觸發、進行中要說的對話。當關卡進度管理器顯示該觸發一個任務時,任務對象把觸發任務對話寫入npc腳本的對話變量,任務觸發后把任務進行中對話寫入npc對話變量。

這樣氛圍npc因為沒有任務系統修改ta們的對話數據,自然就一直觸發同一段對話,不用修改。

3.對話數據記錄在任務對象上,npc只記錄關聯的任務對象。這樣不推進進度的npc沒有關聯的任務,ta們的對話就要另外處理了。

很明顯2是最優方案,既防止推進進度的npc的腳本里的對話數據過多,又兼容兩種npc,而且不推進進度的npc只有一段對話,給ta們聲明一個一段對話的List完全是浪費。總之對于氛圍NPC,只有一個一段對話變量,對于推進NPC,不同任務階段對話不同,對話應該記錄在任務對象。

問題:回復時開啟任務 ,直接把下一個任務NPC要說的話寫入了NPC的對話數據,導致當前對話變成下一個任務階段的。需要在回復時記下要觸發任務,這段對話結束后再開啟任務。所以在一段對話數據結構里放一個List<UnityEvent>,回復的結構體里有一個UnityEvent用于在檢查器配置回調函數,選擇該回復時把這個UnityEvent加入列表,對話結束后執行。

數據結構定義

一個任務對象應有的字段有:

1.任務內容文本(可能分成任務標題和任務描述);

2.任務目的地位置;

如果想直觀地標記任務目的地位置,應該用一個場景內游戲對象,那么任務類就不能繼承ScriptableObject做成Asset,而應該繼承Monobehavior做成Component。

一個任務對象應有的方法有:

1.開啟任務(可能包括NPC、敵人、物品的生成和擺放、設置NPC可觸發的對話,總之幾種腳本里不確定,需要在場景里確定的函數);

2.完成任務(也可能有上述函數);

協程沖突

在修改NPC位置等突變操作時我寫了一個畫面漸變為黑色,執行操作,再變透明的函數:

public UnityAction blackoutCallback;
[ContextMenu("畫面變黑")]public void Blackout(){StartCoroutine(BlackoutCoroutine(blackoutCallback));}float fadeSpeed=.04f;IEnumerator BlackoutCoroutine(UnityAction callback=null){while(blackBack.color.a<1){blackBack.color+=new Color(0,0,0,fadeSpeed);yield return 0;}if(callback!=null){callback.Invoke();}while(blackBack.color.a>0){blackBack.color-=new Color(0,0,0,fadeSpeed);yield return 0;}}

然后這個函數在ContextMenu調用時正常,但是完成任務調用時畫面就不變透明了。NPC被正確移動了。然后在第二個while循環里加了個Debug.Log(),發現第二個while循環一直在執行,但是alpha值沒有變。

?然后又在第一個while循環加了個打印,發現兩個while循環都在一直執行。

在協程開頭加打印,發現協程被執行了兩次。因為一個很笨的錯誤。

?這說明寫淡入淡出時如果以imag.color.a作為循環條件,如果在一個淡入淡出完成前開始另一個,兩個協程就會打架,淡入淡出永遠完不成。實際開發中如果無法避免一個淡入淡出進行中開始另一個,就根據計算好的循環次數,或者直接規定循環次數,并且循環結束后直接把alpha值寫成目標值,因為如果不這么做就算循環能結束,最終的alpha會是一個半透明值。

改進后的淡入淡出:

int fadeStep=10;IEnumerator BlackoutCoroutine(UnityAction callback=null){for(int i=0;i<fadeStep;i++){blackBack.color+=new Color(0,0,0,1/(float)fadeStep);yield return 0;}blackBack.color=Color.black;if(callback!=null){callback.Invoke();}for(int i=0;i<fadeStep;i++){blackBack.color-=new Color(0,0,0,1/(float)fadeStep);yield return 0;}blackBack.color=new Color(0,0,0,0);}

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

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

相關文章

STM32的開發環境介紹

目錄 STM32軟件環境 Keil軟件在線安裝 其他軟件環境安裝 STM32開發的幾種方式 STM32寄存器版本和庫函數版本 標準外設庫的作用&#xff1a; STM32軟件環境 STM32 的集成開發環境&#xff08;IDE&#xff09;&#xff1a;編輯編譯軟件 常見的環境&#xff1a; (1)KEIL&a…

【特殊場景應對9】視頻簡歷的適用場景與風險分析

寫在最前 作為一個中古程序猿,我有很多自己想做的事情,比如埋頭苦干手搓一個低代碼數據庫設計平臺(目前只針對寫java的朋友),比如很喜歡幫身邊的朋友看看簡歷,講講面試技巧,畢竟工作這么多年,也做到過高管,有很多面人經歷,意見還算有用,大家基本都能拿到想要的offe…

Linux系統性能調優技巧分享

在數字化時代,Linux 系統以其開源、穩定、高效的特性,成為服務器、云計算、物聯網等領域的核心支撐。然而,隨著業務規模的擴大和負載的增加,系統性能問題逐漸凸顯。掌握 Linux 系統性能調優技巧,不僅能提升系統運行效率,還能降低運維成本。下面從多個方面介紹實用的性能調…

關于Code_流蘇:商務合作、產品開發、計算機科普、自媒體運營,一起見證科技與藝術的交融!

Code_流蘇 &#x1f33f; 名人說&#xff1a;路漫漫其修遠兮&#xff0c;吾將上下而求索。—— 屈原《離騷》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; &#x1f31f; 歡迎來到Code_流蘇的CSDN主頁 —— 與我一起&…

系統架構設計(三):質量屬性

常見分類 一般來說&#xff0c;質量屬性可以分為以下幾類&#xff1a; 類別常見質量屬性性能相關響應時間、吞吐量、資源利用率、實時性、可擴展性可用性相關可用性、高可用性&#xff08;HA&#xff09;、可靠性、容錯性、恢復性可維護性相關可維護性、可測試性、可擴展性、…

【鋰電池剩余壽命預測】GRU門控循環單元鋰電池剩余壽命預測(Matlab完整源碼)

目錄 效果一覽程序獲取程序內容代碼分享研究內容GRU門控循環單元在鋰電池剩余壽命預測中的應用摘要關鍵詞1. 引言1.1 研究背景1.2 研究現狀與問題1.3 研究目的與意義2. 文獻綜述2.1 鋰電池剩余壽命預測傳統方法2.2 深度學習在鋰電池壽命預測中的應用2.3 研究空白與本文切入點3.…

SpringCloud原理和機制

Spring Cloud 是一套基于Spring Boot的微服務開發工具集&#xff0c;它提供了在分布式系統環境下構建應用程序所需的一系列工具和服務。Spring Cloud旨在幫助開發人員快速構建一些常見的微服務模式&#xff0c;如服務發現、配置管理、智能路由、熔斷器、微代理、控制總線等。 …

LeetCode -- Flora -- edit 2025-04-25

1.盛最多水的容器 11. 盛最多水的容器 已解答 中等 相關標簽 相關企業 提示 給定一個長度為 n 的整數數組 height 。有 n 條垂線&#xff0c;第 i 條線的兩個端點是 (i, 0) 和 (i, height[i]) 。 找出其中的兩條線&#xff0c;使得它們與 x 軸共同構成的容器可以容納最…

有關圖的類型的題目以及知識點(2)

1、具有5個頂點的有向完全圖有20條弧。 2、若一個有向圖用鄰接矩陣表示&#xff0c;則第個結點的入度就是&#xff1a;第i列的非零元素的個數。 3、有向圖的鄰接矩陣可以是對稱的&#xff0c;也可以是不對稱的。 4、設N個頂點E條邊的圖用鄰接表存儲&#xff0c;則求每個頂點…

正則表達式的捕獲組

是正則表達式中的一個重要概念&#xff0c;用于提取字符串中的特定部分 捕獲組是通過正則表達式中的圓括號 () 定義的&#xff0c;它的作用是&#xff1a; 劃分和標記&#xff1a;將正則表達式的一部分劃分為邏輯單元。 提取數據&#xff1a;從字符串中提取符合組內模式的內容…

deepseek-cli開源的強大命令行界面,用于與 DeepSeek 的 AI 模型進行交互

一、軟件介紹 文末提供程序和源碼下載 deepseek-cli一個強大的命令行界面&#xff0c;用于與 DeepSeek 的 AI 模型進行交互。 二、Features 特征 Multiple Model Support 多模型支持 DeepSeek-V3 (deepseek-chat) DeepSeek-R1 &#xff08;deepseek-reasoner&#xff09;Dee…

Java—— 五道算法水題

第一題 需求&#xff1a; 包裝類&#xff1a;鍵盤錄入一些1~100之間的整數&#xff0c;并添加到集合中。直到集合中所有數據和超過200為止 代碼實現&#xff1a; import java.util.ArrayList; import java.util.Scanner;public class Test1 {public static void main(String[]…

安全編排自動化與響應(SOAR):從事件響應到智能編排的技術實踐

安全編排自動化與響應&#xff08;SOAR&#xff09;&#xff1a;從事件響應到智能編排的技術實踐 在網絡安全威脅復雜度指數級增長的今天&#xff0c;人工處理安全事件的效率已難以應對高頻攻擊&#xff08;如日均萬級的惡意IP掃描&#xff09;。安全編排自動化與響應&#xf…

網絡原理 - 9

目錄 數據鏈路層 以太網 以太網幀格式 MAC 地址 DNS&#xff08;Domain Name System&#xff09; 完&#xff01; 數據鏈路層 這里的內容也是簡單了解&#xff0c;除非是做交換機開發&#xff0c;一般程序員不需要涉及~~ 以太網 ”以太網“不是一種具體的網絡&#xf…

unity bug

發現一個奇怪的bug&#xff0c;就是某些unity版本打包apk時候不允許StreamingAssets里面有中文文件或者中文路徑。比如下圖這面這倆都是不行的。 解決方案&#xff1a;中文改為英文即可。 一般報錯信息如下&#xff1a; > Configure project :launcher WARNING:The option s…

【Linux網絡】打造初級網絡計算器 - 從協議設計到服務實現

&#x1f4e2;博客主頁&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客倉庫&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01; &…

計算機視覺——對比YOLOv12、YOLOv11、和基于Darknet的YOLOv7的微調對比

概述 目標檢測領域取得了巨大進步&#xff0c;其中 YOLOv12、YOLOv11 和基于 Darknet 的 YOLOv7 在實時檢測方面表現出色。盡管這些模型在通用目標檢測數據集上表現卓越&#xff0c;但在 HRSC2016-MS&#xff08;高分辨率艦船數據集&#xff09; 上對 YOLOv12 進行微調時&…

?MySQL 事務隔離級別詳解

? 以下是 MySQL 支持的四種事務隔離級別及其特性&#xff0c;按并發安全性從低到高排列&#xff1a; ?1. 讀未提交 (Read Uncommitted)? ?問題?&#xff1a; ?臟讀 (Dirty Read)?&#xff1a;事務可讀取其他事務未提交的數據。?不可重復讀 (Non-repeatable Read)?&am…

如何解決IDE項目啟動報錯 error:0308010C:digital envelope routines::unsupported 問題

如何解決IDE項目啟動報錯 error:0308010C:digital envelope routines::unsupported 問題 在現代軟件開發過程中&#xff0c;開發人員通常使用集成開發環境&#xff08;IDE&#xff09;如IntelliJ IDEA、Visual Studio Code&#xff08;VSCode&#xff09;等進行Node.js項目開發…

2025最新Facefusion3.1.2使用Docker部署,保姆級教程,無需配置環境

Docker部署Facefusion 環境 windows10 Facefusion3.1.2 安裝 拉取源代碼 git clone https://github.com/facefusion/facefusion-docker.git 此處如果拉不下來&#xff0c;需要科學上網&#xff0c;不會的可以找我。 運行容器 將Dockerfile.cpu文件中的的From python:3.…