实例追踪类

实例追踪类

InstanceTracker.cs

    /// <summary>
    /// Monobehavioids which inherit this class will be tracked in the static 
    /// Instances property.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class InstanceTracker<T> : MonoBehaviour where T : MonoBehaviour
    {
        public static List<T> Instances { get; private set; } = new List<T>();
        int instanceIndex = 0;

        protected virtual void OnEnable()
        {
            instanceIndex = Instances.Count;
            Instances.Add(this as T);
        }

        protected virtual void OnDisable()
        {
            if (instanceIndex < Instances.Count)
            {
                var end = Instances.Count - 1;
                Instances[instanceIndex] = Instances[end];
                Instances.RemoveAt(end);
            }
        }
    }

作用

  • 所有T类型的统一管理,能方便的遍历。

  • 实现某些特性组件,把功能组件化,比如实现碰撞透明功能,如下例子。

代码解释

  • typeparam 用于泛型注释

  • where T : MonoBehaviour 指T 必须是MonoBehaviour 的派生类。(where约束可以参考:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parametersarrow-up-right

  • OnEnable() This function is called when the object becomes enabled and active.

  • 所有用InstanceTracker 的 T类型,都会加入Instances 列表,这个列表是静态的,也就是所有这个类共享,相当于单例。

  • 在OnEnable() 唤醒时,会把本实例加入Instances 列表

  • OnDisable() 设置成不活跃时,会把本实例删了,具体操作是把Instances 列表的最后一个放到本下边处,之后把列表最后一个给删了。

  • List 的底层实现是数组,这种写法提高删除效率

用例

FadingSprite.cs

FadingSpriteSystem.cs

代码解释

  • FadingSprite 继承了InstanceTracker,该类注意功能是发生碰撞时修改自身的alpha值,实现透明效果

  • FadingSpiteSystem 就是在每帧更新的时候修改每个实例SpriteRender 的颜色,主要是Alpha值。

  • 这样如果一个物体想实现碰撞透明的效果,就可以把FadingSprite 脚本挂上去作为一个组件

最后更新于