繁体   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