Unity 静态工具类(内延时、动态加载组件、动态启用组件)

内延时功能来源:Unity 静态类内延时操作_浪迹_的博客-CSDN博客_unity 静态类延时操作

动态加载组件功能来源:Unity动态给物体加载和删除脚本_年薪1k的程序员的博客-CSDN博客_unity动态添加和删除脚本

动态启用或关闭组件:参考动态加载组件功能自己写的

在脚本的继承中,Component父类中派生了六大类:Transform、Rigidbody、ParticleSystem、Behaviour、Collider、Renderer,其中Transform有IEnumerable功能,就可以写内延时功能,Component组件包含了所以组件,就可以写动态加载组件功能,enable这属性只有Behaviour、Collider、Renderer这三大类有,就可以写动态启用或关闭组件功能。

以下为静态工具类,不需挂载,直接调用即可: 

using System;
using UnityEngine;
using System.Collections;


public static class Tools
{
    public static Transform transform;
    public static void waitToUnloadAssetWrap(Action action, float delaySeconds)
    {
        MonoBehaviour owner = transform.GetComponent<MonoBehaviour>();
        owner.StartCoroutine(DelayFuc(action, delaySeconds));
    }
    /// <summary>
    /// 延迟方法到指定时间执行
    /// </summary>
    /// <param name="action">方法</param>
    /// <param name="delaySeconds">时间</param>
    /// <returns></returns>
    public static IEnumerator DelayFuc(Action action, float delaySeconds)
    {
        yield return new WaitForSeconds(delaySeconds);
        action();
    }
    /// <summary>
    /// 加载目标脚本
    /// </summary>
    /// <param name="go"></param>
    public static T Load_Component<T>(GameObject target) where T : Component
    {
        if (target.GetComponent<T>() == null)
        {
            target.AddComponent<T>();
        }
        return target.GetComponent<T>();
    }
    /// <summary>
    /// 卸载目标脚本
    /// </summary>
    /// <param name="go"></param>
    public static void Unload_Component<T>(GameObject target) where T : Component
    {
        if (target.GetComponent<T>() != null)
        {
            UnityEngine.Object.Destroy(target.GetComponent<T>());
        }
    }
    //动态启用或关闭组件
    public static void Enable_Behaviour<T>(GameObject target, bool isEnable) where T : Behaviour
    {
        target.GetComponent<T>().enabled = isEnable;
    }
    public static void Enable_Collider<T>(GameObject target,bool isEnable) where T : Collider
    {
        target.GetComponent<T>().enabled = isEnable;
    }
    public static void Enable_Renderer<T>(GameObject target, bool isEnable) where T : Renderer
    {
        target.GetComponent<T>().enabled = isEnable;
    }

}

以下为脚本调用示例:

using UnityEngine;

public class Cube : MonoBehaviour
{
    void Start()
    {
        //延时初始化
        Tools.transform = transform;
        //延时嵌套
        Tools.waitToUnloadAssetWrap(() => {
            Debug.Log("延时1秒:" + Time.time);
            Tools.waitToUnloadAssetWrap(() => {
                Debug.Log("延时1+1秒:"+Time.time);
            }, 1.0f);
        },1.0f);
        //延时写法二
        Tools.waitToUnloadAssetWrap(delegate ()
        {
            Debug.Log("aaaaa"+Time.time);
        },1.0f);

        //去除脚本A组件
        Tools.Unload_Component<A>(gameObject);
        //添加脚本B组件
        Tools.Load_Component<B>(gameObject);
        //添加脚本MeshCollider组件
        Tools.Load_Component<MeshCollider>(gameObject);

        //脚本Cube组件关闭
        Tools.Enable_Behaviour<Cube>(gameObject, false);
        //Animator组件启用
        Tools.Enable_Behaviour<Animator>(gameObject, true);
        //Camera组件启用
        Tools.Enable_Behaviour<Camera>(gameObject, true);
        //Light组件关闭
        Tools.Enable_Behaviour<Light>(gameObject, false);

        //BoxCollider组件关闭
        Tools.Enable_Collider<BoxCollider>(gameObject, false);
        //MeshCollider组件启用
        Tools.Enable_Collider<MeshCollider>(gameObject, true);

        //LineRenderer组件启用
        Tools.Enable_Renderer<LineRenderer>(gameObject, true);
        //MeshRenderer组件关闭
        Tools.Enable_Renderer<MeshRenderer>(gameObject, false);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39858654/article/details/126860904