调用在编译时未指定的方法

时间:2014-08-09 01:59:15

标签: c# unity3d

在Unity中修补,我的GUI中有一部分会从代表游戏中不同内容的几种不同类别之一呈现信息(例如敌人统计数据)。所有不同的类都有一个方法来创建一个包含所需信息的信息对象(例如enemyInfoObject),它有一个DrawInfo()方法,根据gameObject绘制信息。

在我的信息呈现脚本中,我希望能够将任何一个不同的信息对象分配给单个变量(即当前选择的敌人,NPC等),并能够调用DrawInfo()方法。有没有干净,简单和/或更好的方法来做到这一点?

如果需要,我可以详细说明。

2 个答案:

答案 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这样的界面:

IDrawableInfo.cs

public interface IDrawableInfo
{
    void DrawInfo();
}

EnemyInfoObject.cs

public class EnemyInfoObject : IDrawableInfo
{
    public void DrawInfo()
    {
        // Do drawing stuff here
    }
}

YourScript.cs

if(objectIdLikeToDrawInfoFor is IDrawableInfo)
{
    objectIdLikeToDrawInfoFor.DrawInfo();
}

您可以通过将DrawInfo()调用包装在if语句中来避免运行时错误。