UnityScript:更新健康功能
UnityScript: Update Health Function
我正在制作的游戏有角色和敌人。当角色被击中时关闭健康。如果角色可以避免被击中 10 秒,它将恢复 5 点生命值。如果又过了 10 秒,他仍然没有被击中,他会再获得 5 分,并且这种情况会一直发生,直到角色恢复完全健康。如果角色在 10 秒完成之前被击中,他会失去健康,时间重新开始。
目前,当我 运行 C# 脚本时,它会做所有事情,除了继续为玩家提供生命值。如果我被击中,它会记录时间。 10 秒过去了,它给了我健康,但在那之后 Update
函数不再继续给我健康,它只做了一次。我认为我的逻辑某处不正确。大家怎么看??
public Slider healthBar;
public float HitResetTimer; //Resetsthetimerto0whenihavebeenhitwithinthe10seconds;
bool beenHit; //Return true or false if ihave been hit
float hitTimer; //keeps track of time from 0 to 10 if i have not been hit
void Awake()
{
beenHit=false; //player has not been hit so= false
hitTimer=0.0f; //Set to 0 because i have not been hit yet so no time needs to be registered
}
void OnTriggerEnter(Collider other)
{
healthBar.value-=10;//If enemy hits character loses 10 points
beenHit= true; //Is set to true because i have been hit
hitTimer= HitResetTimer;//If cube hits something hitTimer is no longer time that has occured but reset to 0
}
void RestoreHealth()
{
if(!beenHit&& healthBar.value<100)
healthBar.value+=2;
}
//Usethisfor initialization
void Start () {
}
//Updateiscalledonceper frame
void Update () {
if(beenHit)
{
hitTimer -=Time.deltaTime;
if(hitTimer<0)
{
beenHit = false;
RestoreHealth();
}
}
}
在您的 Update
方法中:
if(hitTimer<0)
{
beenHit = false;
RestoreHealth();
}
从所有 if
中取出 RestoreHealth();
。
void Update () {
if(beenHit)
{
hitTimer -=Time.deltaTime;
if(hitTimer<0)
{
beenHit = false;
}
}
RestoreHealth();
}
重点是你检查 beenHit
以减少 hitTimer
。一旦 hitTimer < 0
设置 beenHit = false
并执行 RestoreHealth();
。在那之后,你有 beenHit = false
和一个 Update
方法,所有方法都在 if(beenHit)
中,它总是得到 false
状态。因此,您的代码永远不会到达 RestoreHealth();
,直到您在 OnTriggerEnter()
中设置 beenHit = true
,这又会重置计时器并再次等待 10 秒。
如何检查当前时间和角色上次被击中的时间之间的时间差。
float lastHit; // Holds last time character got hit
void Awake()
{
lastHit = Time.time;
}
void OnTriggerEnter(Collider other)
{
healthBar.value -= 100;//If enemy hits character loses 10 points
lastHit = Time.time;
}
void RestoreHealth()
{
if(healthBar.value<100)
healthBar.value+=2;
}
//Updateiscalledonceper frame
void Update () {
if (Time.time - lastHit > 10) // 10 seconds
{
RestoreHealth();
}
}
注意:你应该改变RestoreHealth()
方法来给健康有特定的延迟(比如1秒)而不是在每一帧。因为Update
会在匹配你的条件后每帧调用它。
我正在制作的游戏有角色和敌人。当角色被击中时关闭健康。如果角色可以避免被击中 10 秒,它将恢复 5 点生命值。如果又过了 10 秒,他仍然没有被击中,他会再获得 5 分,并且这种情况会一直发生,直到角色恢复完全健康。如果角色在 10 秒完成之前被击中,他会失去健康,时间重新开始。
目前,当我 运行 C# 脚本时,它会做所有事情,除了继续为玩家提供生命值。如果我被击中,它会记录时间。 10 秒过去了,它给了我健康,但在那之后 Update
函数不再继续给我健康,它只做了一次。我认为我的逻辑某处不正确。大家怎么看??
public Slider healthBar;
public float HitResetTimer; //Resetsthetimerto0whenihavebeenhitwithinthe10seconds;
bool beenHit; //Return true or false if ihave been hit
float hitTimer; //keeps track of time from 0 to 10 if i have not been hit
void Awake()
{
beenHit=false; //player has not been hit so= false
hitTimer=0.0f; //Set to 0 because i have not been hit yet so no time needs to be registered
}
void OnTriggerEnter(Collider other)
{
healthBar.value-=10;//If enemy hits character loses 10 points
beenHit= true; //Is set to true because i have been hit
hitTimer= HitResetTimer;//If cube hits something hitTimer is no longer time that has occured but reset to 0
}
void RestoreHealth()
{
if(!beenHit&& healthBar.value<100)
healthBar.value+=2;
}
//Usethisfor initialization
void Start () {
}
//Updateiscalledonceper frame
void Update () {
if(beenHit)
{
hitTimer -=Time.deltaTime;
if(hitTimer<0)
{
beenHit = false;
RestoreHealth();
}
}
}
在您的 Update
方法中:
if(hitTimer<0)
{
beenHit = false;
RestoreHealth();
}
从所有 if
中取出 RestoreHealth();
。
void Update () {
if(beenHit)
{
hitTimer -=Time.deltaTime;
if(hitTimer<0)
{
beenHit = false;
}
}
RestoreHealth();
}
重点是你检查 beenHit
以减少 hitTimer
。一旦 hitTimer < 0
设置 beenHit = false
并执行 RestoreHealth();
。在那之后,你有 beenHit = false
和一个 Update
方法,所有方法都在 if(beenHit)
中,它总是得到 false
状态。因此,您的代码永远不会到达 RestoreHealth();
,直到您在 OnTriggerEnter()
中设置 beenHit = true
,这又会重置计时器并再次等待 10 秒。
如何检查当前时间和角色上次被击中的时间之间的时间差。
float lastHit; // Holds last time character got hit
void Awake()
{
lastHit = Time.time;
}
void OnTriggerEnter(Collider other)
{
healthBar.value -= 100;//If enemy hits character loses 10 points
lastHit = Time.time;
}
void RestoreHealth()
{
if(healthBar.value<100)
healthBar.value+=2;
}
//Updateiscalledonceper frame
void Update () {
if (Time.time - lastHit > 10) // 10 seconds
{
RestoreHealth();
}
}
注意:你应该改变RestoreHealth()
方法来给健康有特定的延迟(比如1秒)而不是在每一帧。因为Update
会在匹配你的条件后每帧调用它。