52 lines
1.5 KiB
C#
52 lines
1.5 KiB
C#
using UnityEngine;
|
|
using UnityEngine.Pool;
|
|
|
|
namespace BlueWater
|
|
{
|
|
public class Liquid : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
private SpriteRenderer _spriteRenderer;
|
|
|
|
[SerializeField]
|
|
private Rigidbody2D _rigidbody2D;
|
|
|
|
[SerializeField, Range(0f, 2f)]
|
|
private float _distanceThreshold = 0.5f;
|
|
|
|
private IObjectPool<Liquid> _managedPool;
|
|
private LiquidController _liquidController;
|
|
private Collider2D _targetCollider;
|
|
|
|
public void SetManagedPool(IObjectPool<Liquid> pool) => _managedPool = pool;
|
|
public void Destroy() => _managedPool.Release(this);
|
|
|
|
public void Initialize(LiquidController liquidController, Collider2D targetCollider, Color color, Vector3 pushForce)
|
|
{
|
|
_liquidController = liquidController;
|
|
_targetCollider = targetCollider;
|
|
_spriteRenderer.color = color;
|
|
_rigidbody2D.linearVelocity = Vector2.zero;
|
|
_rigidbody2D.AddForce(pushForce, ForceMode2D.Impulse);
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (!_targetCollider) return;
|
|
|
|
var closestPoint = _targetCollider.ClosestPoint(transform.position);
|
|
var distance = Vector2.Distance(transform.position, closestPoint);
|
|
|
|
if (distance < _distanceThreshold)
|
|
{
|
|
OnReached();
|
|
}
|
|
}
|
|
|
|
private void OnReached()
|
|
{
|
|
Destroy();
|
|
_liquidController.OnLiquidReached();
|
|
}
|
|
}
|
|
} |