コード例 #1
0
ファイル: AIKiril.cs プロジェクト: Woewal/ElectiveDevelopment
 //Shooting States
 private void ShootClosestTarget(RobotControls controls)
 {
     StopMovement(controls);
     currentTarget = _closestEnemy;
     _ShootVector  = TargetPrediction(currentTarget, controls);
     _canShoot     = true;
 }
コード例 #2
0
ファイル: AIKiril.cs プロジェクト: Woewal/ElectiveDevelopment
    private void HideBehindTeammate(RobotControls controls)
    {
        Vector3 hidingDir = _closestTeammate.currentPosition - _closestEnemy.currentPosition;

        _MoveVector = hidingDir.normalized * 2 + _closestTeammate.currentPosition;
        _canMove    = true;
    }
コード例 #3
0
 void SetVisibleRobots(RobotControls controls)
 {
     CheckForVisibility(controls);
     UpdateClosestEnemy(controls);
     UpdateClosestTeammate(controls);
     _allVisibleRobots = visibleTeamMates.Concat(visibleEnemies).ToList();
 }
コード例 #4
0
ファイル: AIKiril.cs プロジェクト: Woewal/ElectiveDevelopment
 private void ShootBallOwner(RobotControls controls)
 {
     StopMovement(controls);
     currentTarget = _ballOwner;
     _ShootVector  = TargetPrediction(currentTarget, controls);
     _canShoot     = true;
 }
コード例 #5
0
    void CheckWhichTeamHasBall(RobotControls controls)
    {
        var allVisibleRobots = visibleTeamMates.Concat(visibleEnemies);

        foreach (var robot in allVisibleRobots)
        {
            if (robot.currentPosition.x == _ball.x && robot.currentPosition.z == _ball.z)
            {
                if (robot.team == controls.myself.team)
                {
                    _teammateHasBall = true;
                    _enemyHasBall    = false;
                    if (robot.id == controls.myself.id)
                    {
                        _hasBall = true;
                    }
                    else
                    {
                        _hasBall = false;
                    }
                }
                else
                {
                    _teammateHasBall = false;
                    _enemyHasBall    = true;
                    _hasBall         = false;
                }
            }
        }
    }
コード例 #6
0
ファイル: AIKiril.cs プロジェクト: Woewal/ElectiveDevelopment
    private void CoverTeammate(RobotControls controls, SubjectiveRobot teammate)
    {
        Vector3 reltiveEnemyDir = _closestEnemy.currentPosition - teammate.currentPosition;

        _MoveVector = reltiveEnemyDir.normalized * 2 + teammate.currentPosition;
        _canMove    = true;
    }
コード例 #7
0
 public override void UpdateMovement(RobotControls controls)
 {
     if (controls.myself.currentHealth < 50 && _noclosestHealth == false)
     {
         controls.goTo(_closestHealth.currentPickupPosition);
     }
     else
     {
         if (Vector3.Distance(controls.myself.currentPosition, controls.updateBall) < 2f)
         {
             if (_noclosestPickup == false)
             {
                 controls.goTo(_closestPickup.currentPickupPosition);
             }
             else
             {
                 controls.goTo(_closestTeammate.currentPosition);
             }
         }
         else
         {
             controls.goTo(controls.updateBall);
         }
     }
 }
コード例 #8
0
    public override void UpdateAttack(RobotControls controls)
    {
        if (_hasBall)
        {
            return;
        }

        _currentCooldown += Time.deltaTime;

        if (_currentCooldown < _cooldown)
        {
            return;
        }

        var _relativeDistance = _closestEnemy.currentPosition - controls.myself.currentPosition;

        if (_relativeDistance.magnitude > 3)
        {
            return;
        }

        Attack(_closestEnemy, controls);

        _currentCooldown = 0;
    }
