Exemplo n.º 1
0
    // Start is called before the first frame update
    void Start()
    {
        level = new ObjModel(@"ExportedObj;TestNavMesh_5.obj");

        settings.AgentRadius = 0.5f;
        settings.AgentHeight = 1.0f;

        GenerateNavMesh();

        TargetPosition     = ExportNavMeshToObj.ToUnityVector(smoothPath[CurrentNode]);
        transform.position = TargetPosition;
    }
Exemplo n.º 2
0
    // Update is called once per frame
    void Update()
    {
        if (transform.position != TargetPosition)
        {
            transform.position = Vector3.Lerp(transform.position, TargetPosition, Time.deltaTime * 50.0f);
        }
        else
        {
            if (CurrentNode < smoothPath.Count - 1)
            {
                ++CurrentNode;
                TargetPosition = ExportNavMeshToObj.ToUnityVector(smoothPath[CurrentNode]);
            }
        }

        if (crowd != null)
        {
            //Agent[] agents = new Agent[crowd.GetAgentCount()];
            for (int i = 0; i < crowd.GetAgentCount(); ++i)
            {
                lastPosition[i] = crowd.GetAgent(i).Position;
                //agents[i] = crowd.GetAgent(i);
            }

            //crowd.UpdateTopologyOptimization(agents, crowd.GetAgentCount(), Time.deltaTime);
            crowd.Update(Time.deltaTime);

            for (int i = 0; i < crowd.GetAgentCount(); ++i)
            {
                try
                {
                    //Debug.DrawLine(ExportNavMeshToObj.ToUnityVector(lastPosition[i]), ExportNavMeshToObj.ToUnityVector(crowd.GetAgent(i).Position), Color.green, 1);
                    mob[i].transform.position = ExportNavMeshToObj.ToUnityVector(crowd.GetAgent(i).Position);
                }
                catch
                {
                }
            }
        }

        if (Application.platform == RuntimePlatform.WindowsEditor)
        {   // 현재 플랫폼이 Window 에디터인지
            if (Input.GetMouseButtonDown(0))
            {
                Vector3 p = Input.mousePosition;

                Ray cast = Camera.main.ScreenPointToRay(Input.mousePosition);


                // Mouse의 포지션을 Ray cast 로 변환



                UnityEngine.RaycastHit hit;
                if (Physics.Raycast(cast, out hit))
                {
                    Debug.Log($"hit x {hit.point.x}, y {hit.point.y}, z {hit.point.z}");
                    var newPt = navMeshQuery.FindNearestPoly(ExportNavMeshToObj.ToSharpVector(hit.point), new SVector3 {
                        X = 10, Y = 10, Z = 10
                    });

                    for (int i = 0; i < crowd.GetAgentCount(); ++i)
                    {
                        NavPoint targetPt;
                        navMeshQuery.FindRandomPointAroundCircle(ref newPt, 3, out targetPt);

                        Debug.Log($"agent{i} : x {targetPt.Position.X}, y {targetPt.Position.Y}, z {targetPt.Position.Z}");

                        crowd.GetAgent(i).RequestMoveTarget(targetPt.Polygon, targetPt.Position);
                    }
                    crowd.UpdateMoveRequest();
                } // RayCast
            }     // Mouse Click
        }
    }
