void OnCollision(ProjectileManager.Basic projectile, ActorBase other, float damage, Vector3 dir) { if (other.OnPaintballHit()) { if (--projectile.CustomCounter == 0) { projectile.DieOnCollision = true; } } }
public override void Fire(Transform weaponTrans, Vector3 direction, int sortingLayer, out float recoil) { lastFire_ = Time.time; recoil = 0.0f; Color color = new Color(0.8f, 0.6f, 0.1f); Vector3 worldMuzzle = weaponTrans.TransformPoint(Muzzle); worldMuzzle += -direction * 0.2f; // Start a little behind muzzle because its very unfun missing an enemy that is too close GameManager.Instance.MakePoof(worldMuzzle, 1); GameManager.Instance.MakeFlash(worldMuzzle); AudioManager.Instance.PlayClip(AudioManager.Instance.PlayerAudioSource, FireAudio, volumeScale: 0.7f); float spreadFactor = 15f; // Increase this to limit spread (unit circle is moved further away) Vector3 dir = direction * spreadFactor; Vector2 spread = RndUtil.RandomInsideUnitCircle(); dir.x += spread.x; dir.y += spread.y; dir.Normalize(); ProjectileManager.Basic basic = ProjectileManager.Instance.GetProjectile(); basic.SpriteInfo = ProjectileCache.Instance.GetSprite(); basic.Type = ProjectileManager.ProjectileType.HarmsEnemies; basic.Speed = 10.0f + Random.value * 2; basic.Damage = 25.0f; basic.MaxDistance = 12.0f; basic.Radius = 0.3f; basic.DieOnCollision = false; basic.CustomCounter = 1; basic.CustomCollisionResponse = OnCollision; Vector3 scale = basic.SpriteInfo.Transform.localScale; scale.x = 3.0f; scale.y = 3.0f; scale.z = 1.0f; basic.Position = worldMuzzle; basic.SpriteInfo.Renderer.sprite = BulletSprite; basic.SpriteInfo.Renderer.sortingLayerID = sortingLayer; basic.Direction = dir; basic.Color = color; basic.DieTime = 0.0f; basic.SpriteInfo.Transform.localScale = scale; ProjectileManager.Instance.Fire(basic); }
public override void Fire(Transform weaponTrans, Vector3 direction, int sortingLayer, out float recoil) { lastFire_ = Time.time; recoil = 0.2f; Color color = Color.white; Vector3 worldMuzzle = weaponTrans.TransformPoint(Muzzle); GameManager.Instance.MakeFlash(worldMuzzle); AudioManager.Instance.PlayClipWithRandomPitch(AudioManager.Instance.PlayerAudioSource, FireAudio); Vector3 dir = direction.normalized; ProjectileManager.Basic basic = ProjectileManager.Instance.GetProjectile(); basic.SpriteInfo = ProjectileCache.Instance.GetSprite(); basic.Type = ProjectileManager.ProjectileType.HarmsEnemies; basic.Speed = 7.0f; basic.Damage = 2.0f; basic.DamageFalloffDistance = 0.0f; basic.DamageFalloffPerMeter = 0.0f; basic.Force = 1.0f; basic.MaxDistance = 30.0f; basic.Radius = 0.5f; basic.DieOnCollision = false; basic.ReflectOnEdges = true; basic.CollisionSound = AudioManager.Instance.AudioData.Chainsaw; basic.StickySoundRepeater = AudioManager.Instance.RepeatingSawblade; basic.RotationSpeed = 360.0f * 1; basic.RotationSpeedWhenStuck = 360.0f * 6; basic.StickToTarget = true; Vector3 scale = basic.SpriteInfo.Transform.localScale; scale.x = 0.5f; scale.y = 0.5f; scale.z = 1.0f; basic.Position = worldMuzzle; basic.SpriteInfo.Renderer.sprite = BulletSprite; basic.SpriteInfo.Renderer.sortingLayerID = sortingLayer; basic.Direction = dir; basic.Color = color; basic.DieTime = 0.0f; basic.SpriteInfo.Transform.localScale = scale; ProjectileManager.Instance.Fire(basic); }
public override void Fire(Transform weaponTrans, Vector3 direction, int sortingLayer, out float recoil) { lastFire_ = Time.time; recoil = 0.0f; Color color = Color.white; Vector3 worldMuzzle = weaponTrans.TransformPoint(Muzzle); worldMuzzle += -direction * 0.2f; // Start a little behind muzzle because its very unfun missing an enemy that is too close GameManager.Instance.MakePoof(worldMuzzle, 4); GameManager.Instance.MakeFlash(worldMuzzle); AudioManager.Instance.PlayClipWithRandomPitch(AudioManager.Instance.PlayerAudioSource, FireAudio); Vector3 dir = direction.normalized; ProjectileManager.Basic basic = ProjectileManager.Instance.GetProjectile(); basic.SpriteInfo = ProjectileCache.Instance.GetSprite(); basic.Type = ProjectileManager.ProjectileType.HarmsEnemies; basic.Speed = 6.0f; basic.SwayFactor = 0.1f; basic.Damage = 20.0f; basic.DamageFalloffDistance = 0.0f; basic.DamageFalloffPerMeter = 0.0f; basic.MaxDistance = 15.0f; basic.Radius = 1.0f; basic.DieOnCollision = false; basic.CustomCollisionResponse = OnCollision; Vector3 scale = basic.SpriteInfo.Transform.localScale; scale.x = 1.0f * (direction.x < 0 ? -1 : 1); scale.y = 1.0f; scale.z = 1.0f; basic.Position = worldMuzzle; basic.SpriteInfo.Renderer.sprite = BulletSprite; basic.SpriteInfo.Renderer.sortingLayerID = sortingLayer; basic.Direction = dir; basic.Color = color; basic.DieTime = 0.0f; basic.SpriteInfo.Transform.localScale = scale; basic.SpriteInfo.Transform.rotation = Quaternion.identity; ProjectileManager.Instance.Fire(basic); }
void Shoot() { if (Hp <= 0.0f) { return; } Vector2 direction = BlackboardScript.PlayerTrans.position - position_; direction.Normalize(); direction = RndUtil.RandomSpread(direction, 3); Vector3 muzzlePoint = direction * 0.6f; AddForce(-direction * 0.05f); ProjectileManager.Basic basic = ProjectileManager.Instance.GetProjectile(); basic.SpriteInfo = ProjectileCache.Instance.GetSprite(); basic.Type = ProjectileManager.ProjectileType.HarmsPlayer; basic.Speed = 4.0f; basic.Damage = 100.0f; basic.MaxDistance = 15.0f; basic.Radius = 0.3f; Vector3 scale = basic.SpriteInfo.Transform.localScale; scale.x = 3.0f; scale.y = 3.0f; scale.z = 1.0f; basic.Position = transform_.position + muzzlePoint; basic.SpriteInfo.Renderer.sprite = SpriteData.Instance.Bullet; basic.SpriteInfo.Renderer.sortingLayerID = GameManager.Instance.SortLayerTopEffects; basic.Direction = direction; basic.Color = Color.white; basic.DieTime = 0.0f; basic.SpriteInfo.Transform.localScale = scale; float rot_z = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg; basic.SpriteInfo.Transform.rotation = Quaternion.Euler(0f, 0f, rot_z); ProjectileManager.Instance.Fire(basic); AudioManager.Instance.PlayClipWithRandomPitch(AudioManager.Instance.EnemyShootAudioSource, AudioManager.Instance.AudioData.EnemyShoot, 0.5f); }
public override void Fire(Transform weaponTrans, Vector3 direction, int sortingLayer, out float recoil) { lastFire_ = Time.time; recoil = 0.1f; Color color = new Color(0.8f, 0.6f, 0.1f); Vector3 worldMuzzle = weaponTrans.TransformPoint(Muzzle); worldMuzzle += -direction * 0.2f; // Start a little behind muzzle because its very unfun missing an enemy that is too close GameManager.Instance.MakeFlash(worldMuzzle); GameManager.Instance.MakePoof(worldMuzzle, 2); AudioManager.Instance.PlayClipWithRandomPitch(AudioManager.Instance.PlayerAudioSource, FireAudio); ProjectileManager.Basic basic = ProjectileManager.Instance.GetProjectile(); basic.SpriteInfo = ProjectileCache.Instance.GetSprite(); basic.Speed = 100.0f; basic.Damage = 450.0f; basic.MaxDistance = 80.0f; basic.Radius = 0.1f; Vector3 scale = basic.SpriteInfo.Transform.localScale; scale.x = 1.0f; scale.y = 1.0f; scale.z = 1.0f; basic.SpriteInfo.Transform.localScale = scale; basic.Position = worldMuzzle; basic.SpriteInfo.Renderer.sprite = BulletSprite; basic.SpriteInfo.Renderer.sortingLayerID = sortingLayer; basic.Direction = direction; basic.Color = color; basic.DieTime = 0.0f; basic.Type = ProjectileManager.ProjectileType.HarmsNothing; float rot_z = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg; basic.SpriteInfo.Transform.rotation = Quaternion.Euler(0f, 0f, rot_z); ProjectileManager.Instance.Fire(basic); // TODO PE: Spherecast will return sorted list // Sniper immediately hits the full line. Since we sort by distance we have to allow a large number of hits or we might not include closest in match list. float damage = basic.Damage; int count = BlackboardScript.GetEnemies(worldMuzzle, worldMuzzle + direction * 1000, 50); // Copy matches to local array. Sort it by distance. List <BlackboardScript.HitMatch> matches = new List <BlackboardScript.HitMatch>(BlackboardScript.Matches.Take(count)); var ordered = matches.OrderBy(hit => hit.Distance).Take(5).ToList(); for (int i = 0; i < ordered.Count; ++i) { BlackboardScript.HitMatch match = ordered[i]; ActorBase enemy = BlackboardScript.Enemies[match.Idx]; float enemyDamage = Mathf.Min(enemy.Hp, damage); GameManager.Instance.DamageEnemy(enemy, enemyDamage, direction, 1.0f, match.IsHeadshot); damage -= enemyDamage; if (damage <= 0) { break; } } }
void OnCollision(ProjectileManager.Basic projectile, ActorBase other, float damage, Vector3 dir) { other.ApplyDamage(damage, dir, 1.0f, false); }
void OnCollision(ProjectileManager.Basic projectile, ActorBase other, float damage, Vector3 dir) { other.OnLivingBombHit(500.0f); }