显示/隐藏Unity 3D元素

时间:2014-10-08 21:01:32

标签: unity3d unityscript

我希望我在正确的部分发帖。我知道可以在Unity中编写自定义代码,因此我有以下问题:

  1. 想象一下Unity中的房子模型。是否有可能拥有一个有助于隐藏/取消隐藏某些对象的代码?例如,字母“W”将隐藏/取消隐藏所有窗口,字母“C”将隐藏/取消隐藏所有列等。
  2. 如果可以为此开发代码,那么工作流程是什么? Unity将如何知道什么是窗户?什么是门?
  3. 更进一步..是否可以拥有一个取消隐藏项目下一步的代码。例如,第一步是建立基础。是否有可能通过键盘键来取消隐藏下一步(例如,1楼楼层元素)的代码?然后使用相同的钥匙取消隐藏下一步可能是1楼的墙壁。还有可能用另一把钥匙倒退吗?
  4. 如果可以使用此类代码,您认为工作流程是什么? Unity将如何知道哪一个元素在哪一步?

3 个答案:

答案 0 :(得分:0)

是的,只需要一个包含要显示/隐藏的对象数组的类,以及用于执行该操作的按钮的另一个属性。然后只需要一个隐藏/取消隐藏该类中每个对象的方法。在行为的更新方法中,只需检查输入并根据按下的按钮调用类的方法。

答案 1 :(得分:0)


是否可以使用有助于隐藏/取消隐藏的代码?

是的,你可以通过调用GameObject.SetActive()函数

来做到这一点
door.SetActive(true); // door is a game object;

Unity如何知道什么是窗户?门是什么?

您可以为窗口/门指定名称,然后按名称访问游戏对象

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
    }               
}

鉴于上述代码段,您可以轻松推断出您的最后答案。

答案 2 :(得分:0)

我看到了两种做法的方法。

第一路

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

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

除了代码之外,您还必须为这些对象分配正确的标记(例如“Wall”“Window”“WatheverYouWillNeed”)。因此,您可以通过给它们某种顺序(带标签)轻松找到所有对象。

最佳做法提示

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

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

希望它有所帮助! :)