70 lines
1.7 KiB
C#
70 lines
1.7 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
namespace AibisDream.FixSystem
|
|
{
|
|
public class PipelineObject : MonoBehaviour
|
|
{
|
|
#region 组件
|
|
|
|
private SpriteRenderer _renderer;
|
|
|
|
public event Action<PipelineObject, bool> OnObjEnd;
|
|
|
|
#endregion
|
|
|
|
#region 数据
|
|
|
|
private float _speed;
|
|
private float _maxDistance;
|
|
|
|
private bool _isActive;
|
|
private Vector3 _initPos;
|
|
|
|
#endregion
|
|
|
|
private void Init(PipelineObjectData data, float speed, float maxDistance)
|
|
{
|
|
_renderer = GetComponent<SpriteRenderer>();
|
|
_renderer.sprite = data.sprite;
|
|
_renderer.color = data.color;
|
|
|
|
_initPos = transform.position;
|
|
_speed = speed;
|
|
_maxDistance = maxDistance;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (_isActive)
|
|
{
|
|
transform.position += _speed * Time.deltaTime * Vector3.right;
|
|
if (IsReachedEnd())
|
|
{
|
|
OnPipelineEnd(true);
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool IsReachedEnd()
|
|
{
|
|
return transform.position.x > _initPos.x + _maxDistance;
|
|
}
|
|
|
|
private void OnPipelineEnd(bool isReachedEnd)
|
|
{
|
|
_isActive = false;
|
|
gameObject.SetActive(false);
|
|
OnObjEnd?.Invoke(this, isReachedEnd);
|
|
}
|
|
|
|
public bool TryRecycle(Vector3 pos, float usefulDistance)
|
|
{
|
|
if (!_isActive) return false;
|
|
if (Vector3.Distance(pos, transform.position) > usefulDistance) return false;
|
|
|
|
OnPipelineEnd(false);
|
|
return true;
|
|
}
|
|
}
|
|
} |