假設基類InstanceBase類,以下所有Instance前綴的類均繼承于該類,每個實體都有自己的uuid
InstancePlayer類、InstanceNpc類、InstanceBox類這三個類分別代表玩家,npc,和家具的箱子。
然后物品中有InstanceWeapon類、InstanceDrug類,分別是武器類,藥水類,武器類不可以疊加,藥水類可以疊加,所有可以當作物品被裝入容器的類都實作介面Imoveable,
現在想實作的是物品可以放到容器中,為了實作代碼重用則又定義了Container類分別存在于Instanceplayer、InstanceNpc、InstanceBox類中,理想狀態是Container處理Imoveable的一切裝入和拿出例如Container.Add(Imoveable) Remove(Imoveable),
可是現實問題是可以疊加的和不可以疊加的物品沒有辦法很好的做到邏輯清晰的設計在Container里。
那么請問在目前的需求下如何設計這個容器系統比較好?例如Container類是不是沒有必要,那么怎么設計比較好?求解
uj5u.com熱心網友回復:
嗯。。其實這個還是要看需求的。比較復雜的背包系統牽扯很多方面,比如UI,比如庫存系統,比如物品的使用效果。我之前做過這種東東,大體上給你說說吧:物品管理方面:
Item 類,所有物品的基類;派生類有 Weapon_Item、Drup_Item等。事實上,我并不是用的類繼承關系,而是用了一個Enum來區分物品類別,這個Enum設計如下:
public enum ItemType : uint
{
Weapon = 0x00000001,
Drup = 0x00000002,
Task = 0x00000004,
//......................
}
這樣做的好處是,某一個物品可能既是這種類,又是那種類,這樣可以很簡單的用Mask(掩碼)相與運算來區分一下。
。物品類主要記錄的物品的ID和屬性,屬性包括:等級,比如稀有的,罕見的等,效果,比如加10攻擊,提高20命中率,提高10點防御等等。。
UI方面:
WindowsManager類,視窗管理類,主要用于處理多個視窗重疊時的焦點問題,比如彈出的對話框,可以有模態和非模態兩種,模態的視窗一旦彈出,就要禁用其他視窗的焦點,并且新彈出的視窗要處于最頂層。視窗管理類本質上是一個堆疊,但不完全是。因為需要處理非模態的情況。
Windows類,所有視窗的基類,主要用于計算視窗的尺寸,邊界等資訊。
Drapable類,組件,這個組件需要物體或者物體的祖先物體必須具有window組件。如果一個具有window組件的物體或者子物體添加了這個組件,那么這個Window就可以被拖動。主要用于視窗的標題欄,這樣拖動視窗的標題欄就可以拖動整個視窗,并且會進行視窗的邊界檢測。
Icon類,所有圖示的基類,派生有兩個:ItemIcon和AbitilyIcon,即物品圖示和技能圖示。ItemIcon類,主要用于記錄物品的圖示地址和物品數量,比如一捆藥品,數量99個可以在一圖示上顯示,只占用一個插槽,但是武器不允許堆疊。另外,ICON類還要處理物品或者技能使用后的冷卻處理。。可以是一個扇形的遮罩。。
Solt類,所有圖示的插槽類,一個容器,允許子物體為一個具有Icon組件的圖示。可以設定允許放置的圖示型別,通過Mask來實作。比如,人物狀態的裝備插槽,只允許防止裝備,不允許放置藥品,也不允許放置技能。但是快捷鍵的插槽,允許放置藥品和技能,但不允許放置裝備。。。。
特效方面:
Buff類,主要記錄了使用物品后的特效,分為計時型、永久型等,比如一瓶藥,喝下去之后立即增長生命100點,另一種藥喝下去之后10秒內增長生命最大值100點。。。屬于不同的型別。Buff類主要操作的物件時角色的資訊。
BuffIcon類,這個主要用于顯示在任務狀態欄上,用來表示角色當前的狀態,比如目前處于中毒狀態等。。。
角色資訊類:
CharInfo類:角色的資訊類,主要記錄角色屬性,比如:最大生命值、當前生命值、當前魔法值、攻擊力、防御力。。。。。
uj5u.com熱心網友回復:
ui暫且不管,每個角色是如何存盤這些物品的?
uj5u.com熱心網友回復:
角色擁有背包啊。或者箱子。。。物品存盤在背包、箱子里,箱子或者背包屬于角色。uj5u.com熱心網友回復:
,。。麻煩你看看我的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/23861.html
標籤:Unity3D
上一篇:Android默認顯示系統語言、應用中手動切換語言、下次登錄顯示用戶切換的語言完整版
下一篇:2020-09-12
