2017-02-25 19 views
2

首先,我是Unity的新手,我目前正在學習c#,請溫柔!自動添加平臺區域瓦片當玩家接近當前瓦片的邊緣

作爲一個項目,我想創建一個簡單的3D平臺遊戲。玩家的想法是從一個方形的瓦片開始,這個瓦片是遊戲平臺的遊戲區域。他們通過四處移動來探索這塊瓷磚上的不同元素。

視角是第三人稱,所以玩家正在低頭看着動作。當他們接近拼圖的邊緣時,Unity會識別這一點,併爲現有拼貼添加另一個拼貼,基本上可以將拼圖面積加倍。

隨着玩家各地進一步移動到瓷磚邊緣,其他地磚被添加,增加每次發現的領域。

我的想法實現這一目標將有5個的遊戲對象,有一個像已建成對他們的樹木不同的元素。問題是實現這個目標的最好方法是什麼。

難道是建立與所有瓷磚完整的層次,然後使用代碼限制玩家可以如何遙遙領先看,基本上瓷磚的寬度和長度。

或者它會更好地觸發新的瓷磚作爲玩家接近當前瓦片的邊緣出現。

思想,鏈接到示例代碼,我可以再利用將是非常方便的。

謝謝。

+0

非常有趣的想法。我認爲第二種方法(程序化地生成下一個瓷磚)將會更有效地節省內存。簡單的解決方案是在每個圖塊的邊緣放置一些觸發式對撞機,當觸發時,在適當的位置創建一個新的圖塊。 – AVAVT

回答

2

的問題主要是根據意見,但這裏是一些建議:

有做一個遊戲沒有統一正確的方式。正確性主要集中在績效上;內存和處理。

這裏有兩種方法:

    • 條件:你的世界是無窮的(或非常大),球員動作非常緩慢地隨時間(比如每瓦需要超過一秒鐘穿越)。
    • 解決方案:不要在啓動時實例化所有內容,而應在播放器到達拼貼的邊緣時查找級別結構中的下一個拼貼來檢索其數據,然後實例化其對象。
    • 條件:你的世界是不是非常大(說它小於整體10K對象)或玩家可以快速移動(如在帝國遊戲的年齡)。
    • 解決:實例在加載階段的一切,因爲他們正在實例化,使得任何在遊戲開始得到處理停用遊戲對象。在這種情況下,關卡結構是一個遊戲對象的集合,您可以在其中激活或停用它們。

提示:

  1. 池是一個很好的做法,當涉及到重複對象。遊戲池基本上是一個帶有腳本的空遊戲對象,以及許多停用的孩子。

    • 例如,如果你有1K棵同類樹木,你最好有一個樹池。創建一個名爲樹池的遊戲對象,爲其添加一個池腳本,並使該腳本在加載階段生成1K停用的樹遊戲對象。然後每當你的關卡生成器需要一棵新樹時,只需從樹池中取出一棵樹並激活並重新定位它。確保遊戲結束後清理游泳池以防止內存泄漏。
    • 您可以根據需要實現該池,以便爲特定池提供對象變體。
  2. 在運行時實例化成本很高,特別是在移動設備中。無論何時您需要一次實例化幾個遊戲對象,都應考慮使用協程來防止滯後或凍結(這也適用於加載階段)。

例如,

IEnumerable CreateObjects(Data[] data) 
{ 
    foreach(var e in data) 
    { 
     Instantiate(e);//instantiate here and then wait 
     yield return null;//this line prevents lag 
    } 
} 
//... 
StartCoroutine(CreateObjects(data)); 
//... 
  • 有許多活躍的遊戲對象也是特別是在移動設備的成本很高。如果許多活動的遊戲對象有大量的腳本,更新方法會損壞性能。如果許多活動的遊戲對象具有剛體或碰撞體,物理引擎處理將變得沉重。

  • 激活遊戲對象代價昂貴,但比實例化要少,因爲它只在其腳本上運行Start方法(如果有),並且還會導致物理引擎重新評估其結構(如果它具有靜態碰撞器或剛體)。

  • 如果渲染的視覺效果(完全或部分)對相機可見,則渲染代價高昂。

  • 創建一個編輯器項目,您可以在其中設計您的關卡。在這個項目中,你將使用unity的編輯器類來生成代表你整個世界的某種數據(JsonObject)。 (級別集合,每個級別的瓦片和每個瓦片中的對象)。此外,您可以將其他數據(如目標和其他數據)存儲在不同的JsonObject中。然後通過讀取它並將其結構存儲在內存中來在遊戲中使用這些數據。

    • 我推薦JsonObject存儲數據的原因是它的大小,可移植性,靈活性,可訪問性和簡單性。 JsonObject是一個存儲爲純文本的字典。並且因爲它是一個文本,你可以對它進行加密,只要你喜歡
  • +0

    謝謝你提供這樣一個全面的答案,這對我的繼續教育很有幫助。你是否還建議使用游泳池在遊戲場景中創建隨機對象?而不是使用spawn腳本? – Dano007

    +0

    任何具有多個實例的遊戲對象都可以從池中衍生出來。例如樹,敵人,視覺效果,收藏品等。游泳池在開始時消耗恆定(最大)內存但減少遊戲中的滯後 – Bijan