PacMan 03——追蹤玩家


版權申明:

  • 本文原創首發於以下網站:
  1. 博客園『優夢創客』的空間:https://www.cnblogs.com/raymondking123
  2. 優夢創客的官方博客:https://91make.top
  3. 優夢創客的游戲講堂:https://91make.ke.qq.com
  4. 『優夢創客』的微信公眾號: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&amp;&amp;map.instance.bensbehaveto==true)
        {         
            GameObject[] gameObjects;
            gameObjects = GameObject.FindGameObjectsWithTag("pac");
            for (int i = 0; i &lt; gameObjects.Length; i++)
            {
                if (gameObjects[i].gameObject.tag==&quot;pac&quot;)
                {
                    Vector2 d = (Vector2)gameObjects[i].GetComponent().position + new Vector2(12.5f, 14f);
                    ob.Add(d);
                    Debug.Log(&quot;加入數組完成&quot;);
                }
            }
            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&amp;&amp;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&lt;paths.Count;i++)
                    {
                        paths[i] -= new Vector2(12.5f,14f);
                    }
                    c.machine.Init(c,new WayPointSetect(paths));//運行A*計算出的坐標,利用路點狀態
                    return ;
                }

狀態的切換

當 bool值CanSeePlayer等於false是會跳過上述代碼,進入巡邏狀態


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM