【问题标题】:How to Damage Player after each Second if he is on Spikes?如果玩家在尖刺上,如何在每一秒后对玩家造成伤害?
【发布时间】:2019-11-19 22:02:43
【问题描述】:

我得到了 Spikes 和 bool onSpikes,它告诉玩家是否处于 onSpikes 状态。 目前,如果玩家处于 onSpikes 状态,生命值会不断下降。

if(onSpikes)
    {
        health -= 0.01f;            
    }

但我认为这不是一个好的解决方案,因为我处于 void Update() 中,而且我无论如何都希望 Health 下降到更大的部分(比如每秒 -0.2f)。

我已经尝试过构建一个方法并使用 Invoke,但是这样我的玩家并没有失去生命值。 代码:

    private void Update(){
        Debug.Log("Player on Spikes: "+SpikeDMG.onSpikes);
        bar.localScale = new Vector3(health,1f);

        if(SpikeDMG.onSpikes)
        {
            Invoke("doDmg",1);

        }


        //Wenn leben unter 0 fällt ==> starte szene neu
        if(health <=0){
             int scene = SceneManager.GetActiveScene().buildIndex;
            SceneManager.LoadScene(scene, LoadSceneMode.Single);
            Time.timeScale = 1;
            SpikeDMG.onSpikes = false;
        }
    }

    void doDmg(){
        health -= 10/100;
    }

}

感谢所有可以提供帮助的人!

【问题讨论】:

  • 你能提供更多代码吗?
  • 您能否提供您尝试 Invoke 的完整示例?像这样的标准方法是使用InvokeRepeating(编辑:时间参数,方法开始的时间不能为0!)和CancelInvoke一旦玩家不再受到伤害。

标签: c# unity3d


【解决方案1】:

您想要做的是使用某种时间戳,当您应该执行下一个操作时。它也被描述为herehere

private float spikeDamageAt= 0.0f;

void update() {    
    if(onSpikes && Time.time >= spikeDamageAt) {
        health -= 0.01f;
        spikeDamageAt= Time.time + 1.0f; // for 1 seconds
    }
}

【讨论】:

  • 好,但我将变量命名为 spikeDamageAt 而不是通用的 timeStamp 那个 cat 与任何事物相关。
  • @trollingchar 更有意义,我只是在快速调整找到的解决方案以适应 OP 代码。要编辑它
猜你喜欢
  • 2018-09-14
  • 2020-09-03
  • 2020-05-18
  • 1970-01-01
  • 2021-11-09
  • 2014-05-20
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多