重复功能 (unity3d/c#)

Repeat function (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);
        }
    }
}
}

我想要做的是我希望此脚本每 3.5 秒执行一次 OnTriggerEnter。如您所见,我正在使用 InvokeRepeating,但它似乎不起作用。我还尝试在 IENumerator OntriggerEnter 上更改 void OnTriggerEnter 然后 yield return new WaitForSeconds(5); - 它也没有用。我真的很困惑D:请帮忙!

您使用 InvokeRepeating 调用方法时遇到问题,原因有二:

  • InvokeRepeating 不能与具有参数的方法一起使用:您可能有 尝试调用方法:[...] 无法调用。控制台中的消息。
  • OnTriggerEnter是当游戏对象的collider设置为Trigger并且另一个collider进入它时Unity自动调用的方法:如@Hellium所说,调用这样手动方法是一个坏主意(与手动调用 StartUpdate 相同:这可能发生但在大多数情况下确实没有意义)。

希望对您有所帮助,

看来你是想解决当玩家在辐射范围内时玩家的 HP 会被消耗的问题。这是一个将使用大部分当前代码的解决方案,但不一定是最好的代码。我还想通知您 OnTriggerStay

is called once per frame for every Collider other that is touching the trigger.

也可以用来解决这个问题。我将使用您已经声明的 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 个播放器,它应该可以正常工作,但这支持多个播放器。如果您还有其他问题,请告诉我。