2016-07-16 63 views
2

我遇到了一些邏輯問題和遊戲中發生的行爲。Unity,加電碰撞問題

我想實現一個加電,這個加電只是停止那個字符一段時間。所以要做到這一點,我只是禁用他的劇本,所以他什麼都不做。現在這是行得通的,但問題是我找不到一種方法在5秒後啓用腳本。我想停止角色2秒。

回答

3

你的代碼是錯誤的。你應該使用Invoke

它非常簡單。

喜歡的東西...

void ApplyPenalty() 
{ 
yourPauseSystem = true; 
Debug.Log("starting penalty.."); 
Invoke("EndPenalty", 5f); 
} 

void EndPenalty() 
{ 
yourPauseSystem = false; 
Debug.Log(" ...ended penalty"); 
} 

不要忘記Debug.Log語句。

注意,最好ApplyPenalty(和EndPenalty)應

ACTUALLY在那些遊戲中的對象。

實際上將該代碼放在這些遊戲對象上,而不是在「碰撞對象代碼」中。你懂了?

所以你的情況,適用的刑罰,它會是這樣的..

void OnCollisionEnter(Collision c) 
{ 
if ((c.gameObject.tag == "Character")) 
    c.GetComponent<YourHerosCode?().ApplyPenalty() 
} 

你看到了什麼?

您必須使用物理圖層系統。你真的不得不用它來在Unity中發生衝突。您必須使用「物理網格」 ......

enter image description here

指出哪些可以用哪些碰撞。在你的評論中,你說他們「不會碰撞」,但是你絕對可以使任何東西碰撞(或不碰撞)。

請注意,在實踐中,一切都需要它自己的物理層,在Unity中。

當然你的英雄,敵人等都會有自己的圖層。提示:當然「敵方射彈」和「玩家射彈」需要它們自己的獨立層,兩者都需要。

+0

好的,但你應該按照我說的做:)我的朋友的關鍵是(見編輯)你的「懲罰」代碼應該是「在」英雄 - 你知道我的意思嗎?你需要將代碼移動到你的英雄,你看到了嗎? – Fattie

+0

夠公平的。開始玩樂! – Fattie

+0

你絕對不得不使用圖層,我的朋友!必須的。物理層。 – Fattie

1

如果NullReference位於此行gameObject.GetComponent<PlayerControls>().enabled = true;可能是因爲您嘗試引用禁用組件。

嘗試在啓動()的一個變種指定給組件

var playerController = gameObject.GetComponent<PlayerControls>(); 

,然後用它來指代它並啓用/禁用:

playerController.enable = true; //or false