2014-10-08 158 views
0

我希望我发布在正确的部分。我知道可以在Unity中编写自定义代码,因此我有以下问题:显示/隐藏Unity 3D元素

  1. 想象一下Unity中的房屋模型。是否有可能有一个有助于隐藏/取消隐藏某些对象的代码?例如,字母“W”会隐藏/取消隐藏所有窗口,字母“C”会隐藏/取消隐藏所有列等。
  2. 如果有可能为此开发代码,那么工作流程是什么? Unity如何知道窗户是什么,门是什么?
  3. 更进一步..有可能有一个代码来取消隐藏项目的下一步。例如,第一步将是建立基金会。是否有可能有一个代码,可以取消隐藏下一步,例如,一楼的地板元素,敲击键盘按键?然后用同样的钥匙取消隐藏下一步可能是一楼的墙壁。而另一把钥匙可能会倒退吗?
  4. 如果这样的代码是可能的,你认为工作流程是什么? Unity如何知道哪个元素在哪一步?

回答

0

是只是有一个类的对象数组来显示/隐藏和另一个属性为什么按钮会这样做。然后只需要一个方法来隐藏/取消隐藏该类中的每个对象。在行为的更新方法中,只需检查输入并根据按下哪个按钮来调用该类的方法。

0

是否有可能有一个有助于隐藏/取消隐藏的代码?

是的,你可以做到这一点通过调用GameObject.SetActive()函数

door.SetActive(true); // door is a game object; 

怎么会团结知道什么是窗口,是什么门?

,您可以给窗/门的名称,然后按名称访问游戏对象

var door = GameObject.Find("MyDoor") as GameObject; 

是否可以有一个代码,将显示出下一步,比如说,1楼地板元素,键盘按键的敲击?

是的,你可以做到这一点下面的代码片段:

int step = 1; 
void Update() { 
    if (Input.GetKeyDown("space")){ 
     print("space key was pressed"); 
     step++; 
    } 

    if(step == 1) { 
    // do sth 
    } 
    else if(step == 2) { 
    // do sth 
    }    
} 

鉴于上面的代码中,你最后的答案可以很容易地推断。

0

我看到做你所问的2种方式。

1路

GameObject[] walls; 
walls = GameObject.FindGameObjectsWithTag("Wall"); 

foreach (GameObject wall in walls) 
{ 
    wall.setActive(true); 
} 

你将要做的,除了代码,是分配给那些反对正确的标签(如“长城”,“窗口”,“WatheverYouWillNeed”)。所以你可以通过给他们某种顺序(带标签)轻松找到所有对象。

最佳实践尖端

您可能要创建一个静态类“标签”,并设置公共常量字符串类中,所有的标签名称。

public static class Tags 
{ 
    public static const WINDOW_TAG = "Window"; 
    // ... more tags 
} 

第二方式

如果你想设置什么是唯一的“知名度”,您可能希望只修改照相机标记的渲染。它甚至不需要任何循环。当你想查看窗口时,你只需告诉你的相机渲染标签“窗口”。

// Turns on Windows Layer on mask using an OR operation 
private void Show() 
{ 
    camera.cullingMask |= 1 << LayerMask.NameToLayer("Window"); 
} 

// Turn off the bit using an AND operation with the complement of the shifted int: 
private void Hide() 
{ 
    camera.cullingMask &= ~(1 << LayerMask.NameToLayer("Window")); 
} 

它可能看起来很奇怪的第二个选项,但请记住,cullingMask位构成的,每一点是你的标签定义的层。 “Everything”剔除掩码是111111.例如,如果您只想看到Window,并且窗口是最后一个元素,则您的剔除掩码看起来像0000001

希望它有帮助! :)