コード例 #9
0
ファイル: AIKiril.cs プロジェクト: Woewal/ElectiveDevelopment
    /// <summary>
    /// This method calculates  Vector3 where projectile should be launced in order to hit the intended target;
    /// </summary>
    private Vector3 TargetPrediction(SubjectiveRobot target, RobotControls controls)
    {
        float coolDown    = 0.5f;
        float coolDownVar = coolDown;

        Vector3 predictionPoint;

        Vector3 startPoint = target.currentPosition;

        if (coolDownVar > 0)
        {
            coolDown -= Time.deltaTime;
            return(new Vector3(0, 0, 0));
        }
        else
        {
            Vector3 endPoint             = target.currentPosition;
            Vector3 targetMovementVector = endPoint - startPoint;
            targetSpeed = targetMovementVector.magnitude / coolDown;
            Vector3 distanceVector = endPoint - controls.myself.currentPosition;
            float   distance       = distanceVector.magnitude;
            float   projection     = Vector3.Project(targetMovementVector, distanceVector).magnitude;
            float   timeToReach;
            timeToReach = (float)Math.Sqrt((Math.Pow(distance + projection, 2) + (Math.Pow(targetSpeed, 2) - Math.Pow(projection, 2))) / Math.Pow(projectileSpeed, 2));

            predictionPoint = targetMovementVector / (coolDown * timeToReach);
            return(new Vector3(predictionPoint.x, controls.myself.currentPosition.y, predictionPoint.z));
        }
    }
コード例 #10
0
ファイル: AIKiril.cs プロジェクト: Woewal/ElectiveDevelopment
 public override void UpdateBallPass(RobotControls controls)
 {
     if (_canPassBall)
     {
         controls.passBall(_PassBallVector);
         _canPassBall = false;
     }
 }
コード例 #11
0
ファイル: AIKiril.cs プロジェクト: Woewal/ElectiveDevelopment
 public override void UpdateAttack(RobotControls controls)
 {
     if (_canShoot)
     {
         controls.attack(_ShootVector);
         _canShoot = false;
     }
 }
コード例 #12
0
ファイル: AIKiril.cs プロジェクト: Woewal/ElectiveDevelopment
    private void GoFromRobot(RobotControls controls, SubjectiveRobot robot)
    {
        Vector3 moveDir = controls.myself.currentPosition - robot.currentPosition;

        //_MoveVector = moveDir.normalized + controls.myself.currentPosition;
        _MoveVector = moveDir;
        _canMove    = true;
    }
コード例 #13
0
ファイル: AIKiril.cs プロジェクト: Woewal/ElectiveDevelopment
 public override void UpdateMovement(RobotControls controls)
 {
     if (_canMove)
     {
         controls.goTo(_MoveVector);
         _canMove = false;
     }
 }
コード例 #14
0
ファイル: AIKiril.cs プロジェクト: Woewal/ElectiveDevelopment
 public override void UpdateData(RobotControls controls)
 {
     CheckForVisibility(controls);
     UpdateClosestEnemy(controls);
     UpdateClosestTeammate(controls);
     CheckPickups(controls);
     CheckBallOwnership(controls);
     UpdateBehaviour(controls);
 }
コード例 #15
0
ファイル: AIKiril.cs プロジェクト: Woewal/ElectiveDevelopment
 private void KillBallOwner(RobotControls controls)
 {
     CheckForVisibility(controls);
     UpdateClosestEnemy(controls);
     UpdateClosestTeammate(controls);
     if (controls.reload < 0.3)
     {
         ShootBallOwner(controls);
     }
 }
