コード例 #1
0
    private bool DoFindPath(TileGrid.FindPathArgs args, DiscreteSpeedMoveable discreteMoveable, out MoveablePath pathForSpeed)
    {
        List <DubinCSC> path = null;

        pathForSpeed = null;
        bool pathfound = false;

        if (TileGrid.Instance().FindPath(args, out path))
        {
            pathfound = true;

            pathForSpeed = new MoveablePath()
            {
                path          = path,
                turnRadius    = discreteMoveable.CurrentTurnRadius,
                isReverse     = discreteMoveable.currentSpeed == Speed.Reverse,
                isDirectional = args.IsDirectionalPath,
                moveRateCost  = 1.0f,
                speed         = discreteMoveable.currentSpeed
            };
        }
        ;

        return(pathfound);
    }
コード例 #2
0
    //bool FindPath(Vector3 dest, Vector3 destDir, out MoveablePath bestMoveablePath)
    //{

    //}

    //bool FindPath(Vector3 dest, out MoveablePath bestMoveablePath)
    //{

    //}

    // TODO: These functions are a bit out of place, steps all over other territory.
    // I should probably move'em to a discrete moveable
    bool DoFindBestPath(DiscreteSpeedMoveable discreteMoveable, TileGrid.FindPathArgs args, out MoveablePath bestMoveablePath, bool flipBackAfterReverse)
    {
        bool            pathFound = false;
        List <DubinCSC> path;
        int             bestIndex    = 0;
        float           bestDistance = float.MaxValue;
        List <DubinCSC> bestPath;

        // reverse
        // neutral
        // combat speed
        // full

        // check reverse manually, since it has slightly different Args
        pathFound |= TileGrid.Instance().FindPath(args, out bestPath);
        if (pathFound)
        {
            bestDistance = TotalDistance(bestPath) * discreteMoveable.SpeedCostArray[0];
        }

        // flip the fwd/right args for all forward movement
        if (flipBackAfterReverse)
        {
            args.Fwd   = -args.Fwd;
            args.Right = -args.Right;
        }

        for (int i = 1; i < discreteMoveable.SpeedCostArray.Length; ++i)
        {
            // check next
            args.TurnRadius = discreteMoveable.TurnRadiusArray[i];

            if (TileGrid.Instance().FindPath(args, out path))
            {
                float nextDistance = TotalDistance(path) * discreteMoveable.SpeedCostArray[i];
                if (nextDistance < bestDistance)
                {
                    bestDistance = nextDistance;
                    bestIndex    = i;
                    bestPath     = path;
                }
                pathFound = true;
            }
        }

        bestMoveablePath = new MoveablePath()
        {
            path          = bestPath,
            turnRadius    = discreteMoveable.TurnRadiusArray[bestIndex],
            isReverse     = bestIndex == 0,
            isDirectional = args.IsDirectionalPath,
            moveRateCost  = discreteMoveable.SpeedCostArray[bestIndex],
            speed         = (Speed)bestIndex
        };

        return(pathFound);
    }
コード例 #3
0
    public void Repath()
    {
        if (this.tileMoveable.CurrentPath != null)
        {
            DiscreteSpeedMoveable discreteMoveable = tileMoveable.GetComponent <DiscreteSpeedMoveable>();

            finalPath = null;
            bool bCouldUpdatePath = false;
            bool bNeedRepath      = false;

            if (this.tileMoveable.transform.position == this.transform.position &&
                this.tileMoveable.transform.forward == this.transform.forward &&
                discreteMoveable.currentSpeed == tileMoveable.CurrentPath.speed)
            {
                bNeedRepath = false;
            }
            else
            {
                bNeedRepath = true;
                if (this.tileMoveable.CurrentPath.isDirectional)
                {
                    // Directional search
                    bCouldUpdatePath
                        = FindPathAtCurrentSpeed(this.transform.position, this.tileMoveable.CurrentPath.GetEndDirectionVec3(), out finalPath);
                }
                else
                {
                    // Non-Directional search
                    bCouldUpdatePath
                        = FindPathAtCurrentSpeed(this.transform.position, out finalPath);
                }
            }

            if (bNeedRepath)
            {
                if (!bCouldUpdatePath)
                {
                    SetPositionAndDirection(this.tileMoveable.transform.position, this.tileMoveable.transform.forward);
                }
                else
                {
                    SetPositionAndDirection(this.transform.position, finalPath.GetEndDirectionVec3());
                }
            }

            this.tileMoveable.CurrentPath = finalPath;
            this.UpdatePathLines();
        }
    }
