Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重复功能(unity3d/c#)_C#_Unity3d_Invoke_Repeat - Fatal编程技术网

重复功能(unity3d/c#)

重复功能(unity3d/c#),c#,unity3d,invoke,repeat,C#,Unity3d,Invoke,Repeat,首先,代码如下: using UnityEngine; using System.Collections; namespace UltimateSurvival { public class Radiation : MonoBehaviour { public GameObject radiationEffect; public EntityVitals Vitals { get { return m_Vitals; } } private Entity

首先,代码如下:

    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);
        }
    }
}
}
使用UnityEngine;
使用系统集合;
名称空间终极生存
{
公共类辐射:单一行为
{
公共游戏对象辐射效应;
公共实体生命体征{获取{返回m_生命体征;}
私人机构的重要信息Mu重要信息;
//用于初始化
void Start(){
调用重复(“OnTiggerEnter”,1.5f,3.5f);
}
//每帧调用一次更新
无效对撞机(对撞机其他)
{
如果(other.gameObject.tag==“玩家”)
{
辐射效应设置激活(真);
//产生返回新WaitForSeconds(5);
var entity=other.GetComponent();
if(实体)
{
var healthEventData=新的healthEventData(-Random.Range(7.0f,23.0f));
entity.ChangeHealth.Try(healthEventData);
}
//产生返回新WaitForSeconds(5);
}
}
void OnTriggerExit(碰撞器其他)
{
如果(other.gameObject.tag==“玩家”)
{
辐射效应设置激活(假);
}
}
}
}

我想做的是,我希望这个脚本每3.5秒执行一次OnTriggerEnter。正如您所看到的,我正在使用调用重复,但它似乎不起作用。我还尝试在IENumerator OnTriggerEnter上更改void OnTriggerEnter,然后返回新的等待秒(5)-它也不起作用。D:请帮忙

使用
invokererepeating
调用方法时遇到问题,原因有两个:

  • invokeerepeating
    不能与具有参数的方法一起使用:您可能有无法调用的尝试调用方法:[……]。在您的控制台中显示消息
  • ontriggenter
    是一种方法,当游戏对象的碰撞器设置为触发器,另一个碰撞器进入时,Unity会自动调用该方法:正如@Hellium所说,手动调用此类方法是个坏主意(与手动调用
    Start
    Update
    相同:这可能发生,但在大多数情况下都没有意义)

希望这有帮助,

如果玩家在辐射区域内,您似乎正在试图解决从玩家身上吸取HP的问题。这是一个解决方案,将使用您当前的大部分代码,但不一定是最好的代码。我还想通知您,其中

对于每个碰撞器(其他正在接触触发器的碰撞器)每帧调用一次

也可以用来解决这个问题。我将使用你已经声明的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);
        }
    }
}
公共游戏对象辐射效应;
公共实体生命体征{获取{返回m_生命体征;}
私人机构的重要信息Mu重要信息;
//声明一个包含玩家的列表。
List playersInArea=新列表();
//用于初始化
void Start(){
调用重复(“伤害玩家”,1.5f,3.5f);
}
无效伤害玩家(){
foreach(playersInArea中的var玩家){
var entity=player.GetComponent();
if(实体)
{
var healthEventData=新的healthEventData(-Random.Range(7.0f,23.0f));
entity.ChangeHealth.Try(healthEventData);
}
}
}
无效对撞机(对撞机其他)
{
如果(other.gameObject.tag==“玩家”)
{
playersInArea.Add(other.gameObject);
辐射效应设置激活(真);
}
}
void OnTriggerExit(碰撞器其他)
{
如果(other.gameObject.tag==“玩家”)
{
playersInArea.Remove(其他.gameObject);
如果(playersInArea.Count==0){
辐射效应设置激活(假);
}
}
}

类似的功能应该可以使用。如果您只有一个播放器,它应该可以使用,但这支持多个播放器。如果您有任何其他问题,请告诉我。

OnTiggerEnter似乎不是您代码中的IENumerator。请查看@iamIcarus,阅读我在脚本后所说的内容。>我还尝试在IEN上更改void OnTiggerEnterumerator ontiggerenter,然后返回新的WaitForSeconds(5);-它也不起作用不应手动调用。这些消息由Unity本身调用。在您的情况下,您自己调用它是没有意义的,因为您不知道刚体何时会进入您的触发器。确实。为了进一步解释@Hellium的意思,您正在尝试运行使用碰撞触发器的方法(OnTiggerEnter)(
碰撞器其他
)到。您没有在调用重复中指定任何
碰撞器其他
。请解释您试图解决的问题,以便避免。您永远不希望手动运行OnTiggerEnter,因此如果您这样做,您试图以一种不好的方式解决某个问题。如果角色在其中,您似乎试图解决消耗HP的问题辐射区域。我将向您展示如何做到这一点!这很有效,除了我必须添加“using System.Collections.Generic;”