unity3d 隐藏 Image

2015年01月20日 10:15 1 点赞 0 评论 更新于 2025-11-21 14:52

在 Unity3D 开发过程中,常常需要对物体进行隐藏和显示操作。下面为你总结几种常见的实现方法。

一、设置 Renderer 状态

每一个可以被渲染的物体都会包含一个 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 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,所有子物体都会变为激活状态。这是 Unity 升级后在该功能上的改进。

三、设置 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 层会在当前相机中被忽略,从而达到隐藏的效果。以下是具体代码:

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");
}
}
}

总结

以上各种方案需要根据具体情况进行选择,你可以酌情使用不同的方法来实现物体的隐藏和显示。