![](/img/trans.png)
[英]How to make animation repeat on every keypress in unity (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所说,手动调用此类方法是一个坏主意(与手动调用Start
或Update
相同:可能会发生,但是在大多数情况下都没有任何意义)。 希望这可以帮助,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.