2016-09-28 81 views
5

我正在開發(或至少試圖開發)使用SpriteKit的一個體面大的實時戰術遊戲(類似於RTS)。要使用GKAgents或不

我正在使用GamePlay工具包進行尋路。

最初我用SKAction s來移動Path中的精靈,但速度足夠快,我意識到這是一個很大的錯誤。

然後我試圖與GKAgent s到實現它(這是我目前的狀態) 我覺得GKAgent s爲非常原始和過早也是他們遵循一些奇怪的牛頓定律#1,使他們永遠移動(我可以沒想到任何情況下,它將是有用的 - 可能在WWDC的演示文稿)

以及我看到,他們有一些角速度執行旋轉 ,我根本不需要,不能真的找到如何禁用它...

以及GKBehavior s給出GKGoal s似乎做出一些奇怪的事情......

設置行爲,避開障礙物,使我的單位齧合身邊......與路徑跟蹤目標 設置行爲完全忽略一切,除非maxPredictionTime足夠低... 我甚至不願意告訴我將兩者結合起來會發生什麼。

我覺得壞了...

我覺得我有2個選擇現在:

1)與代理商掙扎得越來越努力使他們的行爲,我想

2)通過GKObstacleGraph和一個路徑查找(我也必須說在某些點上,點的路徑會產生最糟糕的路徑,例如「去觸摸那個障礙然後反向觸摸然後到實際點(從頭開始可以通過直線實現)「)。

問題是:

這些選項中最好的是什麼?

+1

你可能是唯一一個使用它的人,也是第一個真正使用它的人。 SpriteKit的新功能錯誤似乎是常態。 – Confused

回答

8

一個獲得這種行爲你後最好的方法(在SpriteKit/GameplayKit)是要認識到路徑規劃路徑以下不一定是相同的操作。 GameplayKit提供了兩種工具 - GKObstacleGraph適用於規劃,GKAgent適用於遵循規劃路徑 - 並且當您將各自的優勢結合起來時,它們的工作效果最佳。

(它可以是一個有點誤導性GKAgent提供避障;不以同樣的方式把它當作找到繞過障礙物的路線,更像是在用自己的方式反應,突然障礙)

要換句話說,GKObstacleGraphGKAgent就像駕駛地圖和安全駕駛汽車的區別。前者是你決定採用CA-85和US-101而不是I-280的地方。 (也許偶爾重新評估一下你的決定 - 比如在交通堵塞時選擇一組不同的道路。),後者是你,不斷的時刻到時刻,變更車道,避免坑窪,通過速度較慢的車輛,減緩交通擁擠等


在蘋果的DemoBots示例代碼,他們打破這一伸到兩個步驟:

  1. 使用GKObstacleGraph做高層次的路徑規劃。也就是說,當壞傢伙「在這裏」並且英雄是「在那裏」時,並且之間有一些圍牆,選擇一系列大致接近從這裏到那裏的路線的路標。

  2. 使用GKAgent行爲,以使角色大致遵循這條道路,同時也反應等因素的影響(如使壞人互相不退一步,給他們隱約逼真的運動曲線,而不是簡單地遵循航點之間的線路)。

你可以找到在該示例代碼大部分這背後的相關東西,在TaskBotBehavior.swift - 從addGoalsToFollowPath開始,看看都被調用的地方,它使呼叫。


至於「永遠的感動」和「角速度」的問題......

代理模擬是一個動機比喻的一個奇怪的組合(即代理執行,以將其移向哪裏有什麼需要它在約束內「想要」)和一個物理系統(即那些運動像力/衝動一樣建模)。如果你拿走了代理人的目標,它不知道它需要停止 - 相反,你需要給它一個停止的目標。 (也就是說,移動速度目標爲零)。如果您對設計改進有任何建議,可能會有比Apple選擇的更好的模型 - file bugs

角速度更棘手。代理人固有的物理約束的概念有點類似於海上陸地或船隻上的車輛,這種概念很好地融入系統。它不能真正處理像太空戰士這樣的事物,這些太空戰士必須重新調整方向來引導他們的推力,或者走路的生物可以像往前一樣側身向後或向後走 - 至少不是自己。您可以通過maxAcceleration屬性獲得一些里程來改變座席移動的「感覺」,但您受限於該屬性涵蓋線性和角加速度的事實。

