功能类似于 GetComponents 等函数:
1、 不用接口, 使用抽象类 继承自 Monobehaiour
- public abstract class LayerPanelBase :MonoBehaviour
- {
- public abstract void InitView(HeroModel heroModel, CharacterAttributeView characterAttributeView);
- }
然后执行 .GetComponent<LayerPanelBase>().InitView(myHeroModel, this);
2、原理类似 网上可以搜
- using UnityEngine;
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
-
- public static class GameObjectEx
- {
- public static T GetInterface<T>(this GameObject inObj) where T : class
- {
- if (!typeof(T).IsInterface)
- {
- Debug.LogError(typeof(T).ToString() + ": is not an actual interface!");
-
- return null;
- }
- var tmps = inObj.GetComponents<Component>().OfType<T>();
- if (tmps.Count()==0) return null;
- return tmps.First();
- }
-
- public static IEnumerable<T> GetInterfaces<T>(this GameObject inObj) where T : class
- {
- if (!typeof(T).IsInterface)
- {
- Debug.LogError(typeof(T).ToString() + ": is not an actual interface!");
- return Enumerable.Empty<T>();
- }
-
- return inObj.GetComponents<Component>().OfType<T>();
- }
- }
定义的时候直接使用 Interface 这种方式最好了!
3、使用Linq :
- var controllers = GetComponents<MonoBehaviour>()
- .Where(item => item is IInfiniteScrollSetup)
- .Select(item => item as IInfiniteScrollSetup)
- .ToList();
扩展方法:
- public static List<T> GetInterfaces<T>(this GameObject obj) where T: class
- {
- return obj.GetComponents<MonoBehaviour>()
- .Where(item => item is T)
- .Select(item => item as T)
- .ToList();
- }
没办法提供 GetComponent 这种 找一个的方式。
所以相对来来讲还是 第二种 GetInterface 找接口的一个
GetInterfaces 找接口的多个!