版權申明:
- 本文原創首發於以下網站:
- 博客園『優夢創客』的空間:https://www.cnblogs.com/raymondking123
- 優夢創客的官方博客:https://91make.top
- 優夢創客的游戲講堂:https://91make.ke.qq.com
- 『優夢創客』的微信公眾號:umaketop
- 您可以自由轉載,但必須加入完整的版權聲明
追蹤玩家
利用A*算法吧豆子作為可行走路徑,所以要找到全場存在的豆子
把豆子放入:List組進傳入A*算法
尋找豆子
這是一個尋找方法
int a=0;
ob = new List();
PacdotController[] gameObjects;
gameObjects=GameObject.FindObjectsOfType();
for (int i=0;i<gameObjects.Length;i++)
{
a++;
ob.Add(gameObjects[i]);
Debug.Log("加入數組完成"+a);
}
搜尋多個物體
但是上面的方法不靠譜,需要定義一下執行順序
1.被隱藏的物體標簽將會被更改
更改標簽的代碼如下:
```csharp
private void OnTriggerStay2D(Collider2D collision)
{
if (collision.gameObject.tag == "map")
{
map.instance.bensbehaveto = true;
this.gameObject.tag = "ass";
gameObject.SetActive(false);
}
}
2.把標簽沒有更改的加入數組,作為可行走路徑
3.由於是自動生成的豆子,所以需要自己定義的mapController進行協助
生成完豆子之后會更改mapcontroller腳本bool值
隱藏掉多余的豆子之后更改一個mapcontroller腳本的bool值
當所有bool值更改完成執行通過標簽檢索整個場景,通過標簽吧符合的加入到數組中
代碼如下:
```csharp
public void FindBens()
{
if (map.instance.isbeigover==true&&map.instance.bensbehaveto==true)
{
GameObject[] gameObjects;
gameObjects = GameObject.FindGameObjectsWithTag("pac");
for (int i = 0; i < gameObjects.Length; i++)
{
if (gameObjects[i].gameObject.tag=="pac")
{
Vector2 d = (Vector2)gameObjects[i].GetComponent().position + new Vector2(12.5f, 14f);
ob.Add(d);
Debug.Log("加入數組完成");
}
}
map.instance.bensbehaveto = false;
FindMoster = new AStar2(ob,false, 29, 26);
}
}
4.但又出現了一個問題,在A算法中會出現數組溢出,,要對導入的坐標進行轉換,是坐標對應
5.將這個坐標數組傳入list
6.通過A調用
///聲明障礙圖:在A*算法中包含儲存障礙的內存,把搜尋到的路點加進去,設為能走的路點
判斷是否有玩家
利用碰撞器獲得玩家坐標
代碼如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class VisibleRange : MonoBehaviour {
private void OnTriggerStay2D(Collider2D collision)
{
if (collision.gameObject.tag=="Player")
{
Debug.Log("找到玩家");
Debug.Log( this.transform.parent.GetComponent().CanSeePlayer);
this.transform.parent.GetComponent().CanSeePlayer = true;
this.transform.parent.GetComponent().findPlayerPositionStart =(Vector2) collision.gameObject.transform.position;
}
}
private void OnTriggerExit2D(Collider2D collision)
{
this.transform.parent.GetComponent().CanSeePlayer = false;
}
}
A算法生成追蹤玩家最短路徑
生成尋路利用list每幀計算移動
應為和A算法坐標問題,需要換算
if 中的Bool值表示的是是否找到玩家,出發轉態是否完成
if (c.CanSeePlayer==true&&c.isGoStart==true)
{
List paths;
c.findPlayerPositionStart += new Vector2(12.5f,14f);
Vector2 Ss = dir;
Ss += new Vector2(12.5f,14f);
paths=c.FindMoster.Find(Ss,c.findPlayerPositionStart);//調用A*的find方法,能算出最短距離
for (int i=0;i<paths.Count;i++)
{
paths[i] -= new Vector2(12.5f,14f);
}
c.machine.Init(c,new WayPointSetect(paths));//運行A*計算出的坐標,利用路點狀態
return ;
}
狀態的切換
當 bool值CanSeePlayer等於false是會跳過上述代碼,進入巡邏狀態