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; /// /// 两个mesh 用来处理 点击两次的情况 /// 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(); 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(); 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().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; } } /// /// 被动爆炸 触发点击 /// 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().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(); 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); } } } }