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
相关产品推荐
相关产品推荐

