Skip to content

Commit

Permalink
修复因资源路径不统一导致UIManager使用的通用对象池无法正常使用的问题
Browse files Browse the repository at this point in the history
  • Loading branch information
qian488 committed Nov 21, 2024
1 parent f2f9436 commit 77d9176
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 15 deletions.
69 changes: 56 additions & 13 deletions Assets/Scripts/ProjectBase/Pool/PoolManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,20 +24,15 @@ public void GetGameObject(string name,UnityAction<GameObject> callback)
}
else
{
MonoManager.GetInstance().StartCoroutine(LoadGameObjectAsync(name, callback));
// 如果池中没有,让ResourcesManager去加载
ResourcesManager.GetInstance().LoadAsync<GameObject>(name, (go) =>
{
go.name = name;
callback(go);
}, false); // usePool设为false 池中没有,故等价于不使用对象池
}
}

private IEnumerator LoadGameObjectAsync(string name, UnityAction<GameObject> callback)
{
ResourceRequest request = Resources.LoadAsync<GameObject>(name);
yield return request;

GameObject go = GameObject.Instantiate(request.asset as GameObject);
go.name = name;
callback(go);
}

/// <summary>
/// 将对象压入池中
/// </summary>
Expand All @@ -57,10 +52,58 @@ public void PushGameObject(string name,GameObject go)
}
}

public void Clear()
/// <summary>
/// 清空对象池
/// </summary>
/// <param name="destroyPoolGO">是否同时销毁对象池根节点</param>
public void Clear(bool destroyPoolGO = true)
{
// 遍历字典中的所有PoolData
foreach (var poolData in poolDictionary.Values)
{
// 销毁池中的所有游戏对象
foreach (var go in poolData.poolList)
{
if(go != null)
GameObject.Destroy(go);
}
// 销毁父节点游戏对象
if(poolData.fatherGameObject != null)
GameObject.Destroy(poolData.fatherGameObject);
}

// 清空字典
poolDictionary.Clear();
poolGO = null;

// 根据参数决定是否销毁对象池的根节点
if (destroyPoolGO && poolGO != null)
{
GameObject.Destroy(poolGO);
poolGO = null;
}
}

/// <summary>
/// 清除指定名称的对象池
/// </summary>
/// <param name="name">对象池名称</param>
public void ClearPool(string name)
{
if (poolDictionary.ContainsKey(name))
{
// 销毁池中的所有游戏对象
foreach (var go in poolDictionary[name].poolList)
{
if(go != null)
GameObject.Destroy(go);
}
// 销毁父节点游戏对象
if(poolDictionary[name].fatherGameObject != null)
GameObject.Destroy(poolDictionary[name].fatherGameObject);

// 从字典中移除
poolDictionary.Remove(name);
}
}

public bool CheckGameObjectInPool(string name)
Expand Down
4 changes: 2 additions & 2 deletions Assets/Scripts/ProjectBase/UI/UIManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ public void ShowPanel<T>(string panelName, E_UI_Layer layer = E_UI_Layer.Mid, Un
father = top;
break;
case E_UI_Layer.Syestem:
father = top;
father = system;
break;
}
go.transform.SetParent(father);
Expand All @@ -106,7 +106,7 @@ public void HidePanel(string panelName)
if (panelDictionary.ContainsKey(panelName))
{
panelDictionary[panelName].HideMe();
ResourcesManager.GetInstance().Recycle(panelName, panelDictionary[panelName].gameObject);
ResourcesManager.GetInstance().Recycle("UI/" + panelName, panelDictionary[panelName].gameObject);
panelDictionary.Remove(panelName);
}
}
Expand Down
1 change: 1 addition & 0 deletions Assets/Test/InputTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ private void CheckInputUp(KeyCode key)
break;
case KeyCode.R:
Debug.Log("R Down");
PoolManager.GetInstance().Clear();
break;
case KeyCode.T:
Debug.Log("T Down");
Expand Down

0 comments on commit 77d9176

Please sign in to comment.