專案前期就導入了A★並以它的格狀資料做為移動的判定,不論是玩家和怪物都是利用此資料做移動的。然而這個資料有些地方不是很正確,在這篇文章的最後,也有先將此問題記錄下來
因此,今天就花些時間先來處理這個A★格狀資料不正確的問題。
解決的方法有二種
二個方式都算是可行的方案,不過利用改變房間的方法仍還是有可能在不注意的情況下產生相題的問題,也就是說要規範房間的製作方式才能避開這個問題。而今天採用的方法是利用Raycast方式進行,在遊戲一開始生成的時間可能會稍微花些時間,但這個方法比較合適,且不太需要額外的規範。
主要的程式碼片斷如下
if (gridNode.HasAnyGridConnections)
{
//
var raycastToNorth = Physics.Raycast(
raycastStartPosition, Vector3.forward, out northHit, distanceToCheck, layerMask);
var raycastToEast = Physics.Raycast(
raycastStartPosition, Vector3.left * -1.0f, out eastHit, distanceToCheck, layerMask);
var raycastToSouth = Physics.Raycast(
raycastStartPosition, Vector3.forward * -1.0f, out southHit, distanceToCheck, layerMask);
var raycastToWest = Physics.Raycast(
raycastStartPosition, Vector3.left, out westHit, distanceToCheck, layerMask);
// i is the direction index
var hasConnectionAtAStar = gridNode.HasConnectionInDirection(i);
var hasConnectionAfterRaycast = !hitAtDirections[i];
}
// i is the direction index
gridNode.SetConnectionInternal(i, false);
先利用HasAnyGridConnections來排除本來就沒有路徑的Node,也就是這個時間點以A★原先的資料為主。而後四方向偵測,若是Raycast偵測到有阻擋物(牆壁),則將原來的A★資料做修正,這個階段則以Raycast為主。
可以從ActivityLog裡看到若是再往南邊走,則會有不能走的訊息出現
A★的資料修正後,接下來再加入一個移動限制,也就是若是玩家移動的方向前方那一格已有怪物,則玩家不能夠移動到那格。這點和多數的Roguelike以及早期的FPDC移動機制是相同的,就不再特別強調這個規則。
利用怪物身上有目前在哪個Node index的資料,直接和場上所有的怪物進行比對,如果要移動到的Node Index剛好是某隻物物目前所在地,則不能移動。
部份VS如下
試著往怪物的所在地方向移動,則會看到不能移動的訊息
多數的小地圖是用Camera直接由TopDown的角度照下來,但這個方法沒有辦法有效的呈現出地圖中每一格的(牆壁)資訊。而目前是用A★進行格狀資料的生成,利用這個資料,可以用另一種方式呈現小地圖。
想過直接在Texture上進行SetPixel的方式畫每一格,但或許可以直接利用Tilemap進行小地圖的生成。
初步的嘗試,看起來是不正確的,不知道是A★的倶料拿取有錯,還是有其它原因,要再花時間了解