コード例 #4
0
 public void OnPointerClick(PointerEventData eventData)
 {
     if (eventData.pointerId == kLeftMouse &&
         draggingHasOccured == false &&
         tileMoveable != null &&
         finalPath != null)
     {
         RaycastHit hitInfo;
         Ray        ray = Camera.main.ScreenPointToRay(eventData.position);
         if (Physics.Raycast(ray, out hitInfo, 1000.0f, widgetLayer))
         {
             this.tileMoveable.BeginMove();
             finalPath = null;
         }
     }
 }
コード例 #5
0
    bool FindBestPath(Vector3 dest, out MoveablePath bestMoveablePath)
    {
        DiscreteSpeedMoveable discreteMoveable = tileMoveable.GetComponent <DiscreteSpeedMoveable>();

        // Note: We start out testing reverse first, hence the negatives
        var args = new TileGrid.FindPathArgs()
        {
            Fwd         = -tileMoveable.transform.forward,
            Right       = -tileMoveable.transform.right,
            TurnRadius  = discreteMoveable.TurnRadiusArray[0],
            Pos         = tileMoveable.transform.position,
            Dest        = dest,
            BoxCollider = tileMoveable.boxCollider
        };

        return(DoFindBestPath(discreteMoveable, args, out bestMoveablePath, true));
    }
コード例 #6
0
    bool FindPathAtCurrentSpeed(Vector3 dest, out MoveablePath pathForSpeed)
    {
        DiscreteSpeedMoveable discreteMoveable = tileMoveable.GetComponent <DiscreteSpeedMoveable>();

        float dir  = discreteMoveable.currentSpeed == Speed.Reverse ? -1.0f : 1.0f;
        var   args = new TileGrid.FindPathArgs()
        {
            Fwd         = dir * tileMoveable.transform.forward,
            Right       = dir * tileMoveable.transform.right,
            TurnRadius  = discreteMoveable.CurrentTurnRadius,
            Pos         = tileMoveable.transform.position,
            Dest        = dest,
            BoxCollider = tileMoveable.boxCollider,
        };

        return(DoFindPath(args, discreteMoveable, out pathForSpeed));
    }
コード例 #7
0
    bool FindBestPath(Vector3 dest, Vector3 destDir, out MoveablePath bestMoveablePath)
    {
        DiscreteSpeedMoveable discreteMoveable = tileMoveable.GetComponent <DiscreteSpeedMoveable>();

        // Note: For directional paths, we do NOT flip for reverse movement.
        var args = new TileGrid.FindPathArgs()
        {
            Fwd               = -tileMoveable.transform.forward,
            Right             = -tileMoveable.transform.right,
            TurnRadius        = discreteMoveable.TurnRadiusArray[0],
            Pos               = tileMoveable.transform.position,
            Dest              = dest,
            DestDir           = destDir,
            BoxCollider       = tileMoveable.boxCollider,
            IsDirectionalPath = true
        };

        return(DoFindBestPath(discreteMoveable, args, out bestMoveablePath, true));
    }
コード例 #8
0
    bool FindPathAtCurrentSpeed(Vector3 dest, Vector3 destDir, out MoveablePath pathForSpeed)
    {
        DiscreteSpeedMoveable discreteMoveable = tileMoveable.GetComponent <DiscreteSpeedMoveable>();

        float dir = discreteMoveable.currentSpeed == Speed.Reverse ? -1.0f : 1.0f;

        // Note: We start out testing reverse first, hence the negatives
        var args = new TileGrid.FindPathArgs()
        {
            Fwd               = dir * tileMoveable.transform.forward,
            Right             = dir * tileMoveable.transform.right,
            TurnRadius        = discreteMoveable.CurrentTurnRadius,
            Pos               = tileMoveable.transform.position,
            Dest              = dest,
            DestDir           = destDir,
            BoxCollider       = tileMoveable.boxCollider,
            IsDirectionalPath = true
        };

        return(DoFindPath(args, discreteMoveable, out pathForSpeed));
    }