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

本文关键字:方法 未指定 编译 调用 | 更新日期: 2023-09-27 18:17:07

在Unity中,我有一部分GUI将呈现来自代表游戏中不同事物的几种不同类型之一的信息(例如敌人统计)。所有不同的类都有一个方法来创建包含所需信息的信息对象(例如enemyInfoObject),其中有一个drawwinfo()方法来根据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();
        }
    }
}

我能想到的最好的方法是让你的游戏中所有你想要调用drawwinfo()的对象实现一个像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语句中来避免运行时错误。