最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
unity 显示隐藏物体
在 Unity 开发过程中,我们常常需要对物体进行显示和隐藏操作。本文将详细总结几种常见的实现方法。
一、设置 Renderer 状态
在 Unity 中,每一个可以被渲染的物体都会包含一个 Renderer 组件,该组件的作用是将物体渲染到屏幕上。因此,若要隐藏物体,只需禁用这个组件即可。
代码示例
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 等不同类型的渲染器,我们只需找到对应的渲染器组件,将其禁用或激活,即可实现物体的隐藏或显示。
二、设置 Active
在 Unity 中,不同版本设置物体显示和隐藏的方法有所不同。
Unity 4.x 写法
gameObject.SetActive(true); // 显示物体
gameObject.SetActive(false); // 隐藏物体
Unity 3.x 写法
gameObject.SetActiveRecursively(true); // 显示物体
gameObject.SetActiveRecursively(false); // 隐藏物体
版本差异
Unity 4.x 会保持当前物体子物体所有的状态,而 Unity 3.x 若将 active 设置为 true,所有子物体都会变为 true。这也是 Unity 升级后在该功能上的改进之处。
三、设置 Layer
我们可以通过设置物体的 Layer 层,并结合相机的 Culling Mask 来实现物体的隐藏和显示。
假设现有 Layer 如下
| Layer 名称 | 编号 |
|---|---|
| Default | 0 |
| TransparentFX | 1 |
| Ignore Raycase | 2 |
| Water | 4 |
| MyLayer | 8 |
设置相机 Camera 的 Culling Mask
将相机的 Culling Mask 设置为:Default + TransparentFX + Ignore Raycase + Water。
实现原理
当把物体的 Layer 设置为 MyLayer 时,由于该 Layer 不在相机的 Culling Mask 范围内,物体的 Layer 层在当前相机中会被忽略,从而达到隐藏物体的效果。
代码示例
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");
}
}
}
通过以上三种方法,我们可以在 Unity 中灵活地实现物体的显示和隐藏操作。开发者可以根据具体的需求和场景选择合适的方法。