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

Unity C#:如何将点击对象传递给Smite函数实现伤害销毁?

如何让Smite函数明确伤害和销毁的目标立方体?

核心问题是你的Smite函数没有接收点击到的目标对象引用,只需通过修改函数参数传递目标即可解决,同时要确保目标对象有管理血量的组件。以下是具体修改步骤:

1. 给立方体添加血量管理组件

先创建一个CubeHealth脚本(名字可自定义),挂载到所有可被Smite的立方体上,用来管理血量:

public class CubeHealth : MonoBehaviour
{
    public int Health = 50; // 初始化血量,可在Inspector面板中调整
}

2. 修改Smite函数,接收目标参数

把原来无参的Smite改成接收CubeHealth组件的版本(比传GameObject更安全,避免操作无血量的对象):

public void Smite(CubeHealth target)
{
    int AbilityDamage = Random.Range(7, 10); // 注意:Unity生成随机数需要用Random.Range,不是直接调用Range
    int Damage = crusaderscript.BaseDamage + AbilityDamage;
    
    target.Health -= Damage;
    if(target.Health <= 0)
    {
        Destroy(target.gameObject); // 通过组件获取对应的GameObject进行销毁
    }
}

3. 在点击检测脚本中传递目标对象

修改Update方法,获取点击对象的CubeHealth组件,调用Smite时传入该组件:

private void Update()
{
    if (HeroAbilities.ReadyingSmite && Input.GetMouseButtonDown(0))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit))
        {
            GameObject clickedObject = hit.collider.gameObject;
            // 获取目标的血量组件,确保只有带血量的对象才会触发Smite逻辑
            CubeHealth targetHealth = clickedObject.GetComponent<CubeHealth>();
            
            if(targetHealth != null)
            {
                HeroAbilities.Smite(targetHealth);
            }
        }
    }
}

关键注意点

  • 必须给所有要被Smite的立方体挂载CubeHealth脚本,否则点击后不会触发伤害逻辑。
  • 原代码中的Range(7,10)要改为Random.Range(7,10),Unity中生成随机整数需要调用Random类的静态方法。
  • 传递CubeHealth组件而非GameObject,能避免误操作无血量的对象,同时直接操作组件更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:00:13