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

