Unity3D中Buff系统的开发
最近在做一个策略游戏,开发到buff兵种时想着把他做成一个系统,我的思路是这样的。
先建一个枚举类,区分buff种类
public enum BuffKind{
ATK,
DF
}
当然我只写了几个例子,然后需要新建一个buff类(这里如果你喜欢规范的话,这个可以做成基类)
private int buffID;//这个可以保证相同buff不会叠加
private BuffKind buffKind;
private Enum.Propety propety;//要改变的属性
private float buffValue;//buff给的属性
private float time;//buff时间,这里可以用是否为-1表示是否是光环buff
private Character character//人物基类
protected void Start()
{
character = GetComponent<Character>();
switch (buffKind)
{
case BuffKind.DF:
propety=Enum.Propety.DF;
DFBuff(buffTime,buffValue);
break;
}
}
public Buff InitBuff(BuffKind kind,float time,float value,int id)
{
buffKind = kind;
buffTime = time;
buffValue = value;
BuffID = id;
return this;
}
private void DFBuff(float time,float value)
{
character.ChangePropety(propety,value);//这个是人物基类的一个改变属性的方法
if (time != -1)
{
Invoke("DestroySelf", time);
}
}
void OnDestroy()
{
character.ChangePropety(propety,-value);//销毁buff时还原
}
void DestroySelf
{
Destroy(this.gameObject);
}
最后在你的人物基类里加上一个buff的list和两个方法
protected List<Buff> buffs;
public void AddBuff(Buff.BuffKind buffKind,int id,float time,float value)
{
if (buffs.Count > 0)
{
foreach (Buff buff in buffs)
{
if (buff.BuffID == id && buff.buffTime == time && buff != null)
{
return;
}
}
}
buffs.Add(gameObject.AddComponent<Buff>().InitBuff(buffKind, time, value, id));
}
public void RemoveBuff(int id)
{
foreach(Buff buff in buffs)
{
if (buff.BuffID == id)
{
buffs.Remove(buff);
Destroy(buff);
}
}
}
这样一个简单的buff系统便可以了,你可以做一个buff怪,可以这样。
//进入防范就添加一个buff
protected override void OnTriggerEnter2D(Collider2D collision)
{
base.OnTriggerEnter2D(collision);
if (collision.tag == this.tag)//这里是区别友军与敌军
{
collision.GetComponent<Character>().AddBuff(Buff.BuffKind.DF, buffid, -1, 3);
}
}
//出范围就除去buff
protected override void OnTriggerExit2D(Collider2D collision)
{
base.OnTriggerExit2D(collision);
if (collision.tag == this.tag)
{
collision.GetComponent<Character>().RemoveBuff(buffid);
}
}
当然这个也只能当参考,第一次只能想到这种方式。