内延时功能来源: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);
}
}