首先,我知道那些屬性型別的資料,比如一個物體的型別、id、名稱可以事先放在檔案里或者資料庫里,游戲運行的時候讀取出來然后進行實體化。
但是除了這種簡單的屬性資料,還有大量的操作特性。
比如一個任務,除了id、名稱、發布人這種屬性外,還要定義他的可接條件、完成條件、完成獎勵。假設一個任務的可接條件比較復雜,是“(完成A任務and玩家等級大于N級)or(玩家身上有某物品and游戲時間為B時)”,像這種東西完全不適合用資料檔案編輯吧。
再比如一個物品的使用效果,可能千變萬化,還可能有概率影響效果型別,這種我看也不適合用資料檔案編輯。
所以我想知道在成熟的RPG游戲開發中到底是怎么處理這些東西的,是資料檔案,外接腳本還是不可避免的使用一些硬編碼?
望從業大神回答,希望能詳細,非常感謝!
uj5u.com熱心網友回復:
用型別區分,代碼里根據型別去做檢測,至于檢測用的數值,策劃填寫檔案。uj5u.com熱心網友回復:
可以具體說說嗎?尤其是那些和啊或的條件,還有概率分支這種
uj5u.com熱心網友回復:
假設一個任務的可接條件比較復雜,是“(完成A任務and玩家等級大于N級)or(玩家身上有某物品and游戲時間為B時)”,像這種東西完全不適合用資料檔案編輯吧。========================================================
我在上一個專案中實作過這樣的需求,其實這就是一個條件運算式決議。網上可以找到很多現成的實作,然后自己擴展一下就可以了。
就以上面的這個條件為例, 編輯出來的文本可能是這樣的
( IsTaskCompleted( ID_A ) && PlayerLevel > N ) || ( PlayerItems.Contain( ItemB ) && GameTime > B )
然后程式掃描決議這個運算式。IsTaskCompleted, PlayerLevel 等等都是你自定義的函式。
至于如何把 “IsTaskCompleted” 這樣的字串和你程式中的函式聯系起來, 你可以使用 反射, 或者建一個 Dictionary
例如
dict[“IsTaskCompleted”] = XXXXClass.IsTaskCompleted; // key : string value : 函式指標
然后根據字串查表即可。
當自定義函式數量很多時,需要程式員提供一個可視化的編輯工具,這樣不會出錯。
希望一上回答能幫助到你
uj5u.com熱心網友回復:
可參考魔獸爭霸編輯器 T 或 J都行這里雖然傻瓜式 但是如果設計出來的話 用起來很方便
uj5u.com熱心網友回復:
其實這種問題一樣可以資料化存盤 只不過不是那種通用型資料 樓主所說的問題就是要將一些邏輯資料化 可以做一個邏輯決議器 提供一些列的邏輯條件判定節點 然后將這些節點滿足跳轉的資料填進去 最后將一系列的節點連起來 這樣說可能有些抽象 你可以看看 UE3 的kismit 或者 UE4的藍圖 就明白了 非常好的邏輯資料化的實體uj5u.com熱心網友回復:
任務可以這樣配置啊, 用xml
<tasks>
<!-- field:1等級,2在線時間,3已完成任務,4已擁有道具,5... -->
<!-- operator:1小于,2小于等于,3大于,4大于等于,5等于,6不等于,7包含,8不包含,9... -->
<condition id="1" field="1" operator="3" value1="10"/> <!-- 等級大于10 -->
<condition id="2" field="2" operator="4" value1="600"/> <!-- 在線時間大于600秒 -->
<condition id="3" field="3" operator="7" value1="1001"/> <!-- 已完成任務串列,包含id1001的任務 -->
<condition id="4" field="4" operator="7" value1="2002" value2="10"/> <!-- 已擁有道具串列,包含id2002的道具10個 -->
<!-- 與結點 -->
<and id="5" condition1="1" condition2="3"> <!-- 等級大于10 且 已完成1001的任務-->
<and id="6" condition1="2" condition2="4"> <!-- 在線時間大于600秒 且 已擁有10個道具2002-->
<!-- 或結點 -->
<or id="7" condition1="5" condition2="6"> <!-- (等級大于10 且 已完成1001的任務)或(在線時間大于600秒 且 已擁有10個道具2002)-->
<!-- 非結點 -->
<not id="8" condition1="7"> <!-- 非((等級大于10 且 已完成1001的任務)或(在線時間大于600秒 且 已擁有10個道具2002))-->
<!-- 實際的任務 -->
<task id="1" condition="7"> <!-- 任務1,完成條件是id為7的那個條件-->
</tasks>
uj5u.com熱心網友回復:
script object轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/53390.html
標籤:Unity3D
