Unity相机发射预制体:如何实现随鼠标位置调整左右发射方向
解决Unity相机发射预制体随鼠标方向调整的问题
嘿,我完全懂你的困扰——现在你的球体不管鼠标在屏幕左还是右,都一个劲往屏幕中间飞,根本没跟着鼠标方向走对吧?这问题核心出在脚本的发射方向计算逻辑上,和相机Inspector设置关系不大,咱们来把它改过来:
问题根源
你当前的代码应该是基于屏幕中心的射线来计算发射方向,而不是鼠标所在位置对应的屏幕坐标射线。所以不管鼠标在哪,球体都只会朝着屏幕中心的方向飞。
修改后的完整代码
下面是调整后的脚本,我把关键逻辑标出来了:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerShoot : MonoBehaviour { // 拖拽你的球体预制体到这里 public GameObject projectilePrefab; // 调整发射力度 public float launchForce = 15f; void Update() { // 按下鼠标左键发射(你可以改成自己的触发键) if (Input.GetMouseButtonDown(0)) { ShootAtMouseDirection(); } } void ShootAtMouseDirection() { // 1. 获取当前鼠标的屏幕坐标(屏幕左下角是(0,0),右上角是(Screen.width, Screen.height)) Vector3 mouseScreenPosition = Input.mousePosition; // 2. 从主相机向鼠标位置发射一条射线,把屏幕坐标转换成世界空间的方向 Ray mouseRay = Camera.main.ScreenPointToRay(mouseScreenPosition); // 3. 创建预制体,发射点设为相机位置(你也可以改成枪头之类的自定义位置) GameObject newProjectile = Instantiate(projectilePrefab, transform.position, Quaternion.identity); // 4. 给球体刚体加力,方向就是射线的方向 Rigidbody projectileRb = newProjectile.GetComponent<Rigidbody>(); if (projectileRb != null) { // 用Impulse模式瞬间施加力,符合发射的手感 projectileRb.AddForce(mouseRay.direction * launchForce, ForceMode.Impulse); } else { Debug.LogWarning("你的预制体上没有Rigidbody组件!加力会无效哦"); } } }
关键细节说明
- 相机标签:确保你的主相机已经勾选了
MainCamera标签,不然Camera.main会找不到相机,代码会报错 - 刚体组件:你的球体预制体必须添加
Rigidbody组件,而且要把Use Gravity打开(如果需要重力效果),不然加力后球体不会动 - 正交相机适配:如果你的相机用的是正交投影,射线方向的计算要改一下,因为正交相机的射线是平行的,把方向计算改成这样:
然后用Vector3 worldMousePos = Camera.main.ScreenToWorldPoint(new Vector3(mouseScreenPosition.x, mouseScreenPosition.y, Camera.main.nearClipPlane)); Vector3 shootDirection = (worldMousePos - transform.position).normalized;shootDirection来加力就行
关于Inspector设置
其实这个问题基本不用调相机的Inspector,除非你相机的投影模式选错了(比如本来想用透视却选了正交),或者相机的Field of View太极端导致方向看起来奇怪,但核心还是脚本逻辑的问题。
内容的提问来源于stack exchange,提问作者zach
相关产品推荐
相关产品推荐

