皇室戰爭 路線行走 (二)

改進了一下,中間的河流,作成第五區域,橋兩端 分上下 兩個點。ide

具體作法以下圖性能

先設置10個空對象,按照固定位置排好,L表明左 R 表明右 M表明中,D下U上,都是英文首字母。 好比橋左上端,就是 LUM 左上中,由於橋是中間 。橋右下 就是 RDM 右下中。優化

 

 

 

 這段表明就是把  10個節點的座標 都保存起來,用單例,這樣之後獲取就不要 找來找去。spa

 

 GroundVector = new Transform[10];
        GameObject GroundVectors = GameObject.FindGameObjectWithTag("GroundVector");
        List<Vector2> list = new List<Vector2>();
        for (int i = 0; i < 10; i++)
        {
            GroundVector[i] = GroundVectors.transform.GetChild(i);
            list.Add(GroundVector[i].position);
        }
        GModel.getInstance.Cv.OnSetSenceVector(list);
    }

除了 保存 座標,單例裏面還有2個方法code

1  得到區域orm

2 尋路對象

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CalculationVector
{
    public Vector2 LU;//左上
    public Vector2 RU;//右上
    public Vector2 LD;//左下
    public Vector2 RD;//右下
    public Vector2 LUM;//左上中
    public Vector2 RUM;//右上中
    public Vector2 LDM;//左下中
    public Vector2 RDM;//右下中
    public Vector2 UM;//上中
    public Vector2 DM;//下中
    public float Offset;//偏移量
    public int region;//區域
    //設置場景各個座標
    public void OnSetSenceVector(List<Vector2> list)
    {
        LU = list[0];
        RU = list[1];
        LD = list[2];
        RD = list[3];
        UM = list[4];
        DM = list[5];
        LUM = list[6];
        RUM = list[7];
        LDM = list[8];
        RDM = list[9];
    }

    //五大 區域
    private int OnSetRegion(Vector2 vec)
    {
        if (LUM.x < vec.x && vec.x < DM.x)// 1,3 5區域
        {
            if (LD.y < vec.y && vec.y < LDM.y)//1 區域
            {
                region = 1;
            }
            else if (LDM.y < vec.y && vec.y < LUM.y)  //5區域
            {
                region = 5;
            }
            else
            {
                region = 3;
            }
        }
        else                    //2,4  5區域
        {
            if (RD.y < vec.y && vec.y < RDM.y)//2 區域
            {
                region = 2;
            }
            else if (RDM.y < vec.y && vec.y < RUM.y)  //5區域
            {
                region = 5;
            }
            else
            {
                region = 4;
            }
        }
        return region;
    }

    // 區域對應 路線
    public List<Vector2> OnRoute(Vector2 v, int oneself)//判斷本身仍是對方 0,1 (1是本身)
    {
        int region = OnSetRegion(v);
        List<Vector2> list = new List<Vector2>();

        switch (region)
        {
            case 1:
                if (oneself == 1)
                {
                    if (v.y < LD.y)//若是壓底部 
                    {
                        list.Add(LD);
                        list.Add(LDM);
                        list.Add(LUM);
                        list.Add(LU);
                        list.Add(UM);
                    }
                    else
                    {
                        list.Add(LDM);
                        list.Add(LUM);
                        list.Add(LU);
                        list.Add(UM);
                    }
                }
                else
                {
                    if (v.y < LD.y)//若是壓底部 
                    {
                        list.Add(DM);
                    }
                    else
                    {
                        list.Add(LD);
                        list.Add(DM);
                    }
                }
                break;
            case 2:
                if (oneself == 1)
                {
                    if (v.y < RD.y)//若是壓底部 
                    {
                        list.Add(RD);
                        list.Add(RDM);
                        list.Add(RUM);
                        list.Add(RU);
                        list.Add(UM);
                    }
                    else
                    {
                        list.Add(RDM);
                        list.Add(RUM);
                        list.Add(RU);
                        list.Add(UM);
                    }
                }
                else
                {
                    if (v.y < RD.y)//若是壓底部 
                    {
                        list.Add(DM);
                    }
                    else
                    {
                        list.Add(RD);
                        list.Add(DM);
                    }
                }
                break;
            case 3:
                if (oneself == 1)
                {
                    if (v.y > LU.y)//若是壓底部 
                    {
                        list.Add(UM);
                    }
                    else
                    {
                        list.Add(LU);
                        list.Add(UM);
                    }
                }
                else
                {
                    if (v.y > LU.y)//若是壓底部 
                    {
                        list.Add(LU);
                        list.Add(LUM);
                        list.Add(LDM);
                        list.Add(LD);
                        list.Add(DM);
                    }
                    else
                    {
                        list.Add(LUM);
                        list.Add(LDM);
                        list.Add(LD);
                        list.Add(DM);
                    }
                }
                break;
            case 4:
                if (oneself == 1)
                {
                    if (v.y > RU.y)//若是壓底部 
                    {
                        list.Add(DM);
                    }
                    else
                    {
                        list.Add(RU);
                        list.Add(DM);
                    }
                }
                else
                {
                    if (v.y > RU.y)//若是壓底部 
                    {
                        list.Add(RU);
                        list.Add(RUM);
                        list.Add(RDM);
                        list.Add(RD);
                        list.Add(DM);
                    }
                    else
                    {
                        list.Add(RUM);
                        list.Add(RDM);
                        list.Add(RD);
                        list.Add(DM);
                    }
                }
                break;
            case 5:
                if (oneself == 1)
                {
                    if (v.x < DM.x)
                    {
                        list.Add(LUM);
                        list.Add(LU);
                        list.Add(UM);
                    }
                    else
                    {
                        list.Add(RUM);
                        list.Add(RU);
                        list.Add(UM);
                    }
                }
                else
                {
                    if (v.x < DM.x)
                    {
                        list.Add(LDM);
                        list.Add(LD);
                        list.Add(UM);
                    }
                    else
                    {
                        list.Add(RDM);
                        list.Add(RD);
                        list.Add(UM);
                    }
                }
                break;
            default: break;
        }
        return list;
    }
}
View Code

這樣,用戶在邏輯幀 就能隨時 調用 尋路路徑。速度槓槓的。blog

另外,若是檢測 敵人,要跟蹤,那麼必需要 a*尋路。get

爲了性能,考慮2個問題。it

1.格子 少一點,我以爲11 * 7 就可。1-3毫秒就能尋到,不影響性能。

2. 規定 A*  一幀使用數量,也就是說,若是當前幀有100個要用 A*尋路,那麼程序假設規定最大一幀只能20個,尋路的貼上以尋,沒尋的,等下一幀尋路。

好處,固然是不會卡,雖然你們會擔憂另外80個會不會  由於這幀不尋路 遲鈍,但 邏輯幀 只要保證1秒 5幀以上,那麼 這個遲鈍 用戶是 看不出來的,畢竟沒有可能一次100個都要用a*尋路

 

 更多優化:能夠把橋 左右 作成 5,6區域。若是同區域 跟蹤,能夠走直線,不a*。這也是 一個優化思路。

固然,這個思路僅僅是針對  皇室戰爭 地圖,若是同一個區域  不是 規則形狀,須要繞,那麼 這個只能走a*

相關文章
相關標籤/搜索