You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity选中目标后按空格无法造成伤害问题求助

解决Unity选中目标后无法造成伤害的问题

核心问题分析

  1. testdamagetounits脚本的tuTarget方法未实现伤害逻辑,未访问目标的Target组件并传递伤害值。
  2. Target脚本的TakeDamage逻辑错误:每帧自动调用且damage变量未被外部赋值,无法正确响应伤害输入。
  3. 缺少从选中目标获取Target组件的正确逻辑。

分步修改方案

1. 完善testdamagetounits脚本

补全tuTarget方法,实现获取目标组件并传递伤害的逻辑:

public class testdamagetounits : MonoBehaviour
{
    int randomNumber;
    int lastNumber;
    int meleeDamage = 5;
    int takedamage;

    public static GameObject target;

    void Start()
    {
        target = null;
        randomNumber = Random.Range(0, 5);
    }
    
    void Update()
    {
        Randomize();
        
        if (Input.GetKeyDown(KeyCode.Space))
        {
            tuTarget();
        }
    }

    void Randomize()
    {
        randomNumber = Random.Range(0, 5);
        if (randomNumber == lastNumber)
        {
            randomNumber = Random.Range(0, 5);
        }
        lastNumber = randomNumber;
    }

    void tuTarget()
    {
        if(target != null)
        {
            // 获取目标身上的Target组件(若脚本挂在子对象,改用GetComponentInChildren<Target>())
            Target targetComp = target.GetComponent<Target>();
            if(targetComp != null)
            {
                // 计算最终伤害值,可结合随机数调整
                int finalDamage = meleeDamage + randomNumber;
                targetComp.TakeDamage(finalDamage);
                Debug.Log($"对目标造成{finalDamage}点伤害");
            }
            else
            {
                Debug.LogError("选中的目标未挂载Target脚本");
            }
        }
        else
        {
            Debug.Log("未选中任何目标");
        }
    }
}

2. 重构Target脚本

将TakeDamage改为带参数的主动调用方法,移除自动扣血逻辑,优化UI更新:

using UnityEngine;
using TMPro;

public class Target : MonoBehaviour
{
    public TextMeshProUGUI TextHealth;
    public TextMeshProUGUI TextDamage;
    public TargetHealthBar healthBar;

    [Header("Характеристики")]  
    public int maxHealth = 122;
    public int currentHealth;

    void Start()
    {
        currentHealth = maxHealth;
        healthBar.SetMaxHealth(maxHealth);
        SelectHealth.currentHealth = currentHealth;
        SelectHealth.maxHealth = maxHealth;

        UpdateHealthUI();
    }

    // 外部调用时传入伤害值,触发扣血
    public void TakeDamage(int damageAmount)
    {
        if(currentHealth <= 0)
        {
            TextDamage.text = "";
            return;
        }
        
        currentHealth -= damageAmount;
        currentHealth = Mathf.Max(currentHealth, 0); // 防止生命值为负
        
        TextDamage.text = "-" + damageAmount.ToString();
        UpdateHealthUI();

        if(currentHealth == 0)
        {
            Debug.Log("目标已死亡");
            // 可添加死亡逻辑:播放动画、销毁对象等
        }
    }

    // 统一更新UI,避免重复代码
    void UpdateHealthUI()
    {
        healthBar.SetHealth(currentHealth);
        TextHealth.text = $"{currentHealth}/{maxHealth}";
    }
}

3. 验证Select脚本的目标传递

你的Select脚本已正确将选中目标赋值给testdamagetounits.target,只需确认:

  • 所有带"Skelet"标签的对象(或其子对象)已挂载Target脚本
  • TextHealth、TextDamage、healthBar等UI引用已正确赋值

测试步骤

  1. 替换修改后的脚本,保存场景
  2. 给目标对象挂载Target脚本并完成UI引用赋值
  3. 进入游戏,点击选中目标后按空格键,查看生命值是否减少、UI是否正常更新

内容的提问来源于stack exchange,提问作者Spellflash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 10:05:23