【问题标题】:Repeat function (unity3d/c#)重复功能(unity3d/c#)
【发布时间】:2017-09-01 04:17:03
【问题描述】:

首先,代码如下:

    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:请帮忙!

【问题讨论】:

  • OnTriggerEnter 似乎不是您代码上的 IENumerator。看看answers.unity3d.com/questions/350721/…
  • @iamIcarus 阅读了我在脚本之后所说的话。 > 我也尝试在 IENumerator OntriggerEnter 上更改 void OnTriggerEnter,然后 yield return new WaitForSeconds(5); - 它也没有工作。
  • Unity 消息(Start、Update、OnTriggerEnter、OnDestroy ......)不应手动调用。这些消息由 Unity 本身调用。在您的情况下,您自己调用它没有意义,因为您不知道刚体何时会进入您的触发器。
  • 确实如此。进一步解释@Hellium 在说什么;您正在尝试运行使用碰撞触发器 (Collider other) 的方法 (OnTriggerEnter)。您没有在 InvokeRepeating 中指定任何 Collider other。请解释您要解决的问题,以便避免XY problem。你永远不想手动运行 OnTriggerEnter,所以如果你这样做,你就是在试图以一种糟糕的方式解决问题。
  • 如果角色在辐射区域内,您似乎尝试解决耗尽HP的问题。我会告诉你如何做到这一点!

标签: c# unity3d invoke repeat


【解决方案1】:

如果玩家在辐射区域内,您似乎正在尝试解决玩家生命值流失的问题。这是一个将使用您当前大部分代码的解决方案,但不一定是最好的代码。我还想通知您OnTriggerStay,它

每帧对触碰触发器的每个 Collider 调用一次。

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

【讨论】:

  • 这行得通,除了我必须添加“ using System.Collections.Generic;”
【解决方案2】:

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

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

希望对你有帮助,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    相关资源
    最近更新 更多