最新文章
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
unity3d 隐藏 Image
在 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");
}
}
}
总结
以上各种方案需要根据具体情况进行选择,你可以酌情使用不同的方法来实现物体的隐藏和显示。