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

目前项目的场景中有很多特效,虽然在视锥体外,并不进行渲染,但是仍会有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>();
          }
      }


    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值