Initial Commit
This commit is contained in:
+41
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b6cd15ebe0f3c3243af6b6a44d7f2ded
|
||||
timeCreated: 1484757106
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+32
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a99d48a043510d549a4f7078a8653233
|
||||
timeCreated: 1456592909
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+37
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2db4310dd7706af419ae62fb99fac156
|
||||
timeCreated: 1456415473
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+81
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 301188284719932429bd73b2047b328d
|
||||
timeCreated: 1456681654
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+57
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ff82b5e08504b89408eddc95e9dad280
|
||||
timeCreated: 1456681376
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+24
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5b062bb00fc459540964842bdf1068a9
|
||||
timeCreated: 1456417258
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+35
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9f9f53db91ff64e40af5b30b70927e13
|
||||
timeCreated: 1484693045
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+67
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 08563d6b38c31254692837726a00f677
|
||||
timeCreated: 1456623157
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+102
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d1291ab8856aa9e44a39831fce2c2f0c
|
||||
timeCreated: 1456593836
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+67
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5a7938ea9f043d24fa235c0e0d2c0f39
|
||||
timeCreated: 1456593836
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user