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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:08:59