165 lines
4.3 KiB
C#
165 lines
4.3 KiB
C#
using DG.Tweening;
|
|
using UnityEngine;
|
|
|
|
namespace AibisDream
|
|
{
|
|
public class CoolingMachineViewer : MonoBehaviour, ICoolingMachine
|
|
{
|
|
[Header("引用")] public GameObject bottleSlot;
|
|
public CoolingBottle bottle;
|
|
public LockSlider lockSlider;
|
|
public Transform pumpHead;
|
|
|
|
private SpriteButton _button;
|
|
|
|
[Header("参数")] public float pumpDuration = 3f;
|
|
public float resetDuration = 0.5f;
|
|
public float pumpHeadUpY;
|
|
public float pumpHeadDownY;
|
|
|
|
#region 状态
|
|
|
|
[Header("状态")] public bool isMachineEmpty;
|
|
public bool isLocked;
|
|
public bool inLiquidChange;
|
|
|
|
#endregion
|
|
|
|
#region 对外暴露
|
|
|
|
public void LinkRobot()
|
|
{
|
|
// TODO 这里是应该ta来控制吗?存疑
|
|
isMachineEmpty = true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 泵出冷却液
|
|
/// </summary>
|
|
public void PumpCooling()
|
|
{
|
|
inLiquidChange = true;
|
|
// 液面上升
|
|
bottle.LiquidUp(pumpDuration);
|
|
// 泵头下降
|
|
var sq = GenePumpHeadAnime();
|
|
sq.OnComplete(() =>
|
|
{
|
|
inLiquidChange = false;
|
|
isMachineEmpty = false;
|
|
});
|
|
}
|
|
|
|
public void UnlockBottle()
|
|
{
|
|
// 动画效果拉杆处理了
|
|
// 触发锁定逻辑
|
|
isMachineEmpty = false;
|
|
isLocked = false;
|
|
bottle?.Unlock();
|
|
lockSlider.DisableHook();
|
|
}
|
|
|
|
public void MoveOutBottle()
|
|
{
|
|
if (bottle == null) return;
|
|
// 瓶子置空
|
|
bottle.transform.parent = null;
|
|
// 停止吸附
|
|
bottle?.Unsnap();
|
|
}
|
|
|
|
public void InsertBottle(CoolingBottle newBottle)
|
|
{
|
|
// 改变瓶子归属
|
|
newBottle.transform.parent = bottleSlot.transform;
|
|
bottle = newBottle;
|
|
// 插入瓶子
|
|
bottle.Snap(bottleSlot.transform.position);
|
|
}
|
|
|
|
public void LockBottle()
|
|
{
|
|
// 动画效果在拉杆的地方就处理了
|
|
// 触发锁定逻辑
|
|
isMachineEmpty = !bottle || bottle.isEmpty;
|
|
isLocked = true;
|
|
bottle?.Lock();
|
|
// 如果当前没有瓶子,就打开卡扣碰撞
|
|
if (!bottle) lockSlider.EnableHook();
|
|
}
|
|
|
|
public void InjectCool()
|
|
{
|
|
inLiquidChange = true;
|
|
// 泵头下降
|
|
var sq = GenePumpHeadAnime();
|
|
sq.OnComplete(() =>
|
|
{
|
|
inLiquidChange = false;
|
|
isMachineEmpty = true;
|
|
});
|
|
// 液面上升
|
|
bottle.LiquidDown(pumpDuration);
|
|
}
|
|
|
|
public void UnlinkRobot()
|
|
{
|
|
throw new System.NotImplementedException();
|
|
}
|
|
|
|
public bool CanPump()
|
|
{
|
|
if (inLiquidChange)
|
|
{
|
|
Debug.Log("泵机正在工作");
|
|
return false;
|
|
}
|
|
|
|
if (!isLocked)
|
|
{
|
|
Debug.Log("卡扣尚未锁定");
|
|
return false;
|
|
}
|
|
|
|
if (!bottle)
|
|
{
|
|
Debug.Log("没有瓶子");
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
#endregion
|
|
|
|
private Sequence GenePumpHeadAnime()
|
|
{
|
|
var sequence = DOTween.Sequence();
|
|
// 下降动画
|
|
var pumpDownPos = new Vector3(pumpHead.position.x, pumpHeadDownY + transform.position.y,
|
|
pumpHead.position.z);
|
|
sequence.Append(pumpHead.DOMove(pumpDownPos, pumpDuration));
|
|
// 上升动画
|
|
var pumpUpPos = new Vector3(pumpHead.position.x, pumpHeadUpY + transform.position.y, pumpHead.position.z);
|
|
sequence.Append(pumpHead.DOMove(pumpUpPos, resetDuration));
|
|
|
|
return sequence;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 冷却系统有什么样的行为?
|
|
/// </summary>
|
|
public interface ICoolingMachine
|
|
{
|
|
void LinkRobot();
|
|
void PumpCooling();
|
|
void UnlockBottle();
|
|
void MoveOutBottle();
|
|
void InsertBottle(CoolingBottle bottle);
|
|
void LockBottle();
|
|
void InjectCool();
|
|
void UnlinkRobot();
|
|
}
|
|
} |