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); } } }
public BarrelMetBarrelThrowControlHandler( BarrelMetBarrel enemyController, Direction startDirection, BallisticTrajectorySettings ballisticTrajectorySettings) : base(enemyController, -1f, enemyController.GetComponent <Animator>()) { _moveDirectionFactor = startDirection == Direction.Left ? -1f : 1f; _ballisticTrajectorySettings = ballisticTrajectorySettings; }
public BallisticProjectileControlHandler(ProjectileController projectileController, BallisticTrajectorySettings ballisticTrajectorySettings) : this(projectileController, ballisticTrajectorySettings, null) { }
public void TriggerBarrelThrow(BallisticTrajectorySettings ballisticTrajectorySettings, Direction direction) { PushControlHandlers( new BarrelMetBarrelRollControlHandler(this, direction), new BarrelMetBarrelThrowControlHandler(this, direction, ballisticTrajectorySettings)); }
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); }