-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRouteCell.cs
113 lines (104 loc) · 3.41 KB
/
RouteCell.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using System;
using UnityEngine;
using MazeViewer.Maze;
using MazeViewer.UI;
using Unitilities.Effect;
namespace MazeViewer.Viewer
{
public class RouteCell : BasicCell
{
[SerializeField] private GameObject dataText = default;
[SerializeField] private TextMesh cost = default, h = default;
[SerializeField] private MeshRenderer targetRenderer = default;
private bool changeFlag = false;
private SearchState nextState = SearchState.Idle;
private GameObject currentEffect = null;
public Material idleMaterial, openMaterial, closedMaterial;
public override MazeState State => MazeState.Route;
private void Awake()
{
if (targetRenderer == null) targetRenderer = GetComponent<MeshRenderer>();
}
private void Update()
{
// 有变化再修改, 否则啥都不干
if(changeFlag)
{
switch (nextState)
{
case SearchState.Idle:
BackToIdle();
break;
case SearchState.Opened:
StartOpenEffect();
break;
case SearchState.Closed:
StartCloseEffect();
break;
}
changeFlag = false;
}
}
/// <summary>
/// 刷新搜索数据
/// </summary>
private void RefreshData()
{
cost.text = searchData.cost.ToString();
h.text = searchData.h.ToString();
}
public override void Init()
{
BackToIdle();
}
/// <summary>
/// 播放开启特效
/// </summary>
private void StartOpenEffect()
{
dataText.SetActive(true);
if(targetRenderer != null)
targetRenderer.material = openMaterial;
currentEffect = EffectFactory.Instance.GetActivateEffect(transform.position - Vector3.up * 0.5f, transform);
currentEffect.GetComponent<ParticleSystem>().Play();
}
/// <summary>
/// 播放关闭特效
/// </summary>
private void StartCloseEffect()
{
dataText.SetActive(true);
if(targetRenderer != null)
targetRenderer.material = closedMaterial;
if(currentEffect != null)
{
currentEffect.GetComponent<ParticleSystem>().Stop();
EffectFactory.Instance.RecycleActivateEffect(currentEffect);
}
}
/// <summary>
/// 立即转变为Idle状态
/// </summary>
private void BackToIdle()
{
dataText.SetActive(false);
if(targetRenderer != null)
targetRenderer.material = idleMaterial;
if(currentEffect != null)
{
currentEffect.GetComponent<ParticleSystem>().Stop();
EffectFactory.Instance.RecycleActivateEffect(currentEffect);
}
}
public override void UpdateSearchState(CellSearchData searchData)
{
if(searchData.state != this.searchData.state)
{
nextState = searchData.state;
changeFlag = true;
}
this.searchData = searchData;
RefreshData();
}
}
}