调用在编译时未指定的方法
本文关键字:方法 未指定 编译 调用 | 更新日期: 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语句中来避免运行时错误。