簡體   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