public void addPlayerMove(string playerId, PlayerMoveRecord newMove) { if (playerMoves.ContainsKey(playerId)) { playerMoves[playerId].Insert(0, newMove); } else { Debug.Log("no move dict for: " + playerId); } }
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)); } }
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)); } }