在游戏中免不了需要对怪物进行动态的生成,死亡的时候要对其销毁,这样就是一个怪物的生命历程循环过程。如果按照一般的游戏设计方式,到了一定时间就进行怪物的刷新,如果每次都需要动态的new一个怪物出来,死亡后又要动态的销毁,这样就会大幅度降低游戏的性能。尤其是在怪物一同刷新和一同的销毁的时候,玩家有可能会出现卡机情况,那么如何避免这种事情的发生呢?
为了确保性能这里我们只可以牺牲内存来确保性能,如何利用内存来确保即使同时刷新怪物的时候都不会卡呢?这里我就介绍一种非常简单好用的方法,双列表的方式进行管理。利用List进行内存的管理,这样就可以避免重复的new一个新资源。
1、避免了频繁使用的时候产生的大量内存碎片,从而降低游戏运行效率。
2、避免了内存的泄露(C#一般不会有这种问题,但是C++很容易出现这个问题)
3、便于资源的统一回收和管理。(在场景切换的时候,我们可以统一释放怪物的资源)
这里我就用一个简单案例进行讲解:
首先我们要有一个简单的怪物属性类或者结构体,如图所示:
其次需要一个列表来存放场景内还活着的怪物,如下图所示:
其次另一个列表来存放死亡后消失的怪物,如下图所示:
再来就是一些简单的添加或移除列表元素函数即可,这样简单的双列表就基本完成了,代码就直接放出来:
using UnityEngine;
using System.Collections.Generic;
public class DoubleLinked
{
public class CubeData
{
public GameObject cube;
public int HP;
public string name;
}
/// <summary>
/// 活着的矩形
/// </summary>
public List<CubeData> livecubes = new List<CubeData>();
/// <summary>
/// 死亡的矩形
/// </summary>
public List<CubeData> diecubes = new List<CubeData>();
public void AddLiveCubes(CubeData vlueData)
{
if(livecubes != null)
livecubes.Add(vlueData);
}
public void AddDieCubes(CubeData vlueData)
{
if (diecubes != null)
diecubes.Add(vlueData);
}
public void RemoveLiveCubes(CubeData vlueData)
{
if (livecubes.Count > 0)
{
livecubes.Remove(vlueData);
}
}
public void RemoveDieCubes(CubeData vlueData)
{
if (diecubes.Count > 0)
{
diecubes.Remove(vlueData);
}
}
}
然后就是简单的应用了,首先要先去生成怪物,这里我就动态生产了5个Cube,然后将它们位置都错开避免影响我们的观察,代码如图所示:
这里你可以去断点或者自己Debug一下看看是不是所有的怪物都放入Live列表里面去了,如果没有出现错误的话,打印出来的效果如下图所示:
这样就表示4个Cube都存入到Live列表里面了。
下一步就写一个简单方法让Cube消失:
1、方法就是点击一下Cube
2、Cube就扣HP
3、当HP等于0的时候就死亡消失并且从Live列表移除,存入到Die列表里面去;
功能十分简单,代码就如图所示:
这样我可以测试测试一下效果如何了,效果如下图所示:
打印出来的正是存放到Die列表的两个怪物的名字,这表示怪物已经从live表里面移除了存放进die表里面了,如此一来怪物的一次简单生命历程也结束了。
那么如果需要新的怪物时候怎么办?可以先去查看Die表里面是否有我们需要的怪物,如果存在那么就将其转移到需要放置的位置、添加其属性后显示出来即可,如果没有的话我们就需要new一个出来然后存放到Live表里面进行统一的管理和销毁。
这种管理的方式并不一定要使用列表,存储的方式大可以根据项目进行改变,其中的管理方式都基本一致。
后面重新生成怪物的方法很简单,这里就不放出代码了(PS:我也没有去写,如果还是不懂得话就私信我)