在Unity中修补,我的GUI中有一部分会从代表游戏中不同内容的几种不同类别之一呈现信息(例如敌人统计数据)。所有不同的类都有一个方法来创建一个包含所需信息的信息对象(例如enemyInfoObject),它有一个DrawInfo()方法,根据gameObject绘制信息。
在我的信息呈现脚本中,我希望能够将任何一个不同的信息对象分配给单个变量(即当前选择的敌人,NPC等),并能够调用DrawInfo()方法。有没有干净,简单和/或更好的方法来做到这一点?
如果需要,我可以详细说明。
答案 0 :(得分:2)
这是一种众所周知的设计模式,称为"Strategy Pattern"。它扩展了“编程到界面”的想法。
策略模式旨在提供定义家庭的方法 算法,将每个算法封装为一个对象,然后制作它们 互换。策略模式允许算法变化 独立于使用它们的客户。
首先,定义一个包含DrawInfo
的界面,比如说ISprite
。您的所有精灵都将是实现此接口的类。现在游戏可以存储对所选ISprite
的引用并在其上调用方法。
例如:
public interface ISprite
{
void Draw();
}
public class BossMonster : ISprite
{
public override void Draw()
{
// Draw scary stuff
}
}
public class NPC : ISprite
{
public override void Draw()
{
// Draw stuff
}
}
public class Game
{
private ISprite currentSprite = ...
private List<ISprite> otherSprites = ...
public void Render()
{
currentSprite.Draw();
foreach (ISprite sprite in otherSprites)
{
sprite.Draw();
}
}
}
答案 1 :(得分:1)
我能想到的最好的方法是让游戏中你想要调用DrawInfo()的所有对象实现像IDrawableInfo
这样的界面:
public interface IDrawableInfo
{
void DrawInfo();
}
public class EnemyInfoObject : IDrawableInfo
{
public void DrawInfo()
{
// Do drawing stuff here
}
}
if(objectIdLikeToDrawInfoFor is IDrawableInfo)
{
objectIdLikeToDrawInfoFor.DrawInfo();
}
您可以通过将DrawInfo()
调用包装在if语句中来避免运行时错误。