如何实现球体武器在玩家范围内跟随鼠标移动?代码问题求助
解决球体武器跟随鼠标且基于玩家位置限制范围的问题
你的核心问题是:当前代码把鼠标位置相对于世界原点做了范围限制,而不是相对于玩家本身,所以玩家移动时,武器的活动范围不会跟着玩家同步移动,导致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
相关产品推荐
相关产品推荐

