在使用unity3d开发游戏的过程中,我们常常会遇到需要隐藏或者显示的操作,针对这一点,下面做了一些总结。
一、设置Renderer状态
在游戏的开发中,所有能够被渲染的物体都包含有一个Renderer组件,使用它可以将物体渲染到屏幕上,那么如果禁用了这一组件的话,自然也就实现了物体的隐藏。
下面就是实现这一功能的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | using UnityEngine; using System.Collections; public class test : MonoBehaviour { public Transform target; void Start(){ } void OnGUI(){ //renderer control if (GUILayout.Button( "display" )){ MeshRenderer[] marr = target.GetComponentsInChildren<MeshRenderer>( true ); foreach(MeshRenderer m in marr){ m.enabled = true ; } } if (GUILayout.Button( "hide" )){ MeshRenderer[] marr = target.GetComponentsInChildren<MeshRenderer>( true ); foreach(MeshRenderer m in marr){ m.enabled = false ; } } } } |
在这里我做了一个遍历,因为有的物体可能会有多个面片这种情况下就需要把物体的所有面片上的MeshRenderer全部禁用掉。但是也可能会有一些较为复杂的渲染可能会有Trail Renderer,Line Renderer,Skinned Mesh Renderer,Mesh Renderer等,那就找到它,禁用/激活它来实现隐藏或显示。
二、设置Active
unity4.x写法:
1 2 | gameObject.SetActive( true ); //显示物体 gameObject.SetActive( false ); //隐藏物体 |
unity3.x写法:
1 2 | gameObject.SetActiveRecursively( true );显示物体 gameObject.SetActiveRecursively( false );隐藏物体 |
unity4.x会保持当前物体子物体所有的状态,unity3.x则是如果设置active为true,所有子物体全部变为true。 这也是unity升级后改进的一点。
三、设置Layer
假设现有Layer为:
Default = 0,TransparentFX = 1,Ignore Raycase = 2,Water = 4,MyLayer = 8.
设置相机Camera的Culling Mask为:Default+TransparentFX+Ignore Raycase+Water.
那么当设置物体的Layer为MyLayer时候,物体的Layer层在当前相机被忽略,也就相当于隐藏。具体代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | using UnityEngine; using System.Collections; public class test : MonoBehaviour { void OnGUI () { if (GUILayout.Button( "Display" )){ gameObject.layer = LayerMask.NameToLayer( "Default" ); } if (GUILayout.Button( "Hide" )){ gameObject.layer = LayerMask.NameToLayer( "MyLayer" ); } } } |
以上各种方法谨供大家参考,在选用的时候要根据实际的情况来选用适合的方法来实现物体的隐藏与显现。