Unity3D 卡牌遊戲中有關卡牌類的製作

2021-08-22 08:28:45 字數 2816 閱讀 5883

需求製作

流程一些問題

卡牌效果的實現

還沒學到設計模式,所以自己和同學搗鼓了乙個,請各位大神多多指教!

製作一款卡牌遊戲最核心的地方就是卡牌,遊戲中有生成卡牌,獲得卡牌,銷毀卡牌,檢視卡牌,打出卡牌,卡牌音效等幾大功能,但是最核心的可以分成三個:卡牌的生成與銷毀,卡牌的特效,卡牌的檢視,下面我們就遵循這三個核心來設計卡牌類

cardmanager例項化乙個卡牌prefab

卡牌prefab上的cardinstance被呼叫,然後設定自身的資訊

我們根據選擇的職業生成了不同的初始卡組,然後把它存放在乙個card型別的陣列裡面,以後增加刪除都可以用它來操作,注意它的屬性是card,就是之前說的靜態指令碼

public card cardgroup;
怎麼實現抽牌和棄牌呢?

我們先想到,用random.range來隨機獲得一張卡牌,但是隨機又有新的問題,如果運氣不好,獲取到了已經抽過,或者已經打出的卡牌怎麼辦?這裡我們用了乙個list來解決這個問題

public listcardtodruglist;int型別的list,裡面存放的是待抽取的牌的陣列序號

想象一下你現在有6張牌,那麼這個list的index和value就為

index 0 1 2 3 4 5

value 0 1 2 3 4 5

假設我們抽到2號牌,那麼list的變化就為

index 0 1 2 3 4

value 0 1 3 4 5

其中2號牌從list中刪除了,從上面我們可以看出,真正要傳給cardgroup的是list的value,使用這個方法就能避免抽到重複的牌了。

3. 初始化這個list,從0開始到卡牌總數,

for (int i = 0; i < howmanycard; i++)

這裡要注意,unity陣列和list似乎必須要在方法裡面初始化,如果在start裡面初始化的話,接下來使用的過程中會報空指標錯誤。

現在假設有15張牌,我們從中抽取一張,那麼先用random.range來獲得乙個隨機數,假設是9,

int j = random.range(0, cardtodruglist.count);

然後初始化cardgroup裡面的第cardtodruglist中的第j個元素,這麼說可能有點繞,要好好想一下setcard((cardgroup[cardtodruglist[j]]));

前面說了,因為list裡面存放的是陣列序號,而且經過幾次抽牌後,list的下標會改變,導致不能跟list下標對應的值一一對應,但是不管它改變多少次,它裡面存放的值始終是不變的,我們只要取得它裡面的值(即為卡組中的第幾張牌),然後再傳遞給卡組就行了

如果抽完牌了,就初始化list就行了,因為cardgroup是始終不變的

##棄牌

我們每打出一張牌,就把這張牌的新增到棄牌堆裡面,這裡不用用到int型別的list,直接用card型別的list,每次打出一張牌就新增進這個list裡面就行了

public listcardtoloselist;
戰鬥中我們常常需要檢視卡組和棄牌堆,這裡面怎麼操作呢?

用我們之前提到的抽牌list,獲取list的長度,然後按順序例項化陣列中的list序號的卡牌,接著設定它的位置和父物體就行了。由於是用生成的方法,所以每次都要先清空已經生成的卡牌,很簡單,直接destroy就行了。

/// 

/// 生成預製卡片,設定資訊

///

public

void

creatcardtosee()

}

/// 

/// 清空已有的卡組資訊

///

public void

destroycardtosee()

}

棄牌堆要用到之前的棄牌list,這個簡單,因為它是card型別的list,我們直接生成就行了

/// 

/// 生成預製卡片,設定資訊

///

public void

creatlosecardtosee()

}}

這裡是我們沒做好的地方,我們原來想的是即將打出的卡牌和卡牌指向的目標之間需要乙個訊息指令碼來給他們發訊息,傳遞當前卡牌效果,於是就能把所有的卡牌資訊寫在那個指令碼裡面,然後每次監聽滑鼠,每次滑鼠選中一張卡牌指向乙個目標的時候,我們就發訊息給這個訊息指令碼,傳遞選中的卡牌和目標,然後根據卡牌的id發動效果。

但是當時沒想好,直接把每張卡牌的效果寫在了人物目標身上,導致這個指令碼有點邏輯不通(執行時沒問題的,但是自己感覺很不舒服),過程還是一樣,直接傳卡牌id到人物身上就行了

unity3d 遊戲外掛程式 關卡頁面建立管理

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...

Unity3D遊戲開發

入門級unity安裝教程 一 unity五大面板 unity3d的介紹 1 介面 選單 面板 元件 unity5.x 編輯器介紹 unity開啟篇 一 滑鼠右鍵 wsadeq前後左右上下移動 shift加速移動 滑鼠右鍵旋轉檢視 滑鼠中鍵移動檢視 alt 右鍵縮放 alt 左鍵旋轉物體視角 q移動場...

Unity3D 遊戲中的技能碰撞檢測

在遊戲戰鬥中,我們會用到各種各樣的碰撞檢測,來判斷是否打中了目標 比如扇形檢測 圓形檢測 還有矩形檢測,王者榮耀裡后羿的大招就是乙個很長的矩形碰撞體 這些在unity3d引擎中其實都封裝好了一些collider元件去檢測碰撞,但是我最近寫幀同步演算法的時候,發現u3d中的碰撞演算法執行順序不可控,會...