using System;
using asap.core;
using cfg;
using DG.Tweening;
using Game;
using Script.RuntimeScript.Interface;
using Script.RuntimeScript.model.Data;
using UnityEngine;
namespace Script.RuntimeScript.GameLogic
{
public class GridPropItem : MonoBehaviour, BroadEffectInterface
{
public int PlayEffectPriority { set; get; } = 1;
///
/// 飞行动画
///
private MoveWithCurve _effectScript;
///
/// 展示动画
///
private Animation _showEffect;
GameObject DgSand;
GameObject DgSandShadow;
Transform fx_diggingitem_drop;
public DiggingItemProp EffectType { get; set; }
private GridPropData _data;
Vector3 PositionRootLocalPos;
public GridPropData Data
{
get { return _data; }
set
{
_data = value;
EffectType = _data.Config.DiggingType;
}
}
bool isNormal = true;
public async void Init(GridPropData data, float time)
{
Data = data;
isNormal = EffectType is Normal;
_effectScript = this.gameObject.GetComponent();
PositionRootLocalPos = transform.Find("PositionRoot").localPosition;
Transform animationRoot = transform.Find("PositionRoot/AnimationRoot");
_showEffect = animationRoot.GetComponent();
if (isNormal)
{
DgSand = animationRoot.GetChild(0).gameObject;
DgSandShadow = animationRoot.GetChild(1).gameObject;
fx_diggingitem_drop = animationRoot.Find("fx_diggingitem_drop");
if (fx_diggingitem_drop != null)
{
fx_diggingitem_drop.localScale = Vector3.one * Data.Config.ItemFxScale;
}
SetShowShadow(true);
if (_showEffect != null)
{
_showEffect.transform.localScale = Vector3.zero;
await Awaiters.Seconds(time);
_showEffect?.Play("propshow");
}
}
}
public void SetShowShadow(bool value)
{
if (isNormal)
{
DgSand.SetActive(!value);
DgSandShadow.SetActive(value);
}
}
public async void PlayEffect(bool overCheck)
{
int upDelay = SandDigEventConst.UpDelay;
if (overCheck)
{
upDelay = SandDigEventConst.InUpDelay;
}
await System.Threading.Tasks.Task.Delay(upDelay);
if (EffectType is Normal)
{
SetShowShadow(false);
PlayNormalEffect(PlayNormalPropFly);
}
else if (EffectType is Resource)
{
PlayResourceEffect(PlayResourcePropFly);
}
}
private async void PlayNormalPropFly()
{
_showEffect?.Play("propshake");
DiggingGameManager diggingGameManager = GContext.container.Resolve();
diggingGameManager.ShowFX(Data.Config.Fx, false);
diggingGameManager.ShowFX(Data.Config.Fx, true);
await System.Threading.Tasks.Task.Delay(SandDigEventConst.UpWaitTime + SandDigEventConst.ShovelEffectTime);
if (Data.TargetPropItem == null)
{
DiggingGameManager.LogWarning("没找到目标 ,原地消失");
this.gameObject.SetActive(false);
}
_effectScript.SetStartPosition(_effectScript.transform.position);
_effectScript.EndPoint = Data.TargetPropItem.transform.position;
//_effectScript.EndPoint.z += SandDigEventConst.TargetPropOffsetZ;
_effectScript.Begin(() =>
{
GContext.Publish(new EventUISound("audio_ui_sanddig_itemdrop"));
//隐藏目标道具
Data.TargetPropItem.gameObject.SetActive(false);
if (fx_diggingitem_drop != null)
{
fx_diggingitem_drop.gameObject.SetActive(true);
}
PropSparkItem propSparkItem = gameObject.AddComponent();
propSparkItem.Init(Data.Config.ItemFxScale);
GContext.Publish(new GridPropEffectOver(Data.PropId, true));
});
this.transform.DOScale(SandDigEventConst.GetScale, 0.5f);
}
private async void PlayResourcePropFly()
{
_showEffect?.Play("scale");
await System.Threading.Tasks.Task.Delay(SandDigEventConst.ResourceEffectTime + SandDigEventConst.ShovelEffectTime);
this.gameObject.SetActive(false);
GContext.Publish(new GridPropEffectOver(Data.PropId, true));
Vector3 worldPosition = this.transform.position;
Vector3 screenPosition = ConvertTools.WorldToScreenPoint(worldPosition);
screenPosition.z = 0;
Resource res = (EffectType as Resource);
DiggingGameManager.LogError("添加道具:" + res.ItemID + " count:" + res.Param + " pos::" + screenPosition.ToString());
GContext.Publish(new EventSandDigAddItem(res.ItemID, res.Param, screenPosition));
}
private void PlayNormalEffect(Action effectOver)
{
this.transform.DORotate(new Vector3(0, 0, 0), SandDigEventConst.UpTime)
.SetLoops(-1, LoopType.Incremental)
.SetEase(Ease.Linear);
Vector3 targetPositon = GContext.container.Resolve().ShowPropPositon.transform.position;
Vector3 toPostion = new Vector3(targetPositon.x, targetPositon.y, SandDigEventConst.UpValue);
Vector3 offstPosition = PositionRootLocalPos;
offstPosition.x *= SandDigEventConst.UpScale;
offstPosition.y *= SandDigEventConst.UpScale;
offstPosition.z = 0;
toPostion -= offstPosition;
GContext.Publish(new EventUISound("audio_ui_sanddig_itemfly"));
this.transform.DOMove(toPostion, SandDigEventConst.UpTime).OnComplete(() =>
{
GContext.Publish(new EventUISound("audio_ui_sanddig_itemshake"));
this.transform.DOKill(); // 停止旋转动画
this.transform.rotation = Quaternion.identity; // 角度变为0
effectOver.Invoke();
}).SetId(this);
this.transform.DOScale(new Vector3(SandDigEventConst.UpScale, SandDigEventConst.UpScale, SandDigEventConst.UpScale), SandDigEventConst.UpTime);
}
private void PlayResourceEffect(Action effectOver)
{
effectOver.Invoke();
}
}
}