簡體   English   中英

具有通用和非通用UnityEvent的集合

[英]Collection with generic and non-generic UnityEvents

我正在Unity中進行一些項目。 我有:

[Serializable]
public class ItemAction
{
    [SerializeField]
    private UnityEvent unityEvent;

    public void Perform()
    {
        unityEvent.Invoke();
    }
}

[Serializable]
public class ItemAction<T>
{
    [SerializeField]
    private UnityEvent<T> unityEvent;

    public void Perform(T parameter)
    {
        unityEvent.Invoke(parameter);
    }
}

我也有這個課:

public abstract class Item : MonoBehaviour
{
    [SerializeField]
    private float weight;
    [SerializeField]
    private [collection of item actions] actions;

    public abstract void Use();
    public abstract void Grab(Transform transform);
    public abstract void Drop();
}

如何創建混合了通用和非通用ItemAction實例的集合(因此某些操作可能需要一些參數)? 例如:

對於沒有裝備的武器,我只能抓住它們。 對於沒有裝備的醫療包,我可以抓住它們或立即使用它們。 對於觸發器/切換器,我只能使用它們。

我可能會使用一個空接口,但我認為這不是一個好的解決方案...

就像您說的那樣,您可以創建一個空接口或僅使用對象集合,因為無論如何您都必須進行強制轉換,或者您跳過ItemAction類,而僅使用具有參數的版本,並為不需要操作的操作傳遞null參數(也不是“很好”的解決方案,但是這就是WPF框架通過ICommand接口執行此操作的方式)

但是還有另一個問題,無論使用接口還是對象列表,都將無法在編輯器中顯示它們(除非創建了自定義編輯器),因為該編輯器不會顯示泛型類。

由於您想在繼承自Item每個特定項類中實現方法(至少,我猜是這樣,因為您聲明了這些方法abstract ),所以我會走另一條路線,並為每個特定操作實現接口。

例如:

public interface IItem {
    float Weight { get; set; }
}

public interface IGrabItem : IItem {
    void Grab();
}

public interface IDropItem : IItem {
    void Drop();
}

public interface IUseItem : IItem {
    void Use();
}

public class MedKit : MonoBehaviour, IGrabItem, IUseItem {
    [SerializeField]
    float weight;
    public float Weight {
        get { return weight; }
        set { weight = value; }
    }
    public void Grab() {
        //Your code
    }
    public void Use() {
        //Your code
    }
}

然后您可以選擇直接在每個特定的項目類中實現代碼,也可以使用某種event來引發它們。

哦,順便說一句,如果可能的話,避免使用UnityEvent並依賴標准的.NET event ,它更快並且產生更少的開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM