【问题标题】:Connecting Health Bar to Damage dealt将生命值条连接到造成的伤害
【发布时间】:2021-07-12 16:55:30
【问题描述】:

我是 Unity 新手,我和几个朋友一起尝试制作游戏。我试图将我造成的健康条与你可以通过射击刀造成的伤害联系起来。首先测试这个我用过:

void Update()
    {
        if (Input.GetKeyDown(KeyCode.Mouse1))
        {
            TakeDamage(25);
        }
      
    }

一切正常,当我按下鼠标 1 时,生命条工作。我的目标是,当一把刀击中敌人时,造成 25 点伤害,并且生命条显示敌人失去了生命值。然而,当刀子击中敌人时,什么也没有发生。你能帮我吗,因为我尝试修复这个问题 3 个小时,我有点沮丧。谢谢。

这是健康栏的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class healthbar : MonoBehaviour
{
    public Slider slider;

    public void SetMaxHealth(int health)
    {
        slider.maxValue = health;
        slider.value = health;
    }
    
    public void SetHealth(int health)
    {
        slider.value = health;
    }
}

这是敌人的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy_Follow : MonoBehaviour
{
    public float speed;
    public Transform target;
    public int damage = 25;
    public int maxHealth = 100;
    public int currentHealth;
    public healthbar healthBar;

    // Start is called before the first frame update
    void Start()
    {
        currentHealth = maxHealth;
        healthBar.SetMaxHealth(maxHealth);
        target = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Mouse1))
        {
            TakeDamage(25);
        }
        transform.position = Vector2.MoveTowards(transform.position, target.position, speed * Time.deltaTime);
    }

    public void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Knife")
        {
            TakeDamage(25);
        }
    }

    public void TakeDamage(int damage)
    {
        currentHealth -= damage;
        healthBar.SetHealth(currentHealth);
    }
}

【问题讨论】:

  • 你确定 a) OnTriggerEnter2D 被调用了吗?你的对象有Collider2D吗?其中一个对撞机是isTrigger 吗?如果有的话,你至少有一个Rigidbody2D 吗? b) 标签是否正确?通常使用CompareTag 而不是== 以避免因拼写错误而出现静默失败。 c)您在控制台中是否遇到任何错误?除了这些,我不明白为什么这不起作用
  • 啊,你把对撞机组件附加到你的敌人和刀上了吗?除非您将碰撞对撞机附加到您的组件,否则 OnTriggerEnter2D 不起作用。
  • 它可能不起作用的原因只是一个视图。 1. 错误的标签。 2. No Collider 3. Collider 未设置为触发器。我想这是最后一个,你可能会切换到OnCollisionEnter2D
  • @hunnedsd 您收到此错误是因为您使用 Collider2D 而不是 Collision2D。您的代码应如下所示void OnCollisionEnter2D(Collision2D collision) { // TODO }
  • 现在可以使用了。谢谢你们。你帮了我很多

标签: c# unity3d


【解决方案1】:

在发现你的碰撞器是不是触发器后,它应该是OnCollisionEnter2D,例如

public void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.CompareTag("Knife"))
    {
        TakeDamage(25);
    }
}

另见Colliders -> Collision Action Matrix

【讨论】:

    【解决方案2】:

    您可以尝试使用此代码来查看滑块是否可以正常工作。如果此代码确实有效(您可以使用检查器进行更改),那么它应该是碰撞/触发检测错误,仅此而已。

    public class SliderTest : MonoBehaviour {
    
        public Slider slider;
        public int maxHealth = 100;
        private int currentHealth = 100;
    
        public bool resetHealth = false;
        public bool damage = false;
    
        void Start() {
            slider = GetComponent<Slider>();
            SetMaxHealth(maxHealth);
        }
        
        void Update() {
            if(resetHealth) {
                resetHealth = false;
                SetHealth(maxHealth);
            }
            if(damage) {
                damage = false;
                SetHealth(currentHealth-10);
            }
        }
    
        public void SetMaxHealth(int health) {
            slider.maxValue = health;
            slider.value = 100;
        }
    
        public void SetHealth(int health) {
            currentHealth = health;
            slider.value = currentHealth;
        }
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      相关资源
      最近更新 更多