// 准备雪花池 public void Init() { if (mSnowGoList == null || mSnowGoList.Count == 0) { Debug.LogError("mSnowGoList is null or Count is 0"); return; } mSnowTypeCount = mSnowGoList.Count; // int作为key,开辟相同数量,不会引发字典扩容 mSnowMeltHideDic = new Dictionary <int, List <SnowMelt> >(mSnowGoList.Count); mSnowMeltShowingDic = new Dictionary <int, List <SnowMelt> >(mSnowGoList.Count); for (int snowGoIdx = 0, max = mSnowGoList.Count; snowGoIdx < max; ++snowGoIdx) { // 开辟5个容量,List几乎不用扩容 List <SnowMelt> list = new List <SnowMelt>(5); List <SnowMelt> showingList = new List <SnowMelt>(5); for (int snowMeltIdx = 0; snowMeltIdx < mPreGenSnowMeltNum; ++snowMeltIdx) { SnowMelt snowMelt = CreateSnowMelt(snowGoIdx); list.Add(snowMelt); } mSnowMeltHideDic.Add(snowGoIdx, list); mSnowMeltShowingDic.Add(snowGoIdx, showingList); } }
// 回收雪花 private void OnSnowMeltEnd(SnowMelt snowMelt) { if (snowMelt != null) { snowMelt.Hide(); AddSnowMelt(mSnowMeltHideDic, snowMelt); RemoveSnowMelt(mSnowMeltShowingDic, snowMelt); } }
private void RemoveSnowMelt(Dictionary <int, List <SnowMelt> > dic, SnowMelt snowMelt) { if (snowMelt == null) { return; } int snowType = snowMelt.GetSnowType(); if (dic.ContainsKey(snowType)) { List <SnowMelt> list = dic[snowType]; if (list != null && list.Contains(snowMelt)) { list.Remove(snowMelt); } } }
// 获取一个雪花,先从池里取,没有再创建 private SnowMelt GenSnowMelt(int snowType) { SnowMelt snowMelt = null; if (mSnowMeltHideDic.ContainsKey(snowType)) { List <SnowMelt> list = mSnowMeltHideDic[snowType]; if (list != null && list.Count > 0) { snowMelt = list[0]; list.RemoveAt(0); } else { snowMelt = CreateSnowMelt(snowType); } } return(snowMelt); }
// 创建一个雪花 private SnowMelt CreateSnowMelt(int snowType) { SnowMelt newSnowMelt = null; if (0 <= snowType && snowType < mSnowTypeCount) { GameObject snowGo = mSnowGoList[snowType]; Vector3 preLocalScale = snowGo.transform.localScale; GameObject newGo = GameObject.Instantiate(snowGo); newGo.transform.parent = transform; newGo.transform.localRotation = Quaternion.identity; newGo.transform.localScale = preLocalScale * mSnowLocalScaleFactor; newSnowMelt = newGo.GetComponent <SnowMelt>(); newSnowMelt.Init(); newSnowMelt.SetSnowType(snowType, mOnSnowMeltEndCallback); newSnowMelt.Hide(); } return(newSnowMelt); }
// 结束融化,回收雪花并隐藏自身,可重新开始 public void Hide() { var et = mSnowMeltShowingDic.GetEnumerator(); while (et.MoveNext()) { List <SnowMelt> list = et.Current.Value; if (list == null) { continue; } for (int i = 0, max = list.Count; i < max; ++i) { SnowMelt snowMelt = list[0]; list.RemoveAt(0); snowMelt.Hide(); AddSnowMelt(mSnowMeltHideDic, snowMelt); } } }
// 在屏幕上随机位置创建雪花,count:数量 private void RandomGenSnow(int count) { // 强制改成1个 count = 1; for (int i = 0; i < count; ++i) { // 随机雪花样式 int snowType = Random.Range(0, mSnowTypeCount); SnowMelt snowMelt = GenSnowMelt(snowType); if (snowMelt != null) { // 随机区域和位置 int listIdx = Random.Range(0, mAreaList.Count); Vector4 v4 = mAreaList[listIdx]; float rX = Random.Range(v4.x, v4.y); float rY = Random.Range(v4.z, v4.w); Vector3 localPos = new Vector3(rX, rY, 0); AddSnowMelt(mSnowMeltShowingDic, snowMelt); snowMelt.Show(localPos); } } }