我有一个需求,当 Unit 非主动下线的时候不是直接从地图上删除,而是进入离线状态。
我可以给Unit增加一个 是否在线的属性。但这样做显然耦合太高,灵活性太差了!!!
所以根据猫大的教导:”buff 是一切状态的抽象 “ 我把离线状态当成一个buff挂在 Unit 上。
于是 UnitDisconnectBuff 诞生了。
public void Awake()
{
Unit = this.Parent as Unit;
BuffMessage.UnitId = Unit.Id;
BuffMessage.State = 1;
Broadcast();
}
public void Destory()
{
BuffMessage.State = 0;
Broadcast();
}
public override void Broadcast()
{
MessageHelper.Broadcast(Unit, BuffMessage);
}
在buff挂上和移除的时候,会广播 buff 消息 给其他 Unit。
然后我发现类似需求将会非常多,于是我写了一个基类 Buff
public abstract class Buff: Entity
{
public abstract void Broadcast();
public abstract void SendToSingle(Entity entity);
}
下面是使用的地方,
//广播萌新Unit诞生的消息
MessageHelper.Broadcast(unit, createUnits);
//将所有之前的Unit身上的buff 发送给 萌新Unit
foreach (Unit u in units)
{
foreach (var item in u.Components)
{
if (item.Value is Buff buff)
{
buff.SendToSingle(萌新Unit);
}
}
}
以上就是我的需求和处理方式。
我想我将会广泛的使用这个写法,所以很想知道这样有没有什么缺点。
期待大家指教。
-萌新每日一问