2014-10-08 162 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

希望它有幫助! :)