Files
ft/Client/Assets/Scripts/EventMowForTreasure/Act/EventMowForTreasureObstacleCell.cs
2026-06-29 21:18:33 +08:00

184 lines
7.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Playables;
namespace EventMowForTreasure
{
[DisallowMultipleComponent]
public class EventMowForTreasureObstacleCell : MonoBehaviour
{
[SerializeField] protected Vector3 colliderBrokeSize;
[SerializeField] protected Vector3 colliderBrokeCenter;
[SerializeField] protected GameObject normalGameObject;
[SerializeField] protected GameObject brokeGameObject;
[SerializeField] protected GameObject heightLightGameObject;
[SerializeField] protected GameObject redHeightLightGameObject;
[Header("obstacle normal")]
[SerializeField][Tooltip("人物割草的timeLine/r/n或者其他默认的timeline")]
protected PlayableAsset normalTimelineAsset;
[SerializeField][Tooltip("等多长时间开始播这个timeline")]
protected float normalDelayPlayTime = 0.35f;
[SerializeField] [Tooltip("表示进入下一个动画需要等待的时间 <color=red>注意下一个动画需要先等待它自己的delayTime才开始</color>")]
protected float normalBreakDelayTime = 0.2f;
[Header("obstacle speed")] [SerializeField]
[Tooltip("道具2或者道具3 需要播的加速的timeline")]
protected PlayableAsset speedTimelineAsset;
[SerializeField] [Tooltip("等多长时间开始播这个timeline")]
protected float speedDelayPlayTime = 0.35f;
[SerializeField] [Tooltip("表示进入下一个动画需要等待的时间 <color=red>注意下一个动画需要先等待它自己的delayTime才开始</color>")]
protected float speedBreakDelayTime = 0.2f;
protected Action<EventMowForTreasureObstacleCell> ClickAction;
protected BoxCollider Collider;
protected EventMowForTreasureObstacleData ObstacleData;
protected virtual void Awake()
{
Collider = gameObject.GetComponent<BoxCollider>();
if (!Collider) Collider = gameObject.AddComponent<BoxCollider>();
Collider.isTrigger = true;
}
public virtual void OnMouseDown()
{
if (ObstacleData == null) return;
if (IsPointerOverUI())
return;
ClickAction?.Invoke(this);
}
private bool IsPointerOverUI()
{
if (EventSystem.current == null)
return true;
var pointerEventData = new PointerEventData(EventSystem.current)
{
position = Input.mousePosition
};
var results = new List<RaycastResult>();
EventSystem.current.RaycastAll(pointerEventData, results);
return results.Count > 0;
}
public virtual void SetData(EventMowForTreasureObstacleData data, Action<EventMowForTreasureObstacleCell> clickAction)
{
ObstacleData = data;
ClickAction = clickAction;
if (ObstacleData == null) return;
Show();
}
public virtual EventMowForTreasureObstacleData GetData()
{
return ObstacleData;
}
public virtual void ShowSelected(bool isSuperBreak = false,bool needShowRed=false)
{
if (ObstacleData.IsCollectionReward)
{
Show();
return;
}
var isSpecialObstacle = ObstacleData.Type == EEventMowForTreasureObstacleType.HeightObstacle;
var isShowGreen = !isSpecialObstacle ? !ObstacleData.IsBroke : !ObstacleData.IsBroke && isSuperBreak;
var isShowRed = !isSpecialObstacle ? !ObstacleData.IsBroke : !ObstacleData.IsBroke && !isSuperBreak ;
if (needShowRed)
{
isShowGreen = false;
isShowRed=true;
}
if (normalGameObject)
normalGameObject?.SetActive(false);
if (brokeGameObject)
brokeGameObject?.SetActive(ObstacleData.IsBroke);
if (heightLightGameObject)
heightLightGameObject?.SetActive(isShowGreen);
if (redHeightLightGameObject)
redHeightLightGameObject?.SetActive(isShowRed);
}
public virtual void Show()
{
if (normalGameObject)
normalGameObject?.SetActive(!ObstacleData.IsBroke);
if (brokeGameObject)
brokeGameObject?.SetActive(ObstacleData.IsBroke);
if (heightLightGameObject)
heightLightGameObject?.SetActive(false);
if (redHeightLightGameObject)
redHeightLightGameObject?.SetActive(false);
if (!ObstacleData.IsBroke||ObstacleData.Type==EEventMowForTreasureObstacleType.None) return;
Collider.center = colliderBrokeCenter;
Collider.size = colliderBrokeSize;
}
public virtual async Task PlayBreakEffect(bool isSpeed = false, Action specialToolCallBack = null,bool isAwaitCallBack=false)
{
if (isSpeed && ObstacleData.IsObstacleCell)
await PlayBreakEffectSpeed(specialToolCallBack);
else
await PlayBreakEffectNormal(specialToolCallBack,isAwaitCallBack);
}
protected virtual async Task PlayBreakEffectNormal(Action specialToolCallBack = null,bool isAwaitCallBack=false)
{
await Awaiters.Seconds(normalDelayPlayTime);
if (!normalGameObject || !normalGameObject.activeInHierarchy)
{
await Awaiters.Seconds(normalBreakDelayTime);
return;
}
if (!normalTimelineAsset)
normalTimelineAsset = normalGameObject.GetComponent<PlayableDirector>()?.playableAsset;
var director = normalGameObject.GetComponent<PlayableDirector>();
if (director&& normalTimelineAsset!=null)
{
director.stopped -=DirectorStopped;
director.stopped +=DirectorStopped;
director.Play(normalTimelineAsset);
}
await Awaiters.Seconds(normalBreakDelayTime);
specialToolCallBack?.Invoke();
}
protected virtual async Task PlayBreakEffectSpeed(Action specialToolCallBack = null)
{
await Awaiters.Seconds(speedDelayPlayTime);
if (!normalGameObject || !normalGameObject.activeInHierarchy || speedTimelineAsset == null)
{
await Awaiters.Seconds(speedBreakDelayTime);
return;
}
var director = normalGameObject.GetComponent<PlayableDirector>();
if (director)
{
director.stopped -=DirectorStopped;
director.stopped +=DirectorStopped;
director.Play(speedTimelineAsset);
}
specialToolCallBack?.Invoke();
await Awaiters.Seconds(speedBreakDelayTime);
}
protected virtual void DirectorStopped(PlayableDirector director)
{
Show();
}
}
}