304 lines
11 KiB
C#
304 lines
11 KiB
C#
using System.Collections;
|
|
using System.Threading.Tasks;
|
|
using asap.core;
|
|
using cfg;
|
|
using GameCore;
|
|
using Script.RuntimeScript.model.Data;
|
|
using UnityEngine;
|
|
|
|
namespace Script.RuntimeScript.GameLogic
|
|
{
|
|
public class GridItem : MonoBehaviour
|
|
{
|
|
|
|
public GridData Data { get; set; }
|
|
public GridEffectType GridEffectType { get; set; }
|
|
GridEffectType Passive;
|
|
private LayerMask _clickableLayer;
|
|
|
|
private GameObject _baseObj;
|
|
private Animation _baseAni;
|
|
|
|
Transform fx_root;
|
|
|
|
/// <summary>
|
|
/// 两个mesh 用来处理 点击两次的情况
|
|
/// </summary>
|
|
private GameObject _mesh1;
|
|
private GameObject _mesh2;
|
|
|
|
private string[] _moveEffectNames = new string[] { "gridshake1", "gridshake2", "gridshake3" };
|
|
private string _moveEffctName = string.Empty;
|
|
|
|
public void Awake()
|
|
{
|
|
_clickableLayer = LayerMask.GetMask("Default");
|
|
|
|
_baseObj = transform.Find("AnimationRoot")?.gameObject;
|
|
|
|
if (_baseObj)
|
|
{
|
|
_mesh1 = _baseObj.FindChildGameObject("Mesh1");
|
|
_mesh2 = _baseObj.FindChildGameObject("Mesh2");
|
|
}
|
|
|
|
_baseAni = this.GetComponent<Animation>();
|
|
|
|
fx_root = transform.Find("fx_root");
|
|
if (fx_root != null)
|
|
{
|
|
fx_root.gameObject.SetActive(false);
|
|
}
|
|
|
|
SetMash(GridMeshType.Mesh1);
|
|
}
|
|
|
|
public void Update()
|
|
{
|
|
if (Data != null && Data.IsOpen == false && Input.GetMouseButtonDown(0))
|
|
{
|
|
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
|
|
RaycastHit hit;
|
|
if (Physics.Raycast(ray, out hit, Mathf.Infinity, _clickableLayer))
|
|
{
|
|
if (hit.collider.gameObject == gameObject)
|
|
{
|
|
OnClick();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 这个方法会被 overlay 相机影响
|
|
// private void OnMouseDown()
|
|
// {
|
|
// DiggingGameManager.LogError("x::" + Data.Row + " y::" + Data.Col + " Data.IsBorder::" + Data.IsBorder);
|
|
// OnClick();
|
|
// }
|
|
|
|
public async void OnClick()
|
|
{
|
|
DiggingGameManager diggingGameManager = GContext.container.Resolve<DiggingGameManager>();
|
|
if (diggingGameManager.GameState != SandDigGameState.Going)
|
|
{
|
|
return;
|
|
}
|
|
if (!diggingGameManager.IsCanClick)
|
|
{
|
|
return;
|
|
}
|
|
int digCount = diggingGameManager.DataModel.GetDigCount();
|
|
|
|
if (digCount <= 0)
|
|
{
|
|
int propId = diggingGameManager.GetActivityPropId();
|
|
if (propId > 0)
|
|
{
|
|
cfg.Item item = GContext.container.Resolve<Tables>().GetItemData(propId);
|
|
string itemName = LocalizationMgr.GetText(item.Name_l10n_key);
|
|
ToastPanel.Show(LocalizationMgr.GetFormatTextValue("UI_ToastPanel_75", itemName));
|
|
}
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
diggingGameManager.DataModel.UseDig();
|
|
}
|
|
if (!Data.IsBorder)
|
|
{
|
|
diggingGameManager.IsCanClick = false;
|
|
if (Data.DoubleClick && Data.hasClickCount < 1)
|
|
{
|
|
int level = diggingGameManager.GetCurLevel();
|
|
int clickCount = diggingGameManager.DataModel.GetClickCount();
|
|
diggingGameManager.SandDigPoint(GridType.None, level, clickCount);
|
|
Data.IsOpen = false;
|
|
Data.hasClickCount++;
|
|
Passive = GridEffectType.DoubleClick;
|
|
|
|
GridEffectType = GridEffectType.DoubleClick;
|
|
|
|
diggingGameManager.DataModel.SaveAll();
|
|
|
|
diggingGameManager.ShowDigEffect(ClickDigType.Smail, Data.LocalPos);
|
|
|
|
PlayEffect();
|
|
await Task.Delay(SandDigEventConst.ShovelAnimTime);
|
|
}
|
|
else
|
|
{
|
|
Data.IsOpen = true;
|
|
EventGridClick eventGridClick = new EventGridClick(Data, false);
|
|
GContext.Publish(eventGridClick);
|
|
bool isBig = eventGridClick.IsBigDig;
|
|
//DiggingGameManager.LogError("大挖不:::" + isBig);
|
|
GridEffectType = isBig ? GridEffectType.ClickBigDig : GridEffectType.ClickDig;
|
|
PlayEffect();
|
|
if (isBig)
|
|
await Task.Delay(SandDigEventConst.BigShovelAnimTime);
|
|
else
|
|
await Task.Delay(SandDigEventConst.ShovelAnimTime);
|
|
if (isBig)
|
|
{
|
|
await Task.Delay(2000);
|
|
}
|
|
}
|
|
diggingGameManager.IsCanClick = true;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 被动爆炸 触发点击
|
|
/// </summary>
|
|
public void PassiveClick()
|
|
{
|
|
if (gameObject.activeSelf && !Data.IsBorder)
|
|
{
|
|
if (Data.DoubleClick && Data.hasClickCount < 1)
|
|
{
|
|
Data.IsOpen = false;
|
|
Data.hasClickCount++;
|
|
Passive = GridEffectType;
|
|
GridEffectType = GridEffectType.DoubleClick;
|
|
PlayEffect();
|
|
GContext.container.Resolve<DiggingGameManager>().DataModel.SaveAll();
|
|
}
|
|
else
|
|
{
|
|
Data.IsOpen = true;
|
|
PlayEffect();
|
|
GContext.Publish(new EventGridClick(Data, true));
|
|
}
|
|
}
|
|
}
|
|
|
|
public void PlayPassClampEffect()
|
|
{
|
|
GridEffectType = GridEffectType.PassClamp;
|
|
PlayEffect();
|
|
}
|
|
|
|
private void PlayEffect()
|
|
{
|
|
StartCoroutine(IEPlayEffect());
|
|
}
|
|
// public const int BigShovelEffectTime = 833;//特效出现延迟
|
|
//public const int BigShovelBlockAnimTime = 866;//块消失动画播放时间
|
|
//public const int BigShovelBlockDisappearTime = 1133;//块消失时间
|
|
IEnumerator PlayBigEffect(int EffectTime)
|
|
{
|
|
yield return new WaitForSeconds(EffectTime * 0.001f);
|
|
fx_root.gameObject.SetActive(true);
|
|
}
|
|
IEnumerator PlayBigAni(int BigShovelBlockAnimTime)
|
|
{
|
|
yield return new WaitForSeconds(BigShovelBlockAnimTime * 0.001f);
|
|
_baseAni?.Play("griddisappear");
|
|
}
|
|
IEnumerator IEPlayEffect()
|
|
{
|
|
DiggingGameManager diggingGameManager = GContext.container.Resolve<DiggingGameManager>();
|
|
var configInit = diggingGameManager.DataModel.digActivityConfig;
|
|
if (GridEffectType == GridEffectType.ClickDig)
|
|
{
|
|
diggingGameManager.ShowFX(GridEffectType, fx_root);
|
|
//普通挖掘效果
|
|
StartCoroutine(PlayBigEffect(SandDigEventConst.ShovelEffectTime));
|
|
StartCoroutine(PlayBigAni(SandDigEventConst.ShovelBlockAnimTime));
|
|
|
|
//_digEffect.SetActive(true);
|
|
//SetMash(GridMeshType.None);
|
|
yield return new WaitForSeconds(SandDigEventConst.ShovelBlockDisappearTime * 0.001f);
|
|
//_digEffect.SetActive(false);
|
|
gameObject.SetActive(false);
|
|
}
|
|
else if (GridEffectType == GridEffectType.ClickBigDig)
|
|
{
|
|
diggingGameManager.ShowFX(GridEffectType, fx_root);
|
|
//挖到了道具的特殊特效
|
|
StartCoroutine(PlayBigEffect(SandDigEventConst.BigShovelEffectTime));
|
|
StartCoroutine(PlayBigAni(SandDigEventConst.BigShovelBlockAnimTime));
|
|
yield return new WaitForSeconds(SandDigEventConst.BigShovelBlockDisappearTime * 0.001f);
|
|
gameObject.SetActive(false);
|
|
}
|
|
else if (GridEffectType == GridEffectType.DoubleClick)
|
|
{
|
|
//挖两次才能打开的格子特效
|
|
diggingGameManager.ShowFX(GridEffectType, fx_root);
|
|
float time = SandDigEventConst.ShovelEffectTime * 0.001f;
|
|
if (Passive == GridEffectType.PassiveBomb)
|
|
{
|
|
time = configInit.BombBlockAniTime;
|
|
}
|
|
else if (Passive == GridEffectType.PassiveClear)
|
|
{
|
|
time = configInit.BombBlockAniTime;
|
|
}
|
|
yield return new WaitForSeconds(time);
|
|
fx_root.gameObject.SetActive(true);
|
|
SetMash(GridMeshType.Mesh2);
|
|
yield return new WaitForSeconds(1);
|
|
fx_root.gameObject.SetActive(false);
|
|
}
|
|
else if (GridEffectType == GridEffectType.PassiveBomb)
|
|
{
|
|
yield return new WaitForSeconds(configInit.BombBlockAniTime);
|
|
//随机晃动
|
|
System.Random random = new System.Random();
|
|
int randomNumber = random.Next(0, _moveEffectNames.Length);
|
|
_moveEffctName = _moveEffectNames[randomNumber];
|
|
_baseAni?.Play(_moveEffctName);
|
|
//yield return new WaitForSeconds(1);
|
|
//特效触发
|
|
diggingGameManager.ShowFX(GridEffectType, fx_root);
|
|
fx_root.gameObject.SetActive(true);
|
|
//SetMash(GridMeshType.None);
|
|
yield return new WaitForSeconds(SandDigEventConst.BombBlockDisappearTime * 0.001f);
|
|
_baseAni.Stop();
|
|
fx_root.gameObject.SetActive(false);
|
|
gameObject.SetActive(false);
|
|
|
|
}
|
|
else if (GridEffectType == GridEffectType.PassiveClear)
|
|
{
|
|
yield return new WaitForSeconds(configInit.ClearBlockAniTime);
|
|
//随机晃动
|
|
System.Random random = new System.Random();
|
|
int randomNumber = random.Next(0, _moveEffectNames.Length);
|
|
_moveEffctName = _moveEffectNames[randomNumber];
|
|
_baseAni?.Play(_moveEffctName);
|
|
//特效触发
|
|
diggingGameManager.ShowFX(GridEffectType, fx_root);
|
|
fx_root.gameObject.SetActive(true);
|
|
//SetMash(GridMeshType.None);
|
|
yield return new WaitForSeconds(SandDigEventConst.ClearBlockDisappearTime * 0.001f);
|
|
_baseAni.Stop();
|
|
fx_root.gameObject.SetActive(false);
|
|
gameObject.SetActive(false);
|
|
|
|
}
|
|
else if (GridEffectType == GridEffectType.PassClamp)
|
|
{
|
|
//挖通关了 ,清屏
|
|
diggingGameManager.ShowFX(GridEffectType, fx_root);
|
|
fx_root.gameObject.SetActive(true);
|
|
yield return new WaitForSeconds(0.2f);
|
|
gameObject.SetActive(false);
|
|
}
|
|
}
|
|
|
|
public void SetMash(GridMeshType type)
|
|
{
|
|
_mesh1?.SetActive(false);
|
|
_mesh2?.SetActive(false);
|
|
if (type == GridMeshType.Mesh1)
|
|
{
|
|
_mesh1?.SetActive(true);
|
|
}
|
|
else if (type == GridMeshType.Mesh2)
|
|
{
|
|
_mesh2?.SetActive(true);
|
|
}
|
|
}
|
|
}
|
|
} |