unity 显示隐藏物体

2015年01月19日 09:47 0 点赞 0 评论 更新于 2025-11-21 14:45

在 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 名称编号
Default0
TransparentFX1
Ignore Raycase2
Water4
MyLayer8

设置相机 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 中灵活地实现物体的显示和隐藏操作。开发者可以根据具体的需求和场景选择合适的方法。