void CheckAsteroidsCollision() { for (var i = 0; i < _asteroids.Length; i++) { var asteroid1 = _asteroids[i]; if (!asteroid1.Frozen) { for (var j = i + 1; j < _asteroids.Length; j++) { var asteroid2 = _asteroids[j]; if (!asteroid2.Frozen) { if (ISceneObjectInfo.CheckCollision(asteroid1, asteroid2, out var deltaPositionNormalized)) { asteroid1.CollidedWith.Value = asteroid2; asteroid2.CollidedWith.Value = asteroid1; asteroid2.LinearVelocity -= deltaPositionNormalized * asteroid1.Scale.Value * 0.01f; asteroid1.LinearVelocity += deltaPositionNormalized * asteroid2.Scale.Value * 0.01f; } } } if (ISceneObjectInfo.CheckCollision(asteroid1, _shipInfo, out var deltaPositionNormalized2)) { MessageBroker.Default.Publish(SharedMessage.Create(this, SharedMessage.MessageType.SHIP_COLLIDED, asteroid1)); } } } }
void CheckBulletsCollision() { for (var i = 0; i < _asteroids.Length; i++) { var asteroid1 = _asteroids[i]; if (!asteroid1.Frozen) { for (var j = 0; j < _bullets.Count; j++) { var bullet = _bullets[j]; if (ISceneObjectInfo.CheckCollision(asteroid1, bullet, out var deltaPositionNormalized)) { asteroid1.Durability -= _shipInfo.WeaponDamage; if (asteroid1.Durability <= 0f) { MessageBroker.Default.Publish(SharedMessage.Create(this, SharedMessage.MessageType.CREATE_EXPLOSION, asteroid1.Position.Value)); asteroid1.Position.Value = new Vector3(0f, 0f, -2f); } bullet.Position.Value += new Vector3(0f, 0f, 20f); _bullets.Remove(bullet); j--; } } } } }
public static bool CheckCollision(ISceneObjectInfo obj1, ISceneObjectInfo obj2, out Vector3 deltaPositionNormalized) { var deltaPosition = obj1.Position.Value - obj2.Position.Value; var deltaMagnitude = deltaPosition.magnitude; var intersection = obj1.Scale.Value + obj2.Scale.Value - deltaMagnitude; deltaPositionNormalized = deltaPosition.normalized; return(intersection > 0f); }
public void OnCollidedWith(ISceneObjectInfo collider) { if (collider != null) { var deltaPositionNormalized = (collider.Position.Value - Position.Value).normalized; var newLinearVelocity = LinearVelocity - deltaPositionNormalized * collider.Scale.Value * 0.01f; newLinearVelocity.z = Mathf.Min(0f, newLinearVelocity.z); LinearVelocity = newLinearVelocity; } }
void ShipCollided(ISceneObjectInfo collider) { MessageBroker.Default.Publish(SharedMessage.Create(this, SharedMessage.MessageType.CREATE_EXPLOSION, collider.Position.Value)); collider.Position.Value = new Vector3(0f, 0f, -2f); _playerInfo.HitPoints.Value--; if (_playerInfo.HitPoints.Value == 0) { MessageBroker.Default.Publish(SharedMessage.Create(this, SharedMessage.MessageType.GAME_OVER, false)); } }
void ShowBullet(ISceneObjectInfo bullet) { var bulletObject = _bulletPool.Get(null); bulletObject.gameObject.SetActive(true); bullet.Position.ObserveEveryValueChanged(value => value.Value) .Subscribe(value => { bulletObject.position = value; }).AddTo(_disposables); Observable.Timer(System.TimeSpan.FromMilliseconds(3000)) .Subscribe(_ => { bulletObject.gameObject.SetActive(false); _bulletPool.Put(bulletObject); }).AddTo(_disposables); }
void ShowExplosion(ISceneObjectInfo explosion) { var explosionObject = _explosionPool.Get(null); explosionObject.gameObject.SetActive(true); explosion.Position.ObserveEveryValueChanged(value => value.Value) .Subscribe(value => { explosionObject.position = value + Vector3.up; }).AddTo(_disposables); Observable.Timer(System.TimeSpan.FromMilliseconds(500)) .Subscribe(_ => { explosionObject.gameObject.SetActive(false); _explosionPool.Put(explosionObject); }).AddTo(_disposables); }