Skip to content
This repository was archived by the owner on Jul 11, 2023. It is now read-only.

Commit 6825208

Browse files
committed
fix uimanager
1 parent c566ad4 commit 6825208

File tree

1 file changed

+65
-44
lines changed

1 file changed

+65
-44
lines changed

Assets/GameFramework/UI/UIManager.cs

Lines changed: 65 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@ public sealed class UIManager :GameFrameworkModule
2525
//资源管理器
2626
private ResourceManager _resource;
2727
//ui堆栈
28-
private Stack<UIViewAttribute> _stackUiAsset = new Stack<UIViewAttribute>();
28+
private Stack<AssetConfig> _stackUiAsset = new Stack<AssetConfig>();
2929
//所有的uiview
30-
private readonly Dictionary<UIViewAttribute, UIView> _allUiViews = new Dictionary<UIViewAttribute, UIView>();
30+
private readonly Dictionary<AssetConfig, UIView> _allUiViews = new Dictionary<AssetConfig, UIView>();
3131
//默认的uipath路径
32-
private readonly Dictionary<int, UIViewAttribute> _uiAssetPath =
33-
new Dictionary<int, UIViewAttribute>();
32+
private readonly Dictionary<int, AssetConfig> _uiAssetPath =
33+
new Dictionary<int, AssetConfig>();
3434
//所有的uiAsset
35-
private readonly Dictionary<int, UIViewAttribute> _allUiAssets = new Dictionary<int, UIViewAttribute>();
35+
private readonly Dictionary<int, AssetConfig> _allUiAssets = new Dictionary<int, AssetConfig>();
3636
#region 构造函数
3737
public UIManager()
3838
{
@@ -51,18 +51,18 @@ public UIManager()
5151
#region 外部接口
5252
public void Push<T>(bool allowMulti = false, params object[] parameters) where T : UIView
5353
{
54-
UIViewAttribute uiViewAttribute = CheckAssetPath(typeof(T));
55-
if (uiViewAttribute==null)
54+
AssetConfig assetConfig = CheckAssetPath(typeof(T));
55+
if (assetConfig==null)
5656
return;
5757

5858
if (_stackUiAsset.Count > 0)
5959
{
60-
UIViewAttribute lastUiViewAttribute = _stackUiAsset.Peek();
60+
AssetConfig lastAssetConfig = _stackUiAsset.Peek();
6161
//如果界面已经打开 则不在执行
62-
if (Equals(lastUiViewAttribute, uiViewAttribute) && !allowMulti)
62+
if (Equals(lastAssetConfig, assetConfig) && !allowMulti)
6363
return;
6464

65-
IUIView uiView = GetUiView(lastUiViewAttribute);
65+
IUIView uiView = GetUiView(lastAssetConfig);
6666

6767
//触发暂停事件
6868
_uiPauseArgs.UIView = uiView;
@@ -71,12 +71,14 @@ public void Push<T>(bool allowMulti = false, params object[] parameters) where T
7171
uiView.OnPause();
7272
}
7373

74-
UIViewAttribute newUIViewAttribute = uiViewAttribute;
74+
AssetConfig newAssetConfig = null;
7575
if (allowMulti)
76-
newUIViewAttribute = new UIViewAttribute(uiViewAttribute.AssetBundleName, uiViewAttribute.ViewPath);
76+
newAssetConfig = new AssetConfig(assetConfig.AssetBundleName, assetConfig.AssetPath);
77+
else
78+
newAssetConfig = assetConfig;
7779

78-
_stackUiAsset.Push(newUIViewAttribute);
79-
UIView newUiView = GetUiView(newUIViewAttribute);
80+
_stackUiAsset.Push(newAssetConfig);
81+
UIView newUiView = GetUiView(newAssetConfig);
8082
newUiView.OnEnter(parameters);
8183

8284
//触发打开事件
@@ -90,9 +92,9 @@ public void Pop(bool isDestory = false)
9092
//移除当前UI
9193
if (_stackUiAsset.Count > 0)
9294
{
93-
UIViewAttribute lastUIViewAttribute = _stackUiAsset.Pop();
94-
UIView lastUiView;
95-
if (_allUiViews.TryGetValue(lastUIViewAttribute, out lastUiView))
95+
AssetConfig lastAssetConfig = _stackUiAsset.Pop();
96+
UIView lastUiView;
97+
if (_allUiViews.TryGetValue(lastAssetConfig, out lastUiView))
9698
{
9799
//触发关闭事件
98100
_uiExitArgs.UIView = lastUiView;
@@ -101,7 +103,7 @@ public void Pop(bool isDestory = false)
101103
lastUiView.OnExit();
102104
if (isDestory)
103105
{
104-
_allUiViews.Remove(lastUIViewAttribute);
106+
_allUiViews.Remove(lastAssetConfig);
105107
MonoBehaviour.Destroy(lastUiView);
106108
}
107109
else
@@ -111,9 +113,9 @@ public void Pop(bool isDestory = false)
111113

112114
if (_stackUiAsset.Count > 0)
113115
{
114-
UIViewAttribute uiViewAttribute = _stackUiAsset.Peek();
115-
UIView lastUiView;
116-
if (_allUiViews.TryGetValue(uiViewAttribute, out lastUiView))
116+
AssetConfig lastAssetConfig = _stackUiAsset.Peek();
117+
UIView lastUiView;
118+
if (_allUiViews.TryGetValue(lastAssetConfig, out lastUiView))
117119
{
118120
lastUiView.OnResume();
119121
//触发恢复事件
@@ -129,40 +131,41 @@ public void Pop(bool isDestory = false)
129131

130132
#region 内部函数
131133
//检查路径
132-
private UIViewAttribute CheckAssetPath(Type t)
134+
private AssetConfig CheckAssetPath(Type t)
133135
{
134-
int hashCode = t.GetHashCode();
136+
int hashCode = t.GetHashCode();
135137

136-
UIViewAttribute uiViewAttribute=null;
137-
if (!_uiAssetPath.TryGetValue(hashCode, out uiViewAttribute))
138-
{
139-
object[] attrs = t.GetCustomAttributes(typeof(UIViewAttribute), false);
140-
if (attrs.Length == 0)
141-
return null;
142-
uiViewAttribute = (UIViewAttribute)attrs[0];
143-
if (string.IsNullOrEmpty(uiViewAttribute.ViewPath)
144-
|| string.IsNullOrEmpty(uiViewAttribute.AssetBundleName))
145-
return null;
146-
}
147-
return uiViewAttribute;
148-
}
138+
AssetConfig assetCofig = null;
139+
if (!_uiAssetPath.TryGetValue(hashCode, out assetCofig))
140+
{
141+
object[] attrs = t.GetCustomAttributes(typeof(UIViewAttribute), false);
142+
if (attrs.Length == 0)
143+
return null;
144+
UIViewAttribute uIViewAttribute = attrs[0] as UIViewAttribute;
145+
146+
if (string.IsNullOrEmpty(uIViewAttribute?.ViewPath) || string.IsNullOrEmpty(uIViewAttribute.AssetBundleName))
147+
return null;
148+
assetCofig = new AssetConfig(uIViewAttribute.AssetBundleName, uIViewAttribute.ViewPath);
149+
}
150+
return assetCofig;
151+
}
149152

150153

151154
//获取ui界面
152-
private UIView GetUiView(UIViewAttribute uiViewAttribute)
155+
private UIView GetUiView(AssetConfig assetConfig)
153156
{
154157
UIView uiView;
155-
if (!_allUiViews.TryGetValue(uiViewAttribute, out uiView))
158+
if (!_allUiViews.TryGetValue(assetConfig, out uiView))
156159
{
157-
GameObject uiViewSource = _resource.LoadAsset<GameObject>(uiViewAttribute.AssetBundleName, uiViewAttribute.ViewPath);
160+
GameObject uiViewSource = _resource.LoadAsset<GameObject>(assetConfig.AssetBundleName, assetConfig.AssetPath);
158161
if (uiViewSource == null)
159-
throw new Exception("uiview path not found:"+ uiViewAttribute.AssetBundleName+":"+uiViewAttribute.ViewPath);
162+
throw new Exception("uiview path not found:"+ assetConfig.AssetBundleName+":"+ assetConfig.AssetPath);
160163

161164
GameObject uiViewClone = GameObject.Instantiate(uiViewSource);
162165
uiView = uiViewClone.GetComponent<UIView>();
163166
if (uiView == null)
164167
return null;
165-
_allUiViews[uiViewAttribute] = uiView;
168+
_allUiViews[assetConfig] = uiView;
166169
return uiView;
167170
}
168171
uiView.gameObject.SetActive(true);
@@ -185,9 +188,27 @@ public override void OnClose()
185188
}
186189
_allUiViews.Clear();
187190
}
188-
#endregion
189-
191+
#endregion
192+
193+
194+
#region 数据结构
195+
//资源配置
196+
private class AssetConfig
197+
{
198+
public string AssetBundleName;
199+
public string AssetPath;
200+
201+
public AssetConfig()
202+
{
203+
}
190204

205+
public AssetConfig(string assetBundleName, string assetPath)
206+
{
207+
AssetBundleName = assetBundleName;
208+
AssetPath = assetPath;
209+
}
210+
}
211+
#endregion
191212

192-
}
213+
}
193214
}

0 commit comments

Comments
 (0)