unity 怎样识别unity3d 获取父对象象active 子对象active

7876人阅读
Unity显示与隐藏
在开发过程中常常需要对物体进行隐藏和显示操作,在这里总结一些;
一、设置Renderer状态
每一个可以被渲染的物体都会包含一个Renderer组件,用来渲染物体到屏幕上,如果禁用这个组件自然也就实现了隐藏物体。
代码示例如下:
usingUnityE
usingSystem.C
publicclass
test : MonoBehaviour {
&&&&publicTransform
&&&&voidStart(){
&&&&voidOnGUI(){
&&&&&&&&if(GUILayout.Button(&display&)){
&&&&&&&&&&&&MeshRenderer[]
marr = target.GetComponentsInChildren&MeshRenderer&(true);
&&&&&&&&&&&&foreach(MeshRenderer
m inmarr){
&&&&&&&&&&&&&&&&m.enabled
&&&&&&&&&&&&}
&&&&&&&&if(GUILayout.Button(&hide&)){
&&&&&&&&&&&&MeshRenderer[]
marr = target.GetComponentsInChildren&MeshRenderer&(true);
&&&&&&&&&&&&foreach(MeshRenderer
m inmarr){
&&&&&&&&&&&&&&&&m.enabled
&&&&&&&&&&&&}
在这里我做了一个遍历,可能一个物体会有多个面片,那就需要把物体的所有面片上的MeshRenderer全部禁用掉。
也可能会有一些较为复杂的渲染可能会有Trail Renderer,Line Renderer,Skinned Mesh Renderer,Mesh Renderer等,找到它,禁用/激活它来实现隐藏或显示。
二、设置Active
unity4.x写法:
gameObject.SetActive(true);//显示物体
gameObject.SetActive(false);//隐藏物体
unity3.x写法:
gameObject.SetActiveRecursively(true);显示物体
gameObject.SetActiveRecursively(false);隐藏物体
unity4.x会保持当前物体子物体所有的状态,unity3.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层在当前相机被忽略,也就相当于隐藏。具体代码为:
usingUnityE
usingSystem.C
publicclass
test : MonoBehaviour {
&&&&voidOnGUI
&&&&&&&&if(GUILayout.Button(&Display&)){
&&&&&&&&&&&&gameObject.layer
= LayerMask.NameToLayer(&Default&);
&&&&&&&&if(GUILayout.Button(&Hide&)){
&&&&&&&&&&&&gameObject.layer
= LayerMask.NameToLayer(&MyLayer&);
各种方案根据情况而定,酌情使用不同的方法.
好了,看到这,辛苦你了,大家帮帮忙,注册下号,有大用的(点击我的链接进入注册即可):
你想淘宝省钱么?你是淘宝达人么?现在有个好机会就可以在购物的同时,即可省下
一大笔钱。。赶紧来看看吧。。
MadeByLuckyDog
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:69656次
排名:千里之外
原创:16篇
转载:10篇
评论:16条
(1)(1)(3)(1)(1)(1)(1)(2)(1)(1)(2)(4)(7)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'Unity场景中通常有许多隐藏物体,我们需要获取它并且SetActive(true)。
例如,想要使BBB显示出来。通过GameObject.Find(“BBB”),得到一个空指针。
解决方法有两个:
1.Editor赋值
在脚本中声明共有变量GameObject,编辑器中直接拖拽赋值,然后SetActive(“true”)。
这种方法可行,但是灵活性太差。如果GameObject不确定,则实现不了。
2.Transform.Find()查找隐藏物体
GameObject parentObj = GameObject.Find("AAA")
GameObject bbb = parentObj.transform.Find("BBB").gameObject
bbb.SetActive(true)
使用这种方法,即使BBB物体是隐藏也能获取到,非常方便。
但是必须有个前提,AAA的Active必须为true。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:671次
排名:千里之外
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'Unity 3D中的 SetActive() 与 OnEnable()、OnDisable()要注意-GAD腾讯游戏开发者平台Unity 3D 多个摄像机之间的切换 - Samurai54 的专栏 - CSDN博客
Unity 3D 多个摄像机之间的切换
昨天在试着设置多个摄像机之间的切换,结果总是出差错。
在开始之前提醒几件事:(很不好意思,自己就傻乎乎地犯了下面的错误)
1.这一点是最最重要的,不要将相应的脚本拖拽到Camera上面,要将相应的脚本放到非摄像机的游戏对象上。(我自己是新建了一个:GameObject-&Create Empty)
2.不要偷懒生成了摄像机后不移动位置,结果三个摄像机在相同的位置,切换后看不出效果,还以为...
3.一定是先关闭所有的摄像机后(除了要使用的那一个),然后激活要用的那个摄像机
4.start()的时候还是要设置一下当前使用的摄像机的(虽然可以使用默认的,但是默认的并没有关闭其他的摄像机,在游戏中还可以见到其他相机的模型,当然是自己设置的效果更好的~)
正常的代码如下:
using UnityE
using System.C
public class CameraControl : MonoBehaviour {
private GameObject camera0;
private GameObject camera1;
private GameObject camera2;
void Start () {
camera0 = GameObject.Find(&Camera0&);
camera1 = GameObject.Find(&Camera1&);
camera2 = GameObject.Find(&Camera2&);
camera1.SetActive(false);
camera2.SetActive(false);
void Update () {
if(Input.GetKeyDown(KeyCode.E))
camera1.SetActive(false);
camera2.SetActive(false);
camera0.SetActive(true);
if(Input.GetKeyDown(KeyCode.R))
camera2.SetActive(false);
camera0.SetActive(false);
camera1.SetActive(true);
if(Input.GetKeyDown(KeyCode.T))
camera1.SetActive(false);
camera0.SetActive(false);
camera2.SetActive(true);
void OnGUI()
if(GUILayout.Button(&C1&,GUILayout.Height(50)))
camera1.SetActive(false);
camera2.SetActive(false);
camera0.SetActive(true);
if(GUILayout.Button(&C2&,GUILayout.Height(50)))
camera2.SetActive(false);
camera0.SetActive(false);
camera1.SetActive(true);
if(GUILayout.Button(&C3&,GUILayout.Height(50)))
camera1.SetActive(false);
camera0.SetActive(false);
camera2.SetActive(true);
当然了,如果摄像机比较多的话,我们可以偷个懒,用如下的方式:
public void CloseCameras()
camera1.SetActive(false);
camera2.SetActive(false);
camera0.SetActive(false);
void Update () {
if(Input.GetKeyDown(KeyCode.E))
CloseCameras();
camera0.SetActive(true);
if(Input.GetKeyDown(KeyCode.R))
CloseCameras();
camera1.SetActive(true);
if(Input.GetKeyDown(KeyCode.T))
CloseCameras();
camera2.SetActive(true);
只要注意到了“关闭所有摄像机”和“只打开使用的摄像机”,应该就没啥问题了~
最后是效果的展示:
我的热门文章

我要回帖

更多关于 unity 父对象 的文章

 

随机推荐