[Unity][NavMesh]通过自动导航自动排队

 

移动的方式为NavMeshAgent

 

要想自动排队,先排队

1.获得每个要排队的实体的对象,并依次加入List数组

2.获得队伍的每个位置的坐标

3.更新每个排队的实体的坐标,更新排队

4.满足一定条件,当第一个完成 事件 的时候,更新排队,从list数组中移除第一个实体,并重复第3个步骤 更新排队

 

获得排队坐标有2种方式

1.建立若干个BoxCollider为Trigger的Cube实体,并且把这些Cube实体放入一个数组中,当角色实体要排队的时候,就调用对应的位置坐标。

缺点是 排队的数量有限制。

2.建立2个BoxCollider为Trigger的Cube实体,代表 排队的首部和尾部。

好处是,有多少对象就可以无限排队。

缺点,只能排队成一条直线,如果排队的队伍 要换成不同的花样,那么就得在

...
                avaters[i].MoveToPosNoSetCurrentPos(firstTrans.position+ vec*i*2);
...

这行代码中 进行 一些设置。

 

...
    public List avaters = new List();
    public Transform firstTrans = null;
    public Transform lastTrans = null;
...

public void UpdateCustomersPos()
    {
        Vector3 vec = Vector3.one;
        if (firstTrans != null
            && lastTrans != null)
        {
            vec = (lastTrans.position - firstTrans.position).normalized*2;//获得单位矢量
            Debug.Log("    " + vec + "    " + firstTrans.position);
        }

        if (avaters.Count > 0)
        {
            for (int i= 0; i < avaters.Count; i++)
            {
                //Debug.Log(" >>>>>>>>>>"+ (firstTrans.position + vec * i));
                avaters[i].MoveToPosNoSetCurrentPos(firstTrans.position+ vec*i*2);
                vs[i].SetNavMeshAgentStopDistance(0);
            }//
        }//
    }//
...

    /// 
    /// 移动 顾客 到指定位置
    /// 
    /// 
    public void MoveToPosNoSetCurrentPos(Vector3 pos)
    {

        if (navMeshAgent == null)
        {
            navMeshAgent = this.GetComponent();
        }
        if (navMeshAgent != null)
        {
            navMeshAgent.SetDestination(pos);
        }//
    }//

    /// 
    /// 
    /// 
    public void SetNavMeshAgentStopDistance(int stoppingDistance_)
    {
        if (navMeshAgent != null)
        {
            navMeshAgent.stoppingDistance = stoppingDistance_;
        }
    }//
...

 

 

 

 

 

 

 

你可能感兴趣的:(Unity,NavMesh)