Пример #1
0
        public void OnSystemUpdate(float dt)
        {
            if (_nodeList == null)
            {
                _nodeList = EntityController.GetNodeList <PathfindMoverNode>();
            }
            if (_nodeList == null || Game.Paused)
            {
                return;
            }
            for (int i = 0; i < _nodeList.Count; i++)
            {
                var node       = _nodeList[i];
                var pathfinder = node.Pathfinder.c;
                if (node.Debugging.c != null)
                {
                    node.Debugging.c.UpdateStatus(pathfinder);
                }
                if (!node.Target.c.IsValid)
                {
                    node.Pathfinder.c.ReachedDestination();
                    continue;
                }
                var currentMoveTarget = node.Target.c.GetTargetPosition.toPoint3();
                if (pathfinder.End != currentMoveTarget)
                {
                    pathfinder.SetEnd(currentMoveTarget);
                    continue;
                }
                switch (pathfinder.CurrentStatus)
                {
                case SimplePathfindingAgent.Status.NoPath:
                    if (pathfinder.Redirected && pathfinder.CanRepath)
                    {
                        pathfinder.SearchPath();
                    }
                    continue;

                case SimplePathfindingAgent.Status.InvalidPath:
                case SimplePathfindingAgent.Status.Created:
                case SimplePathfindingAgent.Status.WaitingOnPath:
                    continue;

                case SimplePathfindingAgent.Status.PathReceived:
                case SimplePathfindingAgent.Status.WaitingOnNode:
                    if (pathfinder.CurrentStatus == SimplePathfindingAgent.Status.PathReceived)
                    {
                        if (node.Debugging.c != null)
                        {
                            node.Debugging.c.SetPath(pathfinder.CurrentNodePath);
                        }
                        _grid.SetStationaryAgent(pathfinder.CurrentPos, pathfinder.Entity, false);
                    }
                    if (!node.Pathfinder.c.TryEnterNextNode())
                    {
                        continue;
                    }
                    break;
                }
                var moveSpeed = node.GetMoveSpeed;
                if (pathfinder.IsLastIndex)
                {
                    moveSpeed *= 0.5f;
                }
                pathfinder.MovementLerp += dt * moveSpeed;
                float dst      = pathfinder.GetCurrentDistance();
                float progress = Mathf.Clamp01(pathfinder.MovementLerp / dst);
                node.Entity.Tr.position = Vector3.Lerp(pathfinder.PreviousTarget, pathfinder.CurrentTarget, progress);
                var dir          = pathfinder.CurrentTarget - pathfinder.PreviousTarget;
                var nextRotation = dir != Vector3.zero ? Quaternion.LookRotation(dir, Vector3.up) : pathfinder.Entity.Tr.rotation;
                pathfinder.Entity.Tr.rotation = Quaternion.RotateTowards(pathfinder.Entity.Tr.rotation, nextRotation, _pathfinderRotationSpeed * dt);
                if (progress < 1)
                {
                    continue;
                }
                _grid.Exit(node.Entity, pathfinder.GridTarget);
                pathfinder.CurrentPos = pathfinder.GridTarget;
                if (pathfinder.CurrentIndex >= pathfinder.CurrentNodePath.Count - 1)
                {
                    node.Pathfinder.c.ReachedDestination();
                    node.Target.c.Clear();
                    if (node.Debugging.c != null)
                    {
                        node.Debugging.c.ClearPath();
                    }
                    continue;
                }
                pathfinder.AdvancePath();
                if (pathfinder.CanRepath)
                {
                    pathfinder.SearchPath();
                    continue;
                }
                pathfinder.TryEnterNextNode();
            }
        }