88 lines
2.8 KiB
C#
88 lines
2.8 KiB
C#
using DG.Tweening;
|
|
using UnityEngine;
|
|
using GameCore;
|
|
using System;
|
|
|
|
public class EventBreakBlock : MonoBehaviour
|
|
{
|
|
[SerializeField] private RewardItemNew reward;
|
|
[SerializeField] private GameObject crack, mask, fxBreak;
|
|
[SerializeField] private RectTransform rectTransform;
|
|
public RectTransform RectTransform => rectTransform;
|
|
private DrillBlockData _blockData;
|
|
private float _fxLiftTime;
|
|
|
|
/// <summary>
|
|
/// Move Block from startPoint to endPoint within dropTime and set item to it
|
|
/// </summary>
|
|
/// <param name="blockData">Item inside. Could be empty.</param>
|
|
/// <param name="startPoint">Screen Position</param>
|
|
/// <param name="endPoint">Screen Position</param>
|
|
/// <param name="dropTime">In Seconds</param>
|
|
public void Appear(DrillBlockData blockData, float dropHeight, Vector2 endPoint, AnimationCurve easeCurve, float dropTime = 0.5f, float fxLifeTime = 1f)
|
|
{
|
|
var startPoint = endPoint + Vector2.up * dropHeight;
|
|
try
|
|
{
|
|
// Debug.Log($"[Break] Block Appear from {startPoint} to {endPoint}.", this);
|
|
transform.position = startPoint;
|
|
gameObject.SetActive(true);
|
|
if (blockData.IsEmpty)
|
|
SetEmpty();
|
|
else
|
|
SetReward(blockData.Item);
|
|
transform.DOMove(endPoint, dropTime).SetEase(easeCurve);
|
|
_blockData = blockData;
|
|
_fxLiftTime = fxLifeTime;
|
|
}
|
|
catch(Exception e)
|
|
{
|
|
Debug.Log($"Block Spawn Error: {e.Message}, {e.StackTrace}");
|
|
}
|
|
}
|
|
|
|
public void Break()
|
|
{
|
|
// Debug.Log($"[EventBreak] Block broken: {_blockData.IsEmpty}, {_blockData.ItemId}, {_blockData.ItemCount}.", this);
|
|
PlayBreakFx();
|
|
gameObject.SetActive(false);
|
|
if (_blockData == null || _blockData.IsEmpty)
|
|
return;
|
|
EventBreakAct.EventAggregator.Publish(new EventBreakBlockBreak{BreakPos = transform.position, Item = _blockData.Item});
|
|
}
|
|
|
|
private async void PlayBreakFx()
|
|
{
|
|
try
|
|
{
|
|
fxBreak.SetActive(false);
|
|
// await Awaiters.NextFrame;
|
|
fxBreak.SetActive(true);
|
|
// await Awaiters.NextFrame;
|
|
await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(_fxLiftTime));
|
|
// await Awaiters.NextFrame;
|
|
fxBreak.SetActive(false);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Debug.Log($"[EventBreak]Block Break Fx Error:{e.Message}\n{e.StackTrace}", this);
|
|
}
|
|
}
|
|
|
|
private void SetReward(ItemData item)
|
|
{
|
|
reward.SetData(item);
|
|
reward.gameObject.SetActive(true);
|
|
crack.SetActive(true);
|
|
mask.SetActive(true);
|
|
}
|
|
|
|
private void SetEmpty()
|
|
{
|
|
reward.gameObject.SetActive(false);
|
|
crack.SetActive(false);
|
|
mask.SetActive(false);
|
|
}
|
|
|
|
}
|