Initial Commit

This commit is contained in:
2026-03-16 14:38:46 +02:00
commit b8f7327a21
2327 changed files with 253610 additions and 0 deletions
@@ -0,0 +1,41 @@
using System;
using UnityEngine;
namespace Zenject.SpaceFighter
{
public class PlayerDamageHandler
{
readonly AudioPlayer _audioPlayer;
readonly Settings _settings;
readonly Player _player;
public PlayerDamageHandler(
Player player,
Settings settings,
AudioPlayer audioPlayer)
{
_audioPlayer = audioPlayer;
_settings = settings;
_player = player;
}
public void TakeDamage(Vector3 moveDirection)
{
_audioPlayer.Play(_settings.HitSound, _settings.HitSoundVolume);
_player.AddForce(-moveDirection * _settings.HitForce);
_player.TakeDamage(_settings.HealthLoss);
}
[Serializable]
public class Settings
{
public float HealthLoss;
public float HitForce;
public AudioClip HitSound;
public float HitSoundVolume = 1.0f;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: b6cd15ebe0f3c3243af6b6a44d7f2ded
timeCreated: 1484757106
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,32 @@
using UnityEngine;
namespace Zenject.SpaceFighter
{
public class PlayerDirectionHandler : ITickable
{
readonly Player _player;
readonly Camera _mainCamera;
public PlayerDirectionHandler(
Camera mainCamera,
Player player)
{
_player = player;
_mainCamera = mainCamera;
}
public void Tick()
{
var mouseRay = _mainCamera.ScreenPointToRay(Input.mousePosition);
var mousePos = mouseRay.origin;
mousePos.z = 0;
var goalDir = mousePos - _player.Position;
goalDir.z = 0;
goalDir.Normalize();
_player.Rotation = Quaternion.LookRotation(goalDir) * Quaternion.AngleAxis(90, Vector3.up);
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: a99d48a043510d549a4f7078a8653233
timeCreated: 1456592909
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,37 @@
using UnityEngine;
namespace Zenject.SpaceFighter
{
public class PlayerFacade : MonoBehaviour
{
Player _model;
PlayerDamageHandler _hitHandler;
[Inject]
public void Construct(Player player, PlayerDamageHandler hitHandler)
{
_model = player;
_hitHandler = hitHandler;
}
public bool IsDead
{
get { return _model.IsDead; }
}
public Vector3 Position
{
get { return _model.Position; }
}
public Quaternion Rotation
{
get { return _model.Rotation; }
}
public void TakeDamage(Vector3 moveDirection)
{
_hitHandler.TakeDamage(moveDirection);
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 2db4310dd7706af419ae62fb99fac156
timeCreated: 1456415473
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,81 @@
using ModestTree;
using UnityEngine;
#pragma warning disable 649
namespace Zenject.SpaceFighter
{
public class PlayerGui : MonoBehaviour
{
[SerializeField]
float _leftPadding;
[SerializeField]
float _bottomPadding;
[SerializeField]
float _labelWidth;
[SerializeField]
float _labelHeight;
[SerializeField]
float _textureWidth;
[SerializeField]
float _textureHeight;
[SerializeField]
float _killCountOffset;
[SerializeField]
Color _foregroundColor;
[SerializeField]
Color _backgroundColor;
Player _player;
Texture2D _textureForeground;
Texture2D _textureBackground;
int _killCount;
[Inject]
public void Construct(Player player, SignalBus signalBus)
{
_player = player;
_textureForeground = CreateColorTexture(_foregroundColor);
_textureBackground = CreateColorTexture(_backgroundColor);
signalBus.Subscribe<EnemyKilledSignal>(OnEnemyKilled);
}
void OnEnemyKilled()
{
_killCount++;
}
Texture2D CreateColorTexture(Color color)
{
var texture = new Texture2D(1, 1);
texture.SetPixel(1, 1, color);
texture.Apply();
return texture;
}
public void OnGUI()
{
var healthLabelBounds = new Rect(_leftPadding, Screen.height - _bottomPadding, _labelWidth, _labelHeight);
GUI.Label(healthLabelBounds, "Health: {0:0}".Fmt(_player.Health));
var killLabelBounds = new Rect(healthLabelBounds.xMin, healthLabelBounds.yMin - _killCountOffset, _labelWidth, _labelHeight);
GUI.Label(killLabelBounds, "Kill Count: {0}".Fmt(_killCount));
var boundsBackground = new Rect(healthLabelBounds.xMax, healthLabelBounds.yMin, _textureWidth, _textureHeight);
GUI.DrawTexture(boundsBackground, _textureBackground);
var boundsForeground = new Rect(boundsBackground.xMin, boundsBackground.yMin, (_player.Health / 100.0f) * _textureWidth, _textureHeight);
GUI.DrawTexture(boundsForeground, _textureForeground);
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 301188284719932429bd73b2047b328d
timeCreated: 1456681654
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,57 @@
using System;
using UnityEngine;
namespace Zenject.SpaceFighter
{
public class PlayerHealthWatcher : ITickable
{
readonly SignalBus _signalBus;
readonly AudioPlayer _audioPlayer;
readonly Settings _settings;
readonly Explosion.Factory _explosionFactory;
readonly Player _player;
public PlayerHealthWatcher(
Player player,
Explosion.Factory explosionFactory,
Settings settings,
AudioPlayer audioPlayer,
SignalBus signalBus)
{
_signalBus = signalBus;
_audioPlayer = audioPlayer;
_settings = settings;
_explosionFactory = explosionFactory;
_player = player;
}
public void Tick()
{
if (_player.Health <= 0 && !_player.IsDead)
{
Die();
}
}
void Die()
{
_player.IsDead = true;
var explosion = _explosionFactory.Create();
explosion.transform.position = _player.Position;
_player.Renderer.enabled = false;
_signalBus.Fire<PlayerDiedSignal>();
_audioPlayer.Play(_settings.DeathSound, _settings.DeathSoundVolume);
}
[Serializable]
public class Settings
{
public AudioClip DeathSound;
public float DeathSoundVolume = 1.0f;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: ff82b5e08504b89408eddc95e9dad280
timeCreated: 1456681376
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,24 @@
using UnityEngine;
namespace Zenject.SpaceFighter
{
public class PlayerInputHandler : ITickable
{
readonly PlayerInputState _inputState;
public PlayerInputHandler(PlayerInputState inputState)
{
_inputState = inputState;
}
public void Tick()
{
_inputState.IsMovingLeft = Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A);
_inputState.IsMovingRight = Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D);
_inputState.IsMovingUp = Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W);
_inputState.IsMovingDown = Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S);
_inputState.IsFiring = Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0);
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 5b062bb00fc459540964842bdf1068a9
timeCreated: 1456417258
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,35 @@
namespace Zenject.SpaceFighter
{
public class PlayerInputState
{
public bool IsMovingLeft
{
get;
set;
}
public bool IsMovingRight
{
get;
set;
}
public bool IsMovingUp
{
get;
set;
}
public bool IsMovingDown
{
get;
set;
}
public bool IsFiring
{
get;
set;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 9f9f53db91ff64e40af5b30b70927e13
timeCreated: 1484693045
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,67 @@
using UnityEngine;
namespace Zenject.SpaceFighter
{
public class Player
{
readonly Rigidbody _rigidBody;
readonly MeshRenderer _renderer;
float _health = 100.0f;
public Player(
Rigidbody rigidBody,
MeshRenderer renderer)
{
_rigidBody = rigidBody;
_renderer = renderer;
}
public MeshRenderer Renderer
{
get { return _renderer; }
}
public bool IsDead
{
get; set;
}
public float Health
{
get { return _health; }
}
public Vector3 LookDir
{
get { return -_rigidBody.transform.right; }
}
public Quaternion Rotation
{
get { return _rigidBody.rotation; }
set { _rigidBody.rotation = value; }
}
public Vector3 Position
{
get { return _rigidBody.position; }
set { _rigidBody.position = value; }
}
public Vector3 Velocity
{
get { return _rigidBody.linearVelocity; }
}
public void TakeDamage(float healthLoss)
{
_health = Mathf.Max(0.0f, _health - healthLoss);
}
public void AddForce(Vector3 force)
{
_rigidBody.AddForce(force);
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 08563d6b38c31254692837726a00f677
timeCreated: 1456623157
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,102 @@
using System;
using UnityEngine;
namespace Zenject.SpaceFighter
{
public class PlayerMoveHandler : IFixedTickable
{
readonly LevelBoundary _levelBoundary;
readonly Settings _settings;
readonly Player _player;
readonly PlayerInputState _inputState;
public PlayerMoveHandler(
PlayerInputState inputState,
Player player,
Settings settings,
LevelBoundary levelBoundary)
{
_levelBoundary = levelBoundary;
_settings = settings;
_player = player;
_inputState = inputState;
}
public void FixedTick()
{
if (_player.IsDead)
{
return;
}
if (_inputState.IsMovingLeft)
{
_player.AddForce(
Vector3.left * _settings.MoveSpeed);
}
if (_inputState.IsMovingRight)
{
_player.AddForce(
Vector3.right * _settings.MoveSpeed);
}
if (_inputState.IsMovingUp)
{
_player.AddForce(
Vector3.up * _settings.MoveSpeed);
}
if (_inputState.IsMovingDown)
{
_player.AddForce(
Vector3.down * _settings.MoveSpeed);
}
// Always ensure we are on the main plane
_player.Position = new Vector3(_player.Position.x, _player.Position.y, 0);
KeepPlayerOnScreen();
}
void KeepPlayerOnScreen()
{
var extentLeft = (_levelBoundary.Left + _settings.BoundaryBuffer) - _player.Position.x;
var extentRight = _player.Position.x - (_levelBoundary.Right - _settings.BoundaryBuffer);
if (extentLeft > 0)
{
_player.AddForce(
Vector3.right * _settings.BoundaryAdjustForce * extentLeft);
}
else if (extentRight > 0)
{
_player.AddForce(
Vector3.left * _settings.BoundaryAdjustForce * extentRight);
}
var extentTop = _player.Position.y - (_levelBoundary.Top - _settings.BoundaryBuffer);
var extentBottom = (_levelBoundary.Bottom + _settings.BoundaryBuffer) - _player.Position.y;
if (extentTop > 0)
{
_player.AddForce(
Vector3.down * _settings.BoundaryAdjustForce * extentTop);
}
else if (extentBottom > 0)
{
_player.AddForce(
Vector3.up * _settings.BoundaryAdjustForce * extentBottom);
}
}
[Serializable]
public class Settings
{
public float BoundaryBuffer;
public float BoundaryAdjustForce;
public float MoveSpeed;
public float SlowDownSpeed;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: d1291ab8856aa9e44a39831fce2c2f0c
timeCreated: 1456593836
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,67 @@
using System;
using UnityEngine;
namespace Zenject.SpaceFighter
{
public class PlayerShootHandler : ITickable
{
readonly AudioPlayer _audioPlayer;
readonly Player _player;
readonly Settings _settings;
readonly Bullet.Factory _bulletFactory;
readonly PlayerInputState _inputState;
float _lastFireTime;
public PlayerShootHandler(
PlayerInputState inputState,
Bullet.Factory bulletFactory,
Settings settings,
Player player,
AudioPlayer audioPlayer)
{
_audioPlayer = audioPlayer;
_player = player;
_settings = settings;
_bulletFactory = bulletFactory;
_inputState = inputState;
}
public void Tick()
{
if (_player.IsDead)
{
return;
}
if (_inputState.IsFiring && Time.realtimeSinceStartup - _lastFireTime > _settings.MaxShootInterval)
{
_lastFireTime = Time.realtimeSinceStartup;
Fire();
}
}
void Fire()
{
_audioPlayer.Play(_settings.Laser, _settings.LaserVolume);
var bullet = _bulletFactory.Create(
_settings.BulletSpeed, _settings.BulletLifetime, BulletTypes.FromPlayer);
bullet.transform.position = _player.Position + _player.LookDir * _settings.BulletOffsetDistance;
bullet.transform.rotation = _player.Rotation;
}
[Serializable]
public class Settings
{
public AudioClip Laser;
public float LaserVolume = 1.0f;
public float BulletLifetime;
public float BulletSpeed;
public float MaxShootInterval;
public float BulletOffsetDistance;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 5a7938ea9f043d24fa235c0e0d2c0f39
timeCreated: 1456593836
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: