如何从另一个类传递 List<Interface> 和实现的方法

加兰地尔

我有一个游戏管理器,用于管理所有其他脚本中特定 Unity 回调(FixedUpdateUpdateLateUpdate的执行顺序

具体来说,我写了这3个接口:

public interface IFixedAt {
    bool IsActive { get; }
    void FixedAt(); 
}

public interface IUpdateAt {
    bool IsActive { get; }
    void UpdateAt();
}

public interface ILateUpdateAt {
    bool IsActive { get; }
    void LateUpdateAt();
}

这些接口在需要时在游戏对象的脚本中实现,例如:

using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour, IUpdateAt, ILateUpdateAt {

    [SerializeField]
    bool isActive = true;
    public bool IsActive {
        get {
            return (isActive && gameObject.activeInHierarchy);
        }
    }

    public void UpdateAt() {
        // Do stuff in Update
    }

    public void LateUpdateAt() {
        // Do stuff in Late Update
    }
}

游戏管理器脚本在 Awake 时获取对实现接口的所有脚本的引用,创建一个List<Interface>,然后在运行时使用列表仅在需要的地方执行回调:

using UnityEngine;
using System.Collections.Generic;

public class GameManager : MonoBehaviour {

    public List<GameObject> GameObjectsWithScripts;
    List<IFixedAt> fixedAtList { get; set; }
    List<IUpdateAt> updateAtList { get; set; }
    List<ILateUpdateAt> lateUpdateAtList { get; set; }

    private void Awake() {
        PopulateAllLists();
    }

    private void FixedUpdate() {        
        if (fixedAtList != null) {
            for (int i = 0; i < fixedAtList.Count; i++) {
                if (fixedAtList[i].IsActive)
                    fixedAtList[i].FixedAt();
            }
        }
    }

    private void Update() {
        if (updateAtList != null) {
            for (int i = 0; i < updateAtList.Count; i++) {  
                if (updateAtList[i].IsActive)
                    updateAtList[i].UpdateAt();
            }
        }       
    }

    private void LateUpdate() {
        if (lateUpdateAtList != null) {
            for (int i = 0; i < lateUpdateAtList.Count; i++) {
                if (lateUpdateAtList[i].IsActive)
                    lateUpdateAtList[i].LateUpdateAt();
            }
        }
    }

    void PopulateAllLists() {
        fixedAtList = PopulateList<IFixedAt>(GameObjectsWithScripts);
        updateAtList = PopulateList<IUpdateAt>(GameObjectsWithScripts);
        lateUpdateAtList = PopulateList<ILateUpdateAt>(GameObjectsWithScripts);     
    }

    List<T> PopulateList<T> (List<GameObject> goScripts) {
        //Scans the GOs list and adds existent interface elements to the list
        var list = new List<T>();
        for (int i = 0; i < goScripts.Count; i++) {
            if (goScripts[i].GetComponent<T>() != null) {
                list.Add(goScripts[i].GetComponent<T>());               
            }           
        }

        //Returns list (null if list is empty)
        if (list.Count > 0) {
            return list;
        }
        else {
            return null;
        }
    }
}

现在,我无法理解是否可以做的问题,如果可以,如何做。

正如你所看到的,里面的代码FixedUpdateUpdate并且LateUpdate基本上是一样的:它遍历具体List,检查当前元素处于活动状态,如果为真则执行专有的回调。

我想知道的是,是否有可能创建一个可以从三个回调内部调用的通用方法,并将List要迭代的方法和调用的特定方法传递给它List,像这样的伪代码:

private void FixedUpdate() {        
    Method (fixedAtList, FixedAt() );
}

private void Update() {        
    Method (updateAtList, UpdateAt() );
}

private void LateUpdate() {        
    Method (lateUpdateAtList, LateUpdateAt() );
}

private void Method<T> (List<T> list, Action method) {
    if (list != null) {
        for (int i = 0; i < list.Count; i++) {  
            if (list[i].IsActive)
                list[i].method();
        }
    }
}

我尝试了不同的事情,但没有成功,而且我对如何做到这一点一无所知。任何帮助将不胜感激。

朱哈尔

首先,您需要一个涵盖该IsActive方法的接口

public interface IActive {
    bool IsActive { get; }
}

public interface IFixedAt : IActive {
    void FixedAt(); 
}

public interface IUpdateAt : IActive {
    void UpdateAt();
}

public interface ILateUpdateAt : IActive {
    void LateUpdateAt();
}

然后你需要使用泛型Action<T>,然后你可以传入 lambdas

private void FixedUpdate() {        
    Method (fixedAtList, f => f.FixedAt() );
}

private void Update() {        
    Method (updateAtList, u => u.UpdateAt() );
}

private void LateUpdate() {        
    Method (lateUpdateAtList, l => l.LateUpdateAt() );
}

private void Method<T> (List<T> list, Action<T> method) where T : IActive {
    if (list != null) {
        for (int i = 0; i < list.Count; i++) {  
            if (list[i].IsActive)
                method(list[i]);
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从另一个类中迅速调用另一个方法?

来自分类Dev

如何从另一个类调用@selector方法

来自分类Dev

如何在另一个类中调用一个类的main()方法?

来自分类Dev

通过添加List()和另一个模型类来执行迁移

来自分类Dev

如何从另一个类的一个类访问方法?

来自分类Dev

Flutter:如何从另一个类调用方法?

来自分类Dev

如何从另一个小写的类调用方法?

来自分类Dev

当另一个类的方法调用List.add()时不起作用

来自分类Dev

如何使一个类既实现接口又从另一个类继承

来自分类Dev

如何从另一个类调用@selector方法

来自分类Dev

如何从另一个类调用get方法?

来自分类Dev

如何从另一个类运行方法?

来自分类Dev

从另一个类传递和设置TextView

来自分类Dev

如何从另一个类运行方法

来自分类Dev

如何从另一个类调用void方法

来自分类Dev

将一个类的对象传递给另一个类的方法

来自分类Dev

如何将参数从适配器类传递到另一个类中的方法

来自分类Dev

如何从一个类调用方法到另一个类

来自分类Dev

从同一个类中的另一个方法访问作为方法传递给另一个类的方法

来自分类Dev

如何通过Java中的方法将对象从一个类传递到另一个类

来自分类Dev

如何从另一个类调用 invalidate() 方法?

来自分类Dev

如何从另一个类调用方法?

来自分类Dev

C# List 在类和命名空间中,从另一个类访问它

来自分类Dev

如何从另一个项目调用类的方法

来自分类Dev

如何从另一个类调用HashMap的方法?

来自分类Dev

如何访问另一个类的方法?

来自分类Dev

如何将变量从一个方法传递到同一个类中的另一个方法?

来自分类Dev

如何将参数从main方法传递到另一个类

来自分类Dev

如何从另一个类方法调用一个类方法

Related 相关文章

  1. 1

    如何从另一个类中迅速调用另一个方法?

  2. 2

    如何从另一个类调用@selector方法

  3. 3

    如何在另一个类中调用一个类的main()方法?

  4. 4

    通过添加List()和另一个模型类来执行迁移

  5. 5

    如何从另一个类的一个类访问方法?

  6. 6

    Flutter:如何从另一个类调用方法?

  7. 7

    如何从另一个小写的类调用方法?

  8. 8

    当另一个类的方法调用List.add()时不起作用

  9. 9

    如何使一个类既实现接口又从另一个类继承

  10. 10

    如何从另一个类调用@selector方法

  11. 11

    如何从另一个类调用get方法?

  12. 12

    如何从另一个类运行方法?

  13. 13

    从另一个类传递和设置TextView

  14. 14

    如何从另一个类运行方法

  15. 15

    如何从另一个类调用void方法

  16. 16

    将一个类的对象传递给另一个类的方法

  17. 17

    如何将参数从适配器类传递到另一个类中的方法

  18. 18

    如何从一个类调用方法到另一个类

  19. 19

    从同一个类中的另一个方法访问作为方法传递给另一个类的方法

  20. 20

    如何通过Java中的方法将对象从一个类传递到另一个类

  21. 21

    如何从另一个类调用 invalidate() 方法?

  22. 22

    如何从另一个类调用方法?

  23. 23

    C# List 在类和命名空间中,从另一个类访问它

  24. 24

    如何从另一个项目调用类的方法

  25. 25

    如何从另一个类调用HashMap的方法?

  26. 26

    如何访问另一个类的方法?

  27. 27

    如何将变量从一个方法传递到同一个类中的另一个方法?

  28. 28

    如何将参数从main方法传递到另一个类

  29. 29

    如何从另一个类方法调用一个类方法

热门标签

归档