重复功能 (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所说,调用这样手动方法是一个坏主意(与手动调用 Start
或 Update
相同:这可能发生但在大多数情况下确实没有意义)。
希望对您有所帮助,
看来你是想解决当玩家在辐射范围内时玩家的 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 个播放器,它应该可以正常工作,但这支持多个播放器。如果您还有其他问题,请告诉我。
首先,这是代码:
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所说,调用这样手动方法是一个坏主意(与手动调用Start
或Update
相同:这可能发生但在大多数情况下确实没有意义)。
希望对您有所帮助,
看来你是想解决当玩家在辐射范围内时玩家的 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 个播放器,它应该可以正常工作,但这支持多个播放器。如果您还有其他问题,请告诉我。