最终效果
敌人代码
简单定义一个受伤方法
public class BasicEnemy : MonoBehaviour { [Header("Stats")] public int health; public void TakeDamage(int damage) { health -= damage; if (health <= 0) DestroyEnemy(); } public void DestroyEnemy() { Destroy(gameObject); } }
配置
控制飞镖
代码控制飞镖插在目标上
public class ProjectileAddon : MonoBehaviour { // 伤害值 public int damage; private Rigidbody rb; // 刚体组件引用 private bool targetHit; // 是否已经击中目标的标识 private void Start() { rb = GetComponent<Rigidbody>(); // 获取子弹的刚体组件 } private void OnCollisionEnter(Collision collision) { // 排除角色 if (collision.gameObject.CompareTag("Player")) return; // 确保只粘附在第一个击中的目标上 if (targetHit) return; else targetHit = true; // 检查是否击中了敌人 if (collision.gameObject.GetComponent<BasicEnemy>() != null) { // 获取被击中的敌人组件 BasicEnemy enemy = collision.gameObject.GetComponent<BasicEnemy>(); // 对敌人造成伤害 enemy.TakeDamage(damage); // 销毁子弹 // Destroy(gameObject); } // 确保子弹粘附到表面 rb.isKinematic = true; // 确保子弹随着目标移动 transform.SetParent(collision.transform); } }
配置参数,这里简单用个长条代替飞镖
投掷方法
public class ThrowingTutorial : MonoBehaviour { [Header("References")] public Transform cam; // 相机引用 public Transform attackPoint; // 攻击点引用 public GameObject objectToThrow; // 待投掷的物体 [Header("Settings")] public int totalThrows; // 总投掷次数 public float throwCooldown; // 投掷冷却时间 [Header("Throwing")] public KeyCode throwKey = KeyCode.Mouse0; // 投掷按键,默认鼠标左键 public float throwForce; // 投掷力量 public float throwUpwardForce; // 投掷上抛力量 bool readyToThrow; // 是否准备好投掷的标识 private void Start() { readyToThrow = true; } private void Update() { if (Input.GetKeyDown(throwKey) && readyToThrow && totalThrows > 0) { Throw(); } } //投掷 private void Throw() { readyToThrow = false; // 实例化待投掷的物体 GameObject projectile = Instantiate(objectToThrow, attackPoint.position, cam.rotation); // 获取刚体组件 Rigidbody projectileRb = projectile.GetComponent<Rigidbody>(); // 计算投掷方向 Vector3 forceDirection = cam.transform.forward; RaycastHit hit; //检测从相机位置沿着相机正前方发射的500f射线是否与场景中的物体相交 if (Physics.Raycast(cam.position, cam.forward, out hit, 500f)) { //则更新投掷的方向为从攻击点到命中点的单位方向向量 forceDirection = (attackPoint.position - hit.point).normalized; } // 添加力量 Vector3 forceToAdd = forceDirection * throwForce + transform.up * throwUpwardForce; projectileRb.AddForce(forceToAdd, ForceMode.Impulse); totalThrows--; // 实现投掷冷却 Invoke(nameof(ResetThrow), throwCooldown); } private void ResetThrow() { readyToThrow = true; } }
攻击点
配置参数
效果