繁体   English   中英

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

[英]Calling a method that is unspecified at compile time

在Unity中修修补补,我的GUI的一部分将呈现代表游戏中不同事物的几种不同类类型之一的信息(例如,敌人统计数据)。 所有不同的类都有一个用于创建包含所需信息的信息对象的方法(例如,敌方信息对象),该方法具有一个DrawInfo()方法,该方法根据gameObject绘制信息。

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

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

这是一种众所周知的设计模式,称为“策略模式” 它扩展了“编程到接口”的思想。

该策略模式旨在提供一种定义一系列算法的方法,将每个算法封装为一个对象,并使它们可互换。 策略模式使算法可以独立于使用它们的客户端而变化。

首先,定义一个包含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();
        }
    }
}

我能想到的最好的方法是在实现IDrawableInfo类的接口上制作要调用DrawInfo()的游戏中的所有对象:

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语句中,可以避免运行时错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM