繁体   English   中英

重复功能(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 ,然后让返回新的WaitForSeconds(5); -也没用 我真的很困惑D:请帮助!

似乎您要解决的问题是,如果播放器位于辐射区域之内,则会耗尽播放器的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个播放器,则应该全部相同,但是这支持多个播放器。 让我知道您是否还有其他问题。

由于两个原因,使用InvokeRepeating调用方法时遇到问题:

  • InvokeRepeating不能与具有参数的方法一起使用:您可能具有Trying to Invoke方法:无法调用。 控制台中的消息。
  • OnTriggerEnter是一种方法,当将游戏对象的对撞机设置为Trigger并输入另一个对撞机时,Unity会自动调用该方法:正如@Hellium所说,手动调用此类方法是一个坏主意(与手动调用StartUpdate相同:可能会发生,但是在大多数情况下都没有任何意义)。

希望这可以帮助,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM