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

Unity3D中生成抛射物等待数秒后沿光标移动反向击中玩家如何解决

问题根因
  • 移动逻辑错误操作了抛射物预制体而非生成的实例:moveProjectile方法中你取的是projectileObj(预制体资源)的刚体组件赋值速度,预制体默认坐标通常为(0,0,0),当玩家位置在目标点前方时,计算出的方向就会反向指向原点,导致抛射物击中自己。
  • 目标点未锁定:你使用全局变量存储目标点destination,等待的2秒内准星移动会刷新destination的值,最终移动时用的不是生成抛射物那一刻的指向。
  • 额外风险:如果等待期间生成的抛射物实例被销毁/覆盖,移动时的坐标计算会出现异常。
修复方案
  • 生成抛射物时同步锁定当前目标点,和抛射物实例一起传入协程存储,避免全局变量刷新带来的数据错误。
  • 移动时直接操作生成的抛射物实例的刚体组件,不要修改预制体属性。
  • 执行移动前增加判空逻辑,避免抛射物已销毁时报错。
修复后代码
void crossHairPosition(){
    if (Physics.Raycast(ray, out hit, 100f, layer_Mask))
    {
        Debug.DrawLine(firePoint.position, hit.point, Color.green);
        destination = hit.point;
        crossHairPrefab.transform.position = ray.GetPoint(10);
        crossHairPrefab.transform.LookAt(Camera.main.transform);
    }
    else {
        destination = ray.GetPoint(1000);
    }
}

void spawnProjectile(){
    // 生成抛射物实例
    GameObject projectile = Instantiate(projectileObj, player.transform.position, Quaternion.identity);
    // 锁定生成时刻的目标点
    Vector3 spawnTarget = destination;
    // 把实例和目标点传入协程
    StartCoroutine(WaitForMove(2f, projectile, spawnTarget));
}

IEnumerator WaitForMove(float waitTime, GameObject projectile, Vector3 target){
    yield return new WaitForSeconds(waitTime);   
    MoveProjectile(projectile, target);
}

void MoveProjectile(GameObject projectile, Vector3 target){
    // 抛射物已销毁则直接返回
    if(projectile == null) return;
    Vector3 moveDir = (target - projectile.transform.position).normalized;
    // 给实例的刚体赋值速度,不操作预制体
    projectile.GetComponent<Rigidbody>().velocity = moveDir * 10f;
}

内容的提问来源于stack exchange,提问作者VAMSI KRISHNA YARLAGADDA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:15:02