2017-04-06 62 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 :这可能发生,但在大多数情况下确实没有意义)。

希望这有助于