Esempio n. 1
0
    public BallisticProjectileControlHandler(
        ProjectileController projectileController,
        BallisticTrajectorySettings ballisticTrajectorySettings,
        Vector3?maxVelocity)
        : base(projectileController)
    {
        _ballisticTrajectorySettings = ballisticTrajectorySettings;

        _velocity = DynamicsUtility.GetBallisticVelocity(
            _projectileController.gameObject.transform.position + new Vector3(ballisticTrajectorySettings.EndPosition.x, ballisticTrajectorySettings.EndPosition.y, _projectileController.gameObject.transform.position.z),
            _projectileController.gameObject.transform.position,
            ballisticTrajectorySettings.Angle,
            ballisticTrajectorySettings.ProjectileGravity);

        if (maxVelocity.HasValue)
        {
            if (Mathf.Abs(_velocity.x) > maxVelocity.Value.x)
            {
                _velocity.x = maxVelocity.Value.x * Mathf.Sign(_velocity.x);
            }

            if (Mathf.Abs(_velocity.y) > maxVelocity.Value.y)
            {
                _velocity.y = maxVelocity.Value.y * Mathf.Sign(_velocity.y);
            }
        }
    }
Esempio n. 2
0
    public BarrelMetBarrelThrowControlHandler(
        BarrelMetBarrel enemyController,
        Direction startDirection,
        BallisticTrajectorySettings ballisticTrajectorySettings)
        : base(enemyController, -1f, enemyController.GetComponent <Animator>())
    {
        _moveDirectionFactor = startDirection == Direction.Left
      ? -1f
      : 1f;

        _ballisticTrajectorySettings = ballisticTrajectorySettings;
    }
Esempio n. 3
0
 public BallisticProjectileControlHandler(ProjectileController projectileController, BallisticTrajectorySettings ballisticTrajectorySettings)
     : this(projectileController, ballisticTrajectorySettings, null)
 {
 }
Esempio n. 4
0
 public void TriggerBarrelThrow(BallisticTrajectorySettings ballisticTrajectorySettings, Direction direction)
 {
     PushControlHandlers(
         new BarrelMetBarrelRollControlHandler(this, direction),
         new BarrelMetBarrelThrowControlHandler(this, direction, ballisticTrajectorySettings));
 }
Esempio n. 5
0
    protected override bool DoUpdate()
    {
        if (_playerInSightDuration == 0f || // either we don't see the player
            !_pauseAtEdgeEndTime.HasValue // or we have not reached the edge yet
            )
        {
            // first move in patrolling mode
            MoveHorizontally(ref _moveDirectionFactor, _enemyController.speed, _enemyController.gravity, PlatformEdgeMoveMode.TurnAround, _enemyController.edgeTurnAroundPause);
        }

        Vector3 raycastOrigin;

        raycastOrigin = _moveDirectionFactor > 0f
      ? new Vector3(_enemyController.gameObject.transform.position.x + _boxCollider2D.size.x / 2f, _enemyController.gameObject.transform.position.y)
      : new Vector3(_enemyController.gameObject.transform.position.x - _boxCollider2D.size.x / 2f, _enemyController.gameObject.transform.position.y);

        if (_playerInSightDuration > 0f &&
            _playerInSightDuration > _enemyController.detectPlayerDuration &&
            _pauseAtEdgeEndTime.HasValue)
        {
            // TODO (Roman): shoot, look at hazard spawn manager and copy/paste logic here
            if (_lastShotTime + _enemyController.shootIntervalDuration < Time.time)
            {
                GameObject spawnedProjectile = _objectPoolingManager.GetObject(_enemyController.projectileToSpawn.name);
                spawnedProjectile.transform.position = raycastOrigin;

                ProjectileController projectileController = spawnedProjectile.GetComponent <ProjectileController>();

                Logger.Assert(projectileController != null, "A projectile with ballistic trajectory must have a projectile controller script attached.");

                BallisticTrajectorySettings ballisticTrajectorySettings = new BallisticTrajectorySettings();
                ballisticTrajectorySettings.angle             = 0f; // horizontal launch
                ballisticTrajectorySettings.projectileGravity = -200f;

                ballisticTrajectorySettings.endPosition = new Vector2(
                    GameManager.instance.player.transform.position.x - raycastOrigin.x
                    , Mathf.Min(GameManager.instance.player.transform.position.y - raycastOrigin.y, -1f)
                    );

                Debug.Log("Endpos: " + ballisticTrajectorySettings.endPosition + ", " + (GameManager.instance.player.transform.position.y - raycastOrigin.y));

                projectileController.PushControlHandler(new BallisticProjectileControlHandler(projectileController, ballisticTrajectorySettings, _enemyController.maxVelocity));

                _lastShotTime = Time.time;
            }
        }

        #region now check whether we can see the player
        float startAngleRad = _moveDirectionFactor > 0f
      ? (-90f + _enemyController.scanAngleClipping / 2f) * Mathf.Deg2Rad
      : (-180f + _enemyController.scanAngleClipping / 2f) * Mathf.Deg2Rad;
        float endAngleRad = _moveDirectionFactor > 0f
      ? (0f - _enemyController.scanAngleClipping / 2f) * Mathf.Deg2Rad
      : (-90f - _enemyController.scanAngleClipping / 2f) * Mathf.Deg2Rad;
        float step = (endAngleRad - startAngleRad) / (float)(_enemyController.totalScanRays);

        bool isSeeingPlayer = false;
        for (float theta = endAngleRad; theta > startAngleRad - step / 2; theta -= step)
        {
            Vector2 vector = new Vector2((float)(_enemyController.scanRayLength * Mathf.Cos(theta)), (float)(_enemyController.scanRayLength * Mathf.Sin(theta)));

            RaycastHit2D raycastHit2D = Physics2D.Raycast(raycastOrigin, vector.normalized, vector.magnitude, _enemyController.scanRayCollisionLayers);
            if (raycastHit2D)
            {
                if (raycastHit2D.collider.gameObject.layer == LayerMask.NameToLayer("Player"))
                {
                    _playerInSightDuration += Time.deltaTime;
                    isSeeingPlayer          = true;
                    DrawRay(raycastOrigin, raycastHit2D.point.ToVector3() - _enemyController.gameObject.transform.position, Color.red);
                    break;
                }
                else
                {
                    DrawRay(raycastOrigin, raycastHit2D.point.ToVector3() - _enemyController.gameObject.transform.position, Color.grey);
                }
            }
            else
            {
                DrawRay(raycastOrigin, vector, Color.grey);
            }
        }

        if (!isSeeingPlayer)
        {
            _playerInSightDuration = 0f;
        }
        else
        {
            if (_pauseAtEdgeEndTime.HasValue)
            {
                _pauseAtEdgeEndTime += Time.deltaTime;
            }
        }
        #endregion

        return(true);
    }