コード例 #16
0
    public void TragectoryPrediction(RobotControls controls, SubjectiveRobot?target)
    {
        if (target != null && target.Value.isSeen)
        {
            float tTimeElapsed = 0;
            float pSpeed       = 10;
            float tSpeed       = 0;
            float pRatio       = 0;
            float tRatio       = 0;
            float tPosX        = 0;

            Vector3 tPosA             = Vector3.zero;
            Vector3 tPosB             = Vector3.zero;
            Vector3 tPos              = Vector3.zero;
            Vector3 tDistanceTraveled = Vector3.zero;
            Vector3 tmDistance        = Vector3.zero;

            if (controls.reload <= .5)
            {
                if (tTimeElapsed == 0)
                {
                    tPosA = target.Value.currentPosition;
                    Debug.Log("tPosA: " + tPosA);
                    tTimeElapsed += Time.deltaTime;
                }
                else if (tTimeElapsed > 0 && tTimeElapsed < .5)
                {
                    tTimeElapsed += Time.deltaTime;
                    Debug.Log("tTimeElapsed: " + tTimeElapsed);
                }
                else if (tTimeElapsed >= .5)
                {
                    tTimeElapsed = 0;
                    tPosB        = target.Value.currentPosition;
                    Debug.Log("tPosB: " + tPosB);
                    tDistanceTraveled = tPosB - tPosA;
                    Debug.Log("tDistanceTraveled: " + tDistanceTraveled);
                    tmDistance = tPosB - controls.myself.currentPosition;
                    tSpeed     = tDistanceTraveled.magnitude / tTimeElapsed;

                    pRatio = pSpeed / tSpeed;
                    Debug.Log("tSpeed: " + tSpeed);
                    tRatio = tSpeed / pSpeed;
                    Debug.Log("pSpeed: " + pSpeed);
                    tPosX = (-pRatio + Mathf.Sqrt(pRatio * pRatio - 4 * tRatio * tmDistance.magnitude)) / 2 * tRatio;
                    Debug.Log("tPosX: " + tPosX);
                    tPos = new Vector3(Mathf.Abs(tPosX), 2 * controls.myself.currentPosition.y, Mathf.Abs(tPosX * pRatio));
                }
                Debug.Log("tPos: " + tPos);
                // controls.attack(tPos);
                controls.attack(target.Value.currentPosition);
            }
        }
    }
コード例 #17
0
ファイル: AIKiril.cs プロジェクト: Woewal/ElectiveDevelopment
    //Checks who owns the ball
    private void CheckBallOwnership(RobotControls controls)
    {
        _currentBallPosition = controls.updateBall;
        _iHaveBall           = false;
        _ballCaptured        = false;
        _ballOwnerUnknown    = false;

        foreach (SubjectiveRobot robot in controls.archiveRobots)
        {
            if (robot.team == controls.myself.team)
            {
                if (Vector3.Distance(robot.currentPosition, _currentBallPosition) < 1.3f)
                {
                    _ballCaptured        = true;
                    _ballOwner           = robot;
                    _enemyTeamHasTheBall = false;
                    if (robot.id == controls.myself.id)
                    {
                        Debug.Log("I Have the ball");
                        _iHaveBall = true;
                    }
                    else
                    {
                        Debug.Log($"My teammate, {_ballOwner} has the ball");
                        _iHaveBall = false;
                    }
                }
            }
            else
            {
                if (robot.isSeen)
                {
                    if (Vector3.Distance(robot.currentPosition, _currentBallPosition) < 1.3f)
                    {
                        _ballCaptured        = true;
                        _ballOwner           = robot;
                        _enemyTeamHasTheBall = true;
                        Debug.Log($"My enemy, {_ballOwner} has the ball");
                    }
                }
                else
                {
                    if (_currentBallPosition != _lastBallPosition)
                    {
                        _ballCaptured        = true;
                        _enemyTeamHasTheBall = true;
                        _ballOwnerUnknown    = true;
                        Debug.Log($"Unknown enemy has the ball");
                    }
                }
            }
        }
        _lastBallPosition = _currentBallPosition;
    }
コード例 #18
0
 public override void UpdateBallPass(RobotControls controls)
 {
     if (controls.myself.currentHealth < 40 && Vector3.Distance(controls.myself.currentPosition, controls.updateBall) < 1.5f)
     {
         controls.passBall(_closestTeammate.currentPosition);
     }
     else
     {
         return;
     }
 }
コード例 #19
0
 public override void UpdateMovement(RobotControls controls)
 {
     if (_hasBall)
     {
         var relativeDistance = _closestEnemy.currentPosition - controls.myself.currentPosition;
         controls.goTo(controls.myself.currentPosition - relativeDistance);
     }
     else
     {
         controls.goTo(_ball);
     }
 }
コード例 #20
0
    public override void UpdateBallPass(RobotControls controls)
    {
        if (!_hasBall)
        {
            return;
        }

        if (controls.myself.currentHealth < 30)
        {
            controls.passBall(_closestTeammate.currentPosition);
        }
    }