Exemplo n.º 3
0
    private void GeneratePathfinding()
    {
        if (!hasGenerated)
        {
            return;
        }

        NavQueryFilter filter = new NavQueryFilter();

        buildData = new NavMeshBuilder(polyMesh, polyMeshDetail, new SharpNav.Pathfinding.OffMeshConnection[0], settings);

        tiledNavMesh = new TiledNavMesh(buildData);

        for (int i = 0; i < tiledNavMesh.Tiles.Count; ++i)
        {
            for (int j = 0; j < tiledNavMesh.Tiles[i].Verts.Length; ++j)
            {
                if (j < tiledNavMesh.Tiles[i].Verts.Length - 1)
                {
                    Debug.DrawLine(ExportNavMeshToObj.ToUnityVector(tiledNavMesh.Tiles[i].Verts[j]), ExportNavMeshToObj.ToUnityVector(tiledNavMesh.Tiles[i].Verts[j + 1]), Color.blue, 99);
                }
            }
        }

        navMeshQuery = new NavMeshQuery(tiledNavMesh, 2048);

        //Find random start and end points on the poly mesh

        /*int startRef;
         * navMeshQuery.FindRandomPoint(out startRef, out startPos);*/

        //SVector3 c = new SVector3(10, 0, 0);
        //SVector3 e = new SVector3(5, 5, 5);
        //navMeshQuery.FindNearestPoly(ref c, ref e, out startPt);

        //navMeshQuery.FindRandomPointAroundCircle(ref startPt, 1000, out endPt);

        startPt = navMeshQuery.FindRandomPoint();
        endPt   = navMeshQuery.FindRandomPoint();

        //calculate the overall path, which contains an array of polygon references
        int MAX_POLYS = 256;

        path = new Path();
        navMeshQuery.FindPath(ref startPt, ref endPt, filter, path);

        //find a smooth path over the mesh surface
        int      npolys    = path.Count;
        SVector3 iterPos   = new SVector3();
        SVector3 targetPos = new SVector3();

        navMeshQuery.ClosestPointOnPoly(startPt.Polygon, startPt.Position, ref iterPos);
        navMeshQuery.ClosestPointOnPoly(path[npolys - 1], endPt.Position, ref targetPos);

        smoothPath = new List <SVector3>(2048);
        smoothPath.Add(iterPos);

        float STEP_SIZE = 0.5f;
        float SLOP      = 0.01f;

        while (npolys > 0 && smoothPath.Count < smoothPath.Capacity)
        {
            //find location to steer towards
            SVector3          steerPos     = new SVector3();
            StraightPathFlags steerPosFlag = 0;
            NavPolyId         steerPosRef  = NavPolyId.Null;

            if (!GetSteerTarget(navMeshQuery, iterPos, targetPos, SLOP, path, ref steerPos, ref steerPosFlag, ref steerPosRef))
            {
                break;
            }

            bool endOfPath         = (steerPosFlag & StraightPathFlags.End) != 0 ? true : false;
            bool offMeshConnection = (steerPosFlag & StraightPathFlags.OffMeshConnection) != 0 ? true : false;

            //find movement delta
            SVector3 delta = steerPos - iterPos;
            float    len   = (float)Math.Sqrt(SVector3.Dot(delta, delta));

            //if steer target is at end of path or off-mesh link
            //don't move past location
            if ((endOfPath || offMeshConnection) && len < STEP_SIZE)
            {
                len = 1;
            }
            else
            {
                len = STEP_SIZE / len;
            }

            SVector3 moveTgt = new SVector3();
            VMad(ref moveTgt, iterPos, delta, len);

            //move
            SVector3         result     = new SVector3();
            List <NavPolyId> visited    = new List <NavPolyId>(16);
            NavPoint         startPoint = new NavPoint(path[0], iterPos);
            navMeshQuery.MoveAlongSurface(ref startPoint, ref moveTgt, out result, visited);
            path.FixupCorridor(visited);
            npolys = path.Count;
            float h = 0;
            navMeshQuery.GetPolyHeight(path[0], result, ref h);
            result.Y = h;
            iterPos  = result;

            //handle end of path when close enough
            if (endOfPath && InRange(iterPos, steerPos, SLOP, 1.0f))
            {
                //reached end of path
                iterPos = targetPos;
                if (smoothPath.Count < smoothPath.Capacity)
                {
                    smoothPath.Add(iterPos);
                }
                break;
            }

            //store results
            if (smoothPath.Count < smoothPath.Capacity)
            {
                smoothPath.Add(iterPos);
            }
        }

        for (int i = 0; i < smoothPath.Count; i++)
        {
            if (i < smoothPath.Count - 1)
            {
                Debug.DrawLine(ExportNavMeshToObj.ToUnityVector(smoothPath[i]), ExportNavMeshToObj.ToUnityVector(smoothPath[i + 1]), Color.red, 99);
            }
        }
    }