92 lines
2.2 KiB
C#
92 lines
2.2 KiB
C#
using UnityEngine;
|
|
|
|
namespace Zenject.SpaceFighter
|
|
{
|
|
public enum BulletTypes
|
|
{
|
|
FromEnemy,
|
|
FromPlayer
|
|
}
|
|
|
|
public class Bullet : MonoBehaviour, IPoolable<float, float, BulletTypes, IMemoryPool>
|
|
{
|
|
float _startTime;
|
|
BulletTypes _type;
|
|
float _speed;
|
|
float _lifeTime;
|
|
|
|
[SerializeField]
|
|
MeshRenderer _renderer = null;
|
|
|
|
[SerializeField]
|
|
Material _playerMaterial = null;
|
|
|
|
[SerializeField]
|
|
Material _enemyMaterial = null;
|
|
|
|
IMemoryPool _pool;
|
|
|
|
public BulletTypes Type
|
|
{
|
|
get { return _type; }
|
|
}
|
|
|
|
public Vector3 MoveDirection
|
|
{
|
|
get { return transform.right; }
|
|
}
|
|
|
|
public void OnTriggerEnter(Collider other)
|
|
{
|
|
var enemyView = other.GetComponent<EnemyView>();
|
|
|
|
if (enemyView != null && _type == BulletTypes.FromPlayer)
|
|
{
|
|
enemyView.Facade.Die();
|
|
_pool.Despawn(this);
|
|
}
|
|
else
|
|
{
|
|
var player = other.GetComponent<PlayerFacade>();
|
|
|
|
if (player != null && _type == BulletTypes.FromEnemy)
|
|
{
|
|
player.TakeDamage(MoveDirection);
|
|
_pool.Despawn(this);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void Update()
|
|
{
|
|
transform.position -= transform.right * _speed * Time.deltaTime;
|
|
|
|
if (Time.realtimeSinceStartup - _startTime > _lifeTime)
|
|
{
|
|
_pool.Despawn(this);
|
|
}
|
|
}
|
|
|
|
public void OnSpawned(float speed, float lifeTime, BulletTypes type, IMemoryPool pool)
|
|
{
|
|
_pool = pool;
|
|
_type = type;
|
|
_speed = speed;
|
|
_lifeTime = lifeTime;
|
|
|
|
_renderer.material = type == BulletTypes.FromEnemy ? _enemyMaterial : _playerMaterial;
|
|
|
|
_startTime = Time.realtimeSinceStartup;
|
|
}
|
|
|
|
public void OnDespawned()
|
|
{
|
|
_pool = null;
|
|
}
|
|
|
|
public class Factory : PlaceholderFactory<float, float, BulletTypes, Bullet>
|
|
{
|
|
}
|
|
}
|
|
}
|