/// <summary> /// /// </summary> /// <param name="collision"></param> private bool OnTriggerCollide(Collider2D collision) { _untriggeredContacts.Remove(collision); if (_beingDestroyed) { return(true); } var shooter = (instigator as WeaponEquippable)?.shooter; if (shooter == null) { shooter = instigator as ShooterBehaviour; } if (shooter != null) { if (collision.GetComponent <ShooterBehaviour>() == shooter) { return(false); } } var bulletReaction = collision.GetComponent <BulletReaction>(); var tilemapChunk = collision.GetComponent <TilemapChunk>(); if (bulletReaction == null && tilemapChunk == null) { return(false); } var received = false; if (bulletReaction != null) { var bulletResponse = new BulletResponse(this, collision); bulletReaction.SendBulletReceive(bulletResponse); received = bulletResponse.received; } if (tilemapChunk != null) { received = true; } if (received) { _beingDestroyed = true; if (_hitAnimation) { GameplayStatics.SpawnFireAndForgetAnimation(_hitAnimation, transform.position, Quaternion.identity) .AddComponent <TileObjectRenderer>().additive = 12; } Destroy(gameObject); } return(received); }
/// <summary> /// /// </summary> public void BeginDestroy() { if (_isDestroyed) { return; } _isDestroyed = true; this.EmitSound(DestroySoundKey); if (_destroyAnimation != null) { GameplayStatics.SpawnFireAndForgetAnimation(_destroyAnimation, transform.position, transform.rotation) .AddComponent <TileObjectRenderer>(); } GameplayStatics.ScatterSupply(transform, _supplyCost); Destroy(gameObject); }
/// <summary> /// /// </summary> private void Update() { if (_updateCount % frequency == 0) { var index = _updateCount / frequency; if (index >= explosions.Count) { Destroy(gameObject); return; } foreach (var pos in explosions[index]) { GameplayStatics.SpawnFireAndForgetAnimation(explosionAnimation, pos, Quaternion.identity) .GetComponent <SpriteRenderer>().sortingLayerID = SortingLayerHelper.GetSortingLayerValue(StaticSortingLayer.Default); } } ++_updateCount; }
/// <summary> /// /// </summary> /// <returns></returns> private IEnumerator TriggerExplosions() { this.EmitSound(ShipDamageSoundKey); CameraShakeManager.instance.Shake(_lastShipHitGameCameraShake); yield return(new WaitForSeconds(2f)); var halfWidth = GameConstants.SceneWidth / 2.0f; var halfHeight = GameConstants.SceneHeight / 2.0f; var explosionSoundSkip = 0; do { var pos = new Vector2(Random.Range(halfWidth * -1.0f, halfWidth), Random.Range(halfHeight * -1.0f, halfHeight)); var index = Random.Range(0, _endGameExplosionAnimations.Count); GameplayStatics.SpawnFireAndForgetAnimation(_endGameExplosionAnimations[index], pos, Quaternion.identity) .GetComponent <SpriteRenderer>().sortingLayerID = SortingLayerHelper.GetSortingLayerValue(StaticSortingLayer.Default); explosionSoundSkip++; if (explosionSoundSkip > 5) { this.EmitSound(ShipExplosionSoundKey, false); explosionSoundSkip = 0; } CameraShakeManager.instance.Shake(_endGameCameraShake); if (_endGameExplosionRandomIntervalMax > _endGameExplosionIntervalMin) { _endGameExplosionRandomIntervalMin -= _endGameExplosionDecrementValue; _endGameExplosionRandomIntervalMax -= _endGameExplosionDecrementValue; } yield return(new WaitForSeconds(Random.Range(_endGameExplosionRandomIntervalMin, _endGameExplosionRandomIntervalMax))); } while (true); }
/// <summary> /// /// </summary> /// <param name="startPoint"></param> /// <param name="direction"></param> /// <param name="originalShot"></param> private void DoRay(Vector2 startPoint, Vector2 direction, bool originalShot) { var rebounced = false; var raycastHit = Physics2D.Raycast(startPoint, direction, GameConstants.SceneWidth, LayerMask.GetMask(SolidLayerName, CharacterLayerName)); if (raycastHit.collider != null) { var damageComponent = raycastHit.collider.GetComponent <DamageComponent>(); if (damageComponent != null) { var opponent = damageComponent as Character; var takeDamages = opponent == null; if (opponent != null) { if (opponent.GetComponent <InvincilityBuff>() != null) { takeDamages = false; } else { var dashState = opponent.gameplayStateHandler as CharacterGameplayState_Dash; if (dashState != null) { takeDamages = false; if (dashState.isActive) { rebounced = true; var bounceDirection = direction * -1.0f; dashState.dashDeflectAbility.SpawnDeflectAnimation(dashState, opponent.transform); DoRay((Vector2)opponent.transform.position + bounceDirection * (GameConstants.HalfTileSize + 1.0f), bounceDirection, false); } } else { opponent.Push(character.targetOrientation, 2000.0f, 0.1f); takeDamages = true; } } } if (takeDamages) { damageComponent.TakeDamages(new DamageInfo { provider = this, damages = (int)weaponDescriptor.damages, damageType = weaponDescriptor.damageType, }); if (opponent != null && opponent.resources.health <= 0) { SpawnHeadshot(opponent.transform); } } } } this.EmitSound(weaponDescriptor.fireSounds, true); DoKnockbackSequence(); AddHeat(weaponDescriptor.heatPerShot); elapsedSinceLastFire = 0.0f; // Spawn fire effect. if (originalShot && weaponDescriptor.fireEffectPrefab != null) { Instantiate(weaponDescriptor.fireEffectPrefab, startPoint, muzzleTransform.rotation); } if (weaponDescriptor.shotTrailRenderer != null) { var shotTrail = Instantiate(weaponDescriptor.shotTrailRenderer, startPoint, muzzleTransform.rotation); shotTrail.transform.DOMove(raycastHit.point, 0.1f); } if (!rebounced && weaponDescriptor.impactAnimation != null) { GameplayStatics.SpawnFireAndForgetAnimation(weaponDescriptor.impactAnimation, raycastHit.point, Quaternion.identity); } }
/// <summary> /// /// </summary> /// <param name="dashState"></param> /// <param name="transform"></param> public void SpawnDeflectAnimation(CharacterGameplayState_Dash dashState, Transform transform) { dashState.character.EmitSound(DeflectSoundKey); GameplayStatics.SpawnFireAndForgetAnimation(abilityData.deflectAnimation, transform.position, transform.rotation, dashState.character.transform); }
/// <summary> /// /// </summary> private IEnumerator Spawn() { if (!canSpawn) { yield break; } if (_firstSpawn) { _firstSpawn = false; FirstSpawn(); } _playerSpawnParticleSystem.Play(); yield return(new WaitForSeconds(_spawnDelay)); _playerSpawnParticleSystem.Stop(); var animation = GameplayStatics.SpawnFireAndForgetAnimation(_playerSpawnAnimation, transform.position, Quaternion.identity); yield return(new WaitForSeconds(_materializationDelay)); character = Instantiate(_characterPrefab, transform.position + spawnOffset, transform.rotation).GetComponent <Character>(); var hitFlash = character.GetComponent <HitFlash>(); hitFlash?.Flash(1.0f, 0.4f, 1f); var playerParams = GameModeParams.instance.playerParams[playerIndex - 1]; character.GetComponent <GameplayTeam>().teamIndex = teamIndex; character.GetComponent <CharacterResources>().supply = _supply; character.spawner = this; character.characterDescriptor = playerParams.selectedCharacter; character.skinDescriptor = playerParams.selectedSkin; character.name = $"Character_{playerParams.selectedSkin.name}"; character.SetConstructsFromLoadout(playerParams.loadout); character.TryAddBuff <InvincilityBuff>(1.0f); character.SetWeapon(0, _defaultWeapon); character.Orientate(_orientation, _orientation); var playerIdBehaviour = Instantiate(_playerIdSpritePrefab, transform.position + _playerIdSpritePrefab.transform.position, Quaternion.identity, character.transform) .GetComponent <CharacterPlayerIdBehaviour>(); if (playerParams.isAiControlled) { playerIdBehaviour.playerIndex = -1; } else { playerIdBehaviour.playerIndex = playerIndex; } playerIdBehaviour.color = character.characterDescriptor.mainColor; this.EmitSound(PlayerSpawnSoundKey); var additiveArmor = GameMode.instance.highestScore - score; if (additiveArmor > 0) { var powerUp = new ArmorPowerUp(); powerUp.powerUpData = _armorPowerUpData; powerUp.Apply(character, additiveArmor); } GameMode.instance.OnCharacterSpawned(character); if (playerParams.isAiControlled) { var behaviourManager = new GameObject(nameof(AIBehaviourManager)).AddComponent <AIBehaviourManager>(); behaviourManager.gameObject.layer = LayerMask.NameToLayer("CharacterAI"); behaviourManager.GetComponent <AINavigationController>().navMesh = _navMesh; behaviourManager.transform.SetParent(character.transform); } else { var characterInput = character.gameObject.AddComponent <CharacterInput>(); characterInput.userIndex = playerParams.controllerIndex; characterInput.vibrationMultiplier = playerParams.vibrationMultiplier; } }