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

如何实现球体武器在玩家范围内跟随鼠标移动?代码问题求助

解决球体武器跟随鼠标且基于玩家位置限制范围的问题

你的核心问题是:当前代码把鼠标位置相对于世界原点做了范围限制,而不是相对于玩家本身,所以玩家移动时,武器的活动范围不会跟着玩家同步移动,导致maxDistance始终以世界原点为中心,无法适配玩家位置变化。

修改后的代码

public Transform weaponParent;
public float maxMoveSpeed = 10;
public float smoothTime = 0.3f;
Vector2 currentVelocity;
[SerializeField] private float maxDistance = 6f;
// 如果脚本没挂在Player对象上,需要手动引用Player的Transform
[SerializeField] private Transform playerTransform;

void Awake()
{
    // 若脚本挂在Player上,自动获取自身Transform
    if (playerTransform == null)
        playerTransform = transform;
}

void LateUpdate()
{
    // 1. 获取鼠标世界位置
    Vector2 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    // 2. 计算鼠标相对于玩家的偏移量
    Vector2 offsetFromPlayer = mouseWorldPos - (Vector2)playerTransform.position;
    // 3. 限制偏移量的最大长度,确保武器在玩家周围maxDistance范围内
    Vector2 clampedOffset = Vector2.ClampMagnitude(offsetFromPlayer, maxDistance);
    // 4. 计算武器的目标世界位置
    Vector2 targetPos = (Vector2)playerTransform.position + clampedOffset;
    // 5. 平滑移动武器到目标位置
    weaponParent.position = Vector2.SmoothDamp(weaponParent.position, targetPos, ref currentVelocity, smoothTime, maxMoveSpeed);
}

关键修改说明

  • 改为基于玩家位置计算偏移量,再限制范围,确保武器始终以玩家为中心,在maxDistance半径内跟随鼠标
  • 把FixedUpdate换成LateUpdate:鼠标输入属于帧更新逻辑,LateUpdate在所有Update执行后运行,能避免画面抖动,更适合UI/跟随类逻辑
  • 增加了Player Transform的自动引用逻辑,适配脚本不同挂载位置的情况

额外优化建议

如果武器需要始终朝向鼠标,可以在移动后添加旋转逻辑:

// 计算武器朝向鼠标的角度
float angle = Mathf.Atan2(clampedOffset.y, clampedOffset.x) * Mathf.Rad2Deg;
weaponParent.rotation = Quaternion.AngleAxis(angle, Vector3.forward);

内容的提问来源于stack exchange,提问作者rinq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:40:26