Unity 设置显示隐藏

2015年01月21日 10:12 0 点赞 0 评论 更新于 2025-11-21 14:59

在使用 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、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,所有子物体都会变为 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 层在当前相机中会被忽略,相当于隐藏了物体。具体代码如下:

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

以上各种方法仅供大家参考,在实际选用时,需要根据具体情况来选择适合的方法,以实现物体的隐藏与显示。