XNA Monogame 鼠标点击发射Projectile技术求助:如何计算鼠标位置实现发射
嘿,Sean,作为有2年C#经验的开发者,咱们直接来拆解这个问题——计算鼠标位置并发射投射物其实核心就是屏幕坐标转世界坐标+方向向量计算+投射物实例化与运动这几步,我给你捋个清晰的流程,附上手写的实用示例代码:
第一步:把鼠标屏幕坐标转成游戏世界坐标
游戏里鼠标的位置是屏幕像素坐标(比如(1920,1080)这种),但投射物是在游戏世界里运动的,所以必须先把屏幕坐标转换成世界空间的位置。以Unity为例(大部分C#游戏引擎逻辑类似):
// 获取主相机引用(提前赋值或者动态获取) Camera mainCam = Camera.main; // 获取当前鼠标的屏幕坐标(注意:Unity里屏幕坐标原点在左下角,Y轴向上) Vector3 mouseScreenPos = Input.mousePosition; // 2D游戏需设置Z值:等于相机到游戏平面的距离(比如相机在Z=-10,游戏平面在Z=0,那Z就设为10) mouseScreenPos.z = Mathf.Abs(mainCam.transform.position.z); // 转换为世界坐标 Vector3 mouseWorldPos = mainCam.ScreenToWorldPoint(mouseScreenPos); // 2D场景下把Z轴置0,避免深度干扰 mouseWorldPos.z = 0;
第二步:计算投射物的发射方向
有了鼠标的世界位置,再结合发射点(比如玩家位置、武器枪口位置)的坐标,就能算出投射物要飞的方向:
// 假设firePoint是你预设的发射点Transform(比如挂在玩家武器上的空物体) Vector3 firePointPos = firePoint.transform.position; // 计算方向向量:鼠标位置 - 发射点位置 Vector3 direction = mouseWorldPos - firePointPos; // 归一化方向向量(让长度固定为1,这样后续速度控制更精准) direction.Normalize(); // 2D场景可以转成Vector2,忽略Z轴 Vector2 direction2D = new Vector2(direction.x, direction.y);
第三步:实例化并驱动投射物
最后就是创建投射物实例,给它赋予运动的动力,这里分两种常用方式:
方式1:用刚体组件(适合物理驱动的投射物,比如子弹、弓箭)
// 提前在Inspector里赋值你的投射物预制体 public GameObject projectilePrefab; // 投射物飞行速度 public float projectileSpeed = 12f; void FireProjectile() { // 在发射点位置实例化投射物 GameObject projectile = Instantiate(projectilePrefab, firePointPos, Quaternion.identity); // 获取投射物的刚体组件 Rigidbody2D rb = projectile.GetComponent<Rigidbody2D>(); if (rb != null) { // 给刚体设置速度,方向×速度 rb.velocity = direction2D * projectileSpeed; } // 别忘了给投射物加销毁逻辑,比如5秒后自动销毁 Destroy(projectile, 5f); }
方式2:直接控制Transform移动(适合不需要物理的快速投射物,比如激光)
可以在投射物的脚本里写移动逻辑:
// 投射物自身的脚本 public float moveSpeed = 15f; private Vector2 moveDirection; // 外部传入方向 public void SetDirection(Vector2 direction) { moveDirection = direction; } void Update() { // 每一帧移动 transform.Translate(moveDirection * moveSpeed * Time.deltaTime); }
然后在发射方法里调用:
GameObject projectile = Instantiate(projectilePrefab, firePointPos, Quaternion.identity); projectile.GetComponent<ProjectileScript>().SetDirection(direction2D);
额外实用细节
- 触发发射:在Update里检测鼠标点击事件,比如
if (Input.GetMouseButtonDown(0)) FireProjectile();(0代表左键) - 投射物朝向:如果想要投射物对着鼠标方向,可以加一行
projectile.transform.rotation = Quaternion.FromToRotation(Vector2.up, direction2D);(2D场景) - 3D场景适配:3D下不用忽略Z轴,方向向量用Vector3,ScreenToWorldPoint的Z值设为相机到目标平面的距离即可。
内容的提问来源于stack exchange,提问作者Sean Yi
相关产品推荐
相关产品推荐