コード例 #21
0
    public SubjectiveRobot?GetSeenRobotTarget(RobotControls controls, Vector3 startPos, bool alliesOpponents, bool closestFurthest)
    {
        SubjectiveRobot?target      = null;
        float           minDistance = Mathf.Infinity;
        float           maxDistance = 0;

        if (controls.archiveRobots.Count > 1)
        {
            foreach (SubjectiveRobot robot in controls.archiveRobots)
            {
                Vector3 diff        = robot.currentPosition - startPos;
                float   curDistance = diff.sqrMagnitude;
                if (robot.isSeen && robot.id != controls.myself.id)
                {
                    if (alliesOpponents && robot.team == controls.myself.team)
                    {
                        if (closestFurthest && curDistance < minDistance)
                        {
                            target      = robot;
                            minDistance = curDistance;
                        }
                        if (!closestFurthest && curDistance > maxDistance)
                        {
                            target      = robot;
                            maxDistance = curDistance;
                        }
                    }
                    if (!alliesOpponents && robot.team != controls.myself.team)
                    {
                        if (closestFurthest && curDistance < minDistance)
                        {
                            target      = robot;
                            minDistance = curDistance;
                        }
                        if (!closestFurthest && curDistance > maxDistance)
                        {
                            target      = robot;
                            maxDistance = curDistance;
                        }
                    }
                }
            }
        }
        if (target != null)
        {
            return(target.Value);
        }
        else
        {
            return(null);
        }
    }
コード例 #22
0
    protected void UpdateClosestPickup(RobotControls controls)
    {
        SubjectivePickup?closestPickup;
        SubjectivePickup?closestHealth;

        closestPickup = null;
        closestHealth = null;
        float distanceMin = 1000f;

        if (controls.updatePickup.Count > 0)
        {
            foreach (SubjectivePickup pickup in controls.updatePickup)
            {
                if (pickup.ofType == "Health")
                {
                    if (Vector3.Distance(pickup.currentPickupPosition, controls.myself.currentPosition) < distanceMin)
                    {
                        distanceMin   = Vector3.Distance(pickup.currentPickupPosition, controls.myself.currentPosition);
                        closestHealth = pickup;
                    }
                }
                else
                {
                    if (Vector3.Distance(pickup.currentPickupPosition, controls.myself.currentPosition) < distanceMin)
                    {
                        distanceMin   = Vector3.Distance(pickup.currentPickupPosition, controls.myself.currentPosition);
                        closestPickup = pickup;
                    }
                }
            }
        }

        if (closestHealth.HasValue)
        {
            _closestHealth   = closestHealth.Value;
            _noclosestHealth = false;
        }
        else
        {
            _noclosestHealth = true;
        }

        if (closestPickup.HasValue)
        {
            _closestPickup   = closestPickup.Value;
            _noclosestPickup = false;
        }
        else
        {
            _noclosestPickup = true;
        }
    }
コード例 #23
0
ファイル: AIKiril.cs プロジェクト: Woewal/ElectiveDevelopment
 private void KillClosestEnemy(RobotControls controls)
 {
     CheckForVisibility(controls);
     UpdateClosestEnemy(controls);
     UpdateClosestTeammate(controls);
     if (visibleEnemies.Count > 0)
     {
         if (controls.reload <= 0.3)
         {
             ShootClosestTarget(controls);
         }
     }
 }
コード例 #24
0
ファイル: AIKiril.cs プロジェクト: Woewal/ElectiveDevelopment
 private void ApproachOwner(RobotControls controls)
 {
     CheckForVisibility(controls);
     UpdateClosestEnemy(controls);
     UpdateClosestTeammate(controls);
     if (Vector3.Distance(controls.myself.currentPosition, _ballOwner.currentPosition) > 4f)
     {
         GoForRobot(controls, _ballOwner);
     }
     else
     {
         StopMovement(controls);
     }
 }
コード例 #25
0
ファイル: AIKiril.cs プロジェクト: Woewal/ElectiveDevelopment
 private void SpeedOrBall(RobotControls controls)
 {
     CheckForVisibility(controls);
     UpdateClosestEnemy(controls);
     UpdateClosestTeammate(controls);
     if (_closestSpeed != null)
     {
         if (Vector3.Distance(controls.myself.currentPosition, _closestSpeed) < (Vector3.Distance(controls.myself.currentPosition, controls.updateBall) / 3f) && !_haveSpeed)
         {
             GoForSpeed(controls);
         }
         else
         {
             GoForBall(controls);
         }
     }
 }
