2017-04-06 54 views
1

首先,這裏的代碼:復讀功能(unity3d/C#)所有的

using UnityEngine; 
using System.Collections; 

namespace UltimateSurvival 
{ 

public class Radiation : MonoBehaviour 
{ 

    public GameObject radiationEffect; 


    public EntityVitals Vitals { get { return m_Vitals; } } 
    private EntityVitals m_Vitals; 

    // Use this for initialization 
     void Start() { 

      InvokeRepeating ("OnTriggerEnter", 1.5f, 3.5f); 
     } 


    // Update is called once per frame 
     void OnTriggerEnter(Collider other) 
    { 
     if (other.gameObject.tag == "Player") 
     { 
      radiationEffect.SetActive(true); 

       //yield return new WaitForSeconds(5); 

       var entity = other.GetComponent<EntityEventHandler>(); 

       if(entity) 
       { 
        var healthEventData = new HealthEventData(-Random.Range(7.0f, 23.0f)); 
        entity.ChangeHealth.Try(healthEventData); 
       } 

       //yield return new WaitForSeconds(5); 


     } 


    } 
    void OnTriggerExit(Collider other) 
    { 
     if (other.gameObject.tag == "Player") 
     { 
      radiationEffect.SetActive(false); 
     } 
    } 
} 
} 

我想要做的是,我想這個腳本來執行OnTriggerEnter每3.5秒。正如你所看到的,我使用InvokeRepeating,但它似乎不起作用。我也試過更改void OnTriggerEnter on IENumerator OntriggerEnter然後返回新的返回WaitForSeconds(5); - 它也沒有工作。我很困惑D:請幫忙!

+0

OnTriggerEnter似乎不是你的代碼上的IENumerator。看看http://answers.unity3d.com/questions/350721/c-yield-waitforseconds.html – iamIcarus

+0

@iamIcarus閱讀我說的腳本後。我也試着改變IENumerator OntriggerEnter上的void OnTriggerEnter,然後返回新的WaitForSeconds(5); - 它也沒有工作。 – papi

+2

Unity消息(開始,更新,OnTriggerEnter,OnDestroy,....)不應該手動調用**。這些消息由Unity本身調用。在你的情況下,由於你不知道什麼時候剛體會進入你的觸發器,所以它**沒有意義。 – Hellium

回答

2

看來你想,如果玩家是輻射的區域內,解決從玩家的HP耗盡的問題。這是一種解決方案,它將使用大部分當前代碼,但並不是最好的代碼。我也想通知你OnTriggerStay,其中

被調用一次每幀碰撞其他觸摸觸發器。

也可以用來解決這個問題。我打算使用已經聲明的OnTriggerEnter和OnTriggerExit每3.5秒就會損壞區域內的每個玩家。

public GameObject radiationEffect; 
public EntityVitals Vitals { get { return m_Vitals; } } 
private EntityVitals m_Vitals; 

// Declare a list that will contain the players. 
List<GameObject> playersInArea = new List<GameObject>(); 

// Use this for initialization 
void Start() { 
    InvokeRepeating ("DamagePlayers", 1.5f, 3.5f); 
} 

void DamagePlayers() { 
    foreach (var player in playersInArea) { 
     var entity = player.GetComponent<EntityEventHandler>(); 

     if(entity) 
     { 
      var healthEventData = new HealthEventData(-Random.Range(7.0f, 23.0f)); 
      entity.ChangeHealth.Try(healthEventData); 
     } 
    } 
} 

void OnTriggerEnter(Collider other) 
{ 
    if (other.gameObject.tag == "Player") 
    { 
     playersInArea.Add(other.gameObject); 
     radiationEffect.SetActive(true); 
    } 
} 

void OnTriggerExit(Collider other) 
{ 
    if (other.gameObject.tag == "Player") 
    { 
     playersInArea.Remove(other.gameObject); 
     if (playersInArea.Count == 0) { 
      radiationEffect.SetActive(false); 
     } 
    } 
} 

類似的東西應該工作。如果你只有一個玩家,它應該完全相同,但是這支持多個玩家。讓我知道你是否還有其他問題。

+1

這工作,除了我不得不添加「使用System.Collections.Generic;」 – papi

+1

非常感謝! – papi

0

你必須調用使用兩種InvokeRepeating因爲原因你的方法問題:

  • InvokeRepeating不能與具有參數的方法使用:你可能有嘗試調用方法:[...] couldn別叫。消息在您的控制檯中。
  • OnTriggerEnter是,當遊戲對象的對撞機被設定爲觸發和另一對撞機進入它自動地被統一稱爲方法:如@Hellium所述,手動調用這樣的方法是一個壞主意(同手動調用StartUpdate :這可能發生,但在大多數情況下確實沒有意義)。

希望這有助於