示例#1
0
 public void addPlayerMove(string playerId, PlayerMoveRecord newMove)
 {
     if (playerMoves.ContainsKey(playerId))
     {
         playerMoves[playerId].Insert(0, newMove);
     }
     else
     {
         Debug.Log("no move dict for: " + playerId);
     }
 }
示例#2
0
    public Vector3 LinearTarget(GameObject shooter, string playerId)
    {
        Vector3 predictedPosition;

        if (playerMoves[playerId].Count >= 2)
        {
            var currplayerPositions   = getPlayerPos(playerId);
            PlayerMoveRecord currMove = playerMoves[playerId][0];
            PlayerMoveRecord prevMove = playerMoves[playerId][1];

            Vector3 deltaPosition = currMove.position - prevMove.position;
            float   deltaTime     = currMove.time - prevMove.time;
            Vector3 moveRate      = deltaPosition / deltaTime;

            //get initial guess at time T
            float initialDist = Vector3.Distance(shooter.transform.position, currplayerPositions);
            float initialTime = initialDist / 7;
            float predictedX  = currplayerPositions.x + (moveRate.x * initialTime);
            float predictedZ  = currplayerPositions.z + (moveRate.z * initialTime);

            //get first refined guess
            float predictedDist  = Vector3.Distance(shooter.transform.position, new Vector3(predictedX, currplayerPositions.y, predictedZ));
            float predictedTime  = predictedDist / 7;
            float timeError      = predictedTime - initialTime;
            int   iterationCount = 0;
            //iterate to improve
            while (iterationCount < 10 && timeError > 0.1)
            {
                //re-predict using new time
                predictedX  = currplayerPositions.x + (moveRate.x * predictedTime);
                predictedZ  = currplayerPositions.z + (moveRate.z * predictedTime);
                initialTime = predictedTime;

                //get first refined guess
                predictedDist = Vector3.Distance(shooter.transform.position, new Vector3(predictedX, currplayerPositions.y, predictedZ));
                predictedTime = predictedDist / 7;
                timeError     = predictedTime - initialTime;
                iterationCount++;
            }
            predictedPosition = new Vector3
                                (
                Mathf.Clamp(predictedX, xMin + 2, xMax - 2),
                currplayerPositions.y,
                Mathf.Clamp(predictedZ, zMin + 2, zMax - 2)
                                );
            return(predictedPosition);
        }
        else
        {
            return(HeadOnTarget(shooter, playerId));
        }
    }
示例#3
0
    public Vector3 CircularTarget(GameObject shooter, string playerId)
    {
        Vector3 predictedPosition;

        //need to get delta rotation (x, y or z?) for past time frame
        //so need at least two entries in player move record
        if (playerMoves[playerId].Count >= 2)
        {
            var currplayerPositions   = getPlayerPos(playerId);
            var currPlayerHeading     = getPlayerHeading(playerId);
            PlayerMoveRecord currMove = playerMoves[playerId][0];
            PlayerMoveRecord prevMove = playerMoves[playerId][1];

            var   deltaRotation = Quaternion.FromToRotation(prevMove.velocity, currMove.velocity);
            float deltaTime     = currMove.time - prevMove.time;
            if (deltaRotation.eulerAngles.y <= Mathf.Epsilon)
            {
                return(LinearTarget(shooter, playerId));
            }
            float turnRate = deltaRotation.eulerAngles.y / deltaTime;
            //rotation around the Y axis (up and down) is the 2d facing angle
            //Debug.Log ("Circular: Delta heading:"+deltaRotation.eulerAngles.y+", Delta Time:"+deltaTime+", Turn rate:"+turnRate);

            //get initial guess at time T
            float initialDist = Vector3.Distance(shooter.transform.position, currplayerPositions);
            float initialTime = initialDist / 7;

            float predictedX = currplayerPositions.x - ((3 / turnRate) * (Mathf.Cos(currPlayerHeading - (turnRate * initialTime)) - Mathf.Cos(currPlayerHeading)));
            float predictedZ = currplayerPositions.z - ((3 / turnRate) * (Mathf.Sin(currPlayerHeading - (turnRate * initialTime)) - Mathf.Sin(currPlayerHeading)));
            //get first refined guess
            float predictedDist = Vector3.Distance(shooter.transform.position, new Vector3(predictedX, currplayerPositions.y, predictedZ));
            float predictedTime = predictedDist / 7;
            float timeError     = predictedTime - initialTime;

            int iterationCount = 0;
            //iterate to improve
            while (iterationCount < 10 && timeError > 0.1)
            {
                //re-predict using new time
                predictedX  = currplayerPositions.x - ((3 / turnRate) * (Mathf.Cos(currPlayerHeading - (turnRate * predictedTime)) - Mathf.Cos(currPlayerHeading)));
                predictedZ  = currplayerPositions.z - ((3 / turnRate) * (Mathf.Sin(currPlayerHeading - (turnRate * predictedTime)) - Mathf.Sin(currPlayerHeading)));
                initialTime = predictedTime;
                //get first refined guess
                predictedDist = Vector3.Distance(shooter.transform.position, new Vector3(predictedX, currplayerPositions.y, predictedZ));
                predictedTime = predictedDist / 7;
                timeError     = predictedTime - initialTime;
                iterationCount++;
            }
            predictedPosition = new Vector3
                                (
                Mathf.Clamp(predictedX, xMin + 2, xMax - 2),
                currplayerPositions.y,
                Mathf.Clamp(predictedZ, zMin + 2, zMax - 2)
                                );
            //Debug.Log ("Circularly predicted location:["+predictedPosition.x+","+currplayerPositions.y+","+predictedPosition.z+"], flight time:"+predictedTime);
            return(predictedPosition);
        }
        else
        {
            return(HeadOnTarget(shooter, playerId));
        }
    }