场景中特效的一种处理方法
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>();
}
}
}
}
所以采取判断特效是否在视锥体内,来控制特效的显隐,降低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>();
}
}
}
}
相关文章推荐
- 一种处理stack blown异常的简单方法
- J2ME MIDP2.0 GameCanvas中对多个按键同时按下事件处理的一种方法
- 一种表单重复提交处理方法
- 一种基于FAT文件系统的NAND Flash坏块处理方法
- javascript 处理HTML元素必须避免使用的一种方法
- 数据库事务处理的另外一种方法
- 处理内存泄漏的一种MFC方法
- uC/OS-II任务栈处理的一种改进方法
- LoadRunner场景的一种设置方法
- QTP处理验证码的一种方法
- 一种自动处理数据表的方法
- 处理内存泄漏的一种MFC方法
- 处理内存泄漏的一种MFC方法
- 网页突然打不开的一种处理方法
- 一种简单的处理大流量访问的方法
- 解决Oracle处理中文乱码的一种方法
- .Net 中处理Word(2007)文档的一种方法
- [导入].Net 中处理Word(2007)文档的一种方法
- javascript处理HTML元素必须避免使用的一种方法
- 约瑟夫问题的一种O(n)数学处理方法