但請記住,遊戲世界中代理系統「需要」與「實際發生」之間的界面在您的控制之下。實施GKAgentDelegate的最簡單方法是僅同步代理的velocityposition屬性以及它代表的精靈。但是,你不必這樣做 - 你可以計算出不同的力量/衝動,並將其應用於你的精靈。

+0

主席先生,我非常感謝你的詳細回答,但是在寫問題之前我已經完成了 - 我的意思是說所有這個框架(讓我稱之爲框架)是如此脆弱,每一個行爲都是目標需要如此之多的微調(在「跆拳道」流浪幾個小時之後)。我覺得我可以推出我自己的地方,因爲我可以做所有事情,因爲我需要完全控制每個元素... – ColdSteel

+0

請不要誤解我我真的以開放的態度來到這裏,我試圖完成它.. 。在玩了5個小時的預測時間和重量之後,我做了一些基本的FollowPath和攔截... – ColdSteel

+0

真正的問題是:是否值得推出我自己的遊戲,還是嘗試使'GameplayKit'變得更好?按我的意願行事? – ColdSteel

2

我還不能評論,所以我作爲答覆發佈。最近我遇到了同樣的問題:代理在目標周圍晃動,或者即使移除行爲也會繼續移動的代理。然後我意識到,行爲只是控制運動的算法,但您仍然可以手動訪問和設置代理的速度,位置和角度。

就我而言,我有一個追逐食物的小動物。當它與食物接觸時,食物實體被移除。我嘗試了很多事情,讓食物吃完後它們停止(它會繼續沿着直線前進)。而我所要做的就是將速度設置爲0.這是因爲行爲不會直接影響位置,而是影響速度/角度組合(取而代之)。當實體沒有目標時,它不會「想」改變它的狀態,所以無論它達到的速度和方向如何,它都會保持。它不會更新/更改它。所以除非你制定一個目標來讓它停止,否則它會擺動/繼續前進。簡單的方法是將行爲設置爲零,並將速度設置爲0。

如果行爲/目標系統沒有針對您正在尋找的動畫類型執行此操作,則仍然可以使用代理系統並使用AgenDelegate協議和更新方法自定義移動並使其與其他代理人稍後。您甚至可以將代理與通過物理引擎移動的節點或操作(或任何其他方式)同步。

我認爲代理系統很好,因爲您可以稍後使用它,即使它僅用於特殊效果。但正如混合動作和物理可以給出一些奇怪的結果一樣,混合目標/行爲和任何其他「自動化」工具都可能導致不穩定的行爲。

您也可以將代理系統用於其他內容,而不是移動實際的精靈。例如,您可以使用代理人充當「目標搜索者」來模擬敵人的反應時間。代理在場景中移動並找到其他代理,當它接觸到合適的目標時,敵方實體會攻擊它(隨機想法)。

這不是一個「一刀切」的解決方案,但它是一個非常好的工具。

+0

謝謝你的回答(如果你願意的話),但是......我只是拋棄了他們,並實現了我自己的「代理」,這些代理非常適合我的遊戲 - 但是後來我面臨着很多崩潰和''SceneKit那是爲了處理它的實現 - 物理引擎也不會因爲我的需要而退出......現在我正試圖將我所做的所有內容移植到虛幻4中 - 我厭倦了SceneKit的betaness/alphaness - 我不得不說,SceneKit真的很有趣的引擎 - (它的工作原理),許多事情都很簡單......我希望蘋果能夠改進它,所以我有一天能夠在其上發佈遊戲 – ColdSteel

+0

對於我目前正在做的事情,SpriteKit就夠了。沒有進入scenekit,所以我不知道它,但它似乎瞄準了1美元的應用程序市場,儘管它可以有更多的能力。你只需要更多的東西,它會成熟,但我很確定。我沒有更新到塞拉利昂,但與GameplayKit的新fetures,它看起來像他們整合實體/組件系統Spritr – BadgerBadger

+0

對於我目前正在做的,SpriteKit就足夠了。沒有進入scenekit,所以我不知道它,但它似乎瞄準了1美元的應用程序市場,儘管它可以有更多的能力。你只需要更多的東西,它會成熟,但我很確定。我還沒有更新到Sierra,但是隨着GameplayKit的新發現,看起來他們將實體/組件系統整合到SpriteKit的節點架構中。我認爲這與SceneKit是一樣的。你必須更新操作系統才能使用這些功能,這很讓人傷心。 – BadgerBadger