您的位置:首页 > 其它

场景中特效的一种处理方法

2017-03-20 20:13 190 查看
目前项目的场景中有很多特效,虽然在视锥体外,并不进行渲染,但是仍会有ParticleSystem.Update()的相关消耗。

所以采取判断特效是否在视锥体内,来控制特效的显隐,降低CPU的消耗。

前提

统一特效制作方式(节点相关)

1.      创建一个空物体,并命名SceneParticalSystem_XXX(eg.SceneParticalSystem_yingguang)

2.      在SceneParticalSystem_XXX在挂载相应的粒子特效

(注意:特效需要分区域,不能将场景中同一种类型的特效挂载到一个父物体下(具体原因在原理中有解释)。

 

原理:

通过摄像机是否看见父物体,来控制父物体下特效的显隐。

eg:如果将所有的荧光特效都挂载到SceneParticalSystem_yingguang物体下面。当SceneParticalSystem_yingguang这个物体被摄像机看到的时候,会开启SceneParticalSystem_yingguang物体下面挂载的所有粒子特效,如果摄像机看不到SceneParticalSystem_yingguang的时候,会关闭SceneParticalSystem_yingguang物体下面挂载的所有粒子特效。所以需要根据场景的区域,设置不同的SceneParticalSystem_yingguang点,并挂载相应的粒子特效

代码如下:

using UnityEngine;

using System.Collections;

public class ParticalVisibleController : MonoBehaviour {

    //获取PartialSystem组件缓存

    private ParticleSystem[] particleSystems;

    void Awake()

    {

        particleSystems = this.GetComponentsInChildren<ParticleSystem>();

        this.gameObject.AddComponent<MeshRenderer>();

        this.gameObject.AddComponent<MeshFilter>();

        this.transform.localScale = new Vector3(0, 0, 1);

    }

    void OnBecameVisible()

    {

        //Debug.LogError("看见啦!");

        if (particleSystems.Length > 0)

        {

            for (int i = 0; i < particleSystems.Length; i++)

            {

                particleSystems[i].gameObject.SetActive(true);

                particleSystems[i].Play();

            }

        }

    }

    void OnBecameInvisible()

    {

        //Debug.LogError("看bubububu见啦!");

        

        if (particleSystems.Length > 0)

        {

            for (int i = 0; i < particleSystems.Length; i++)

            {

                particleSystems[i].gameObject.SetActive(false);

            }

        }

    }

}

提供美术使用方法:

using System.IO;

using UnityEditor;

using UnityEngine;

public class SceneParticalSystem

{

    [MenuItem("RYGN/ParicalSystem/添加特效处理脚本", false, 11)]

    static void SingleCreateUIAtlasPrefab()

    {

        AddScriptsToParticalSystem();

        AssetDatabase.Refresh();

    }

    private static void AddScriptsToParticalSystem()

    {

      GameObject[] obj = GameObject.FindObjectsOfType<GameObject>();

      foreach (var item in obj)

      {

          if (item.gameObject.name.StartsWith("SceneParticalSystem_"))

          {

              item.gameObject.AddComponent<ParticalVisibleController>();

          }

      }

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: