Пример #1
0
    // 准备雪花池
    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);
        }
    }
Пример #2
0
    // 回收雪花
    private void OnSnowMeltEnd(SnowMelt snowMelt)
    {
        if (snowMelt != null)
        {
            snowMelt.Hide();

            AddSnowMelt(mSnowMeltHideDic, snowMelt);
            RemoveSnowMelt(mSnowMeltShowingDic, snowMelt);
        }
    }
Пример #3
0
    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);
            }
        }
    }
Пример #4
0
    // 获取一个雪花,先从池里取,没有再创建
    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);
    }
Пример #5
0
    // 创建一个雪花
    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);
    }
Пример #6
0
    // 结束融化,回收雪花并隐藏自身,可重新开始
    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);
            }
        }
    }
Пример #7
0
    // 在屏幕上随机位置创建雪花,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);
            }
        }
    }