重复功能(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
是一种方法,当游戏对象的碰撞器设置为触发器,另一个碰撞器进入时,Unity会自动调用该方法:正如@Hellium所说,手动调用此类方法是个坏主意(与手动调用ontriggenter
或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;”