コード例 #26
0
ファイル: AIKiril.cs プロジェクト: Woewal/ElectiveDevelopment
 private void GoForHealth(RobotControls controls)
 {
     _MoveVector = _closestHealth;
     _canMove    = true;
     if (Vector3.Distance(_closestHealth, controls.myself.currentPosition) > 3)
     {
         foreach (SubjectivePickup pickup in controls.updatePickup)
         {
             if (pickup.currentPickupPosition == _closestHealth)
             {
                 if (Vector3.Distance(_closestHealth, controls.myself.currentPosition) < 0.25f)
                 {
                     _recentlyHealed = true;
                 }
             }
         }
     }
 }
コード例 #27
0
ファイル: AIKiril.cs プロジェクト: Woewal/ElectiveDevelopment
 private void GoForInvuln(RobotControls controls)
 {
     _MoveVector = _closestInvuln;
     _canMove    = true;
     if (Vector3.Distance(_closestInvuln, controls.myself.currentPosition) > 3)
     {
         foreach (SubjectivePickup pickup in controls.updatePickup)
         {
             if (pickup.currentPickupPosition == _closestInvuln)
             {
                 if (Vector3.Distance(_closestInvuln, controls.myself.currentPosition) < 0.25f)
                 {
                     _haveInvuln = true;
                 }
             }
         }
     }
 }
コード例 #28
0
ファイル: AIKiril.cs プロジェクト: Woewal/ElectiveDevelopment
 private void ProtectOrApproach(RobotControls controls)
 {
     CheckForVisibility(controls);
     UpdateClosestEnemy(controls);
     UpdateClosestTeammate(controls);
     if (visibleEnemies.Count > 0)
     {
         CoverTeammate(controls, _ballOwner);
     }
     else
     {
         if (Vector3.Distance(controls.myself.currentPosition, _ballOwner.currentPosition) < 3)
         {
             GoForRobot(controls, _ballOwner);
         }
         else
         {
             StopMovement(controls);
         }
     }
 }
コード例 #29
0
    public SubjectivePickup?GetClosestPowerup(RobotControls controls, Vector3 startPos)
    {
        SubjectivePickup?powerupTarget = null;
        float            minDistance   = Mathf.Infinity;

        if (controls.updatePickup.Count > 0)
        {
            foreach (SubjectivePickup pickup in controls.updatePickup)
            {
                Vector3 diff        = pickup.currentPickupPosition - startPos;
                float   curDistance = diff.sqrMagnitude;
                if (curDistance < minDistance)
                {
                    powerupTarget = pickup;
                    minDistance   = curDistance;
                }
                if (pickup.currentPickupPosition != powerupPos1 && pickup.currentPickupPosition != powerupPos2 &&
                    pickup.currentPickupPosition != powerupPos3 && pickup.currentPickupPosition != powerupPos4)
                {
                    if (powerupPos1 == Vector3.zero)
                    {
                        powerupPos1 = pickup.currentPickupPosition;
                    }
                    else if (powerupPos2 == Vector3.zero)
                    {
                        powerupPos2 = pickup.currentPickupPosition;
                    }
                    else if (powerupPos3 == Vector3.zero)
                    {
                        powerupPos3 = pickup.currentPickupPosition;
                    }
                    else if (powerupPos4 == Vector3.zero)
                    {
                        powerupPos4 = pickup.currentPickupPosition;
                    }
                }
            }
        }
        return(powerupTarget);
    }
コード例 #30
0
 public override void UpdateAttack(RobotControls controls)
 {
     if (_noClosestEnemy == false)
     {
         Cooldowntime -= Time.deltaTime;
         if (Cooldowntime > Cooldown)
         {
             return;
         }
         var EnemyDistance = _closestEnemy.currentPosition - controls.myself.currentPosition;
         if (EnemyDistance.magnitude > 5)
         {
             return;
         }
         controls.attack(_closestEnemy.currentPosition);
         Cooldowntime = 0.5f;
     }
     else
     {
         return;
     }
 }