Unity C#射击脚本实现子弹生成时克隆异常与坐标错误问题
问题1:对象指数级克隆的解决方法
- 根因:脚本被挂载到了多个对象上、且
bullet字段错误赋值了带该脚本的Glock对象,每次生成的克隆体也附带生成逻辑,每次点击所有存在的该脚本实例都会触发一次生成,导致数量指数增长 - 修复步骤:
- 单独制作子弹预设体:创建独立的子弹GameObject(按需添加碰撞体、Rigidbody、子弹模型等组件),存储为Prefab,不要使用Glock对象作为子弹预设
- 清理脚本挂载:确保场景中仅bulletSpawn这一个对象挂载了
spawnBullet脚本,Glock对象、子弹预设上均不挂载该脚本 - 脚本参数赋值:将做好的独立子弹预设拖入bulletSpawn挂载的
spawnBullet组件的bullet字段中
问题2:生成位置错误的解决方法
- 根因:代码中写死了生成坐标为世界坐标
(0,0,0),没有使用bulletSpawn自身的位置参数 - 修复方法:将
Instantiate方法的位置参数替换为transform.position(脚本挂载在bulletSpawn上,transform就对应bulletSpawn的变换组件,直接取它的世界坐标即可),旋转参数替换为transform.rotation保证子弹发射方向和枪口朝向一致
修正后完整代码
using UnityEngine; public class spawnBullet : MonoBehaviour { public GameObject bullet; void Update() { if (Input.GetButtonDown("Fire1")) { // 位置和旋转都取当前bulletSpawn的参数 GameObject newBullet = Instantiate(bullet, transform.position, transform.rotation); // 如需子弹自动向前飞行可取消下方注释,根据需求调整飞行速度数值 // newBullet.GetComponent<Rigidbody>().velocity = transform.forward * 20f; } } }
内容的提问来源于stack exchange,提问作者Titus
相关产品推荐
相关产品推荐

