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

如何在Godot实现《核子王座》《挺进地牢》风格平台相机移动?脚本异常求助

在Godot中实现《核子王座》/《挺进地牢》风格相机移动的修复方案

你的脚本出现相机飞出画面的问题,核心原因是坐标空间混淆、更新顺序错误,且未限制偏移范围,以下是修复后的完整实现方案:

关键问题分析

  1. 直接强制赋值position = 玩家位置,导致相机位置突变,偏移计算的基准不断重置,结合全局坐标计算的鼠标偏移会被无限放大。
  2. 用相机自身position计算鼠标方向,而非以玩家为基准,逻辑上违背了"相机围绕玩家向鼠标倾斜"的设计目标。
  3. 未限制偏移最大值,导致鼠标离玩家过远时,相机偏移超出画面范围。

修复后的完整脚本

extends Camera2D

# 相机跟随平滑度(值越大跟得越紧)
const FOLLOW_SMOOTHNESS := 10.0
# 鼠标牵引强度(值越大偏移越明显)
const MOUSE_LEAN_STRENGTH := 0.15
# 相机最大偏移范围(防止飞出画面,可根据游戏分辨率调整)
const MAX_LEAN_OFFSET := Vector2(120, 80)

# 缓存玩家碰撞节点,避免重复查找
var player_collision: Node2D

func _ready() -> void:
    player_collision = get_node("/root/TEST Scene/Player/Player Collision")
    offset = Vector2.ZERO  # 初始化偏移为0

func _process(delta: float) -> void:
    # 1. 平滑跟随玩家全局位置
    position = lerp(position, player_collision.global_position, delta * FOLLOW_SMOOTHNESS)
    
    # 2. 计算基于玩家的鼠标偏移
    var mouse_global = get_global_mouse_position()
    # 获取鼠标相对于玩家的方向向量
    var mouse_dir_to_player = player_collision.global_position.direction_to(mouse_global)
    # 计算鼠标与玩家的距离,结合强度得到目标偏移
    var mouse_distance = player_collision.global_position.distance_to(mouse_global)
    var target_lean = mouse_dir_to_player * mouse_distance * MOUSE_LEAN_STRENGTH
    # 限制偏移在最大范围内
    target_lean = target_lean.clamped(MAX_LEAN_OFFSET)
    
    # 3. 平滑过渡到目标偏移
    offset = lerp(offset, target_lean, delta * FOLLOW_SMOOTHNESS)

核心修改说明

  • 缓存玩家节点:避免每次帧都执行get_node,提升性能同时减少路径错误风险。
  • 平滑跟随玩家:用lerp代替直接赋值,相机移动更自然,也避免位置突变导致的偏移计算异常。
  • 基于玩家的偏移计算:始终以玩家为基准计算鼠标方向,确保偏移逻辑符合"围绕玩家倾斜"的设计。
  • 偏移范围限制:通过clamped方法限制最大偏移,彻底解决相机飞出画面的问题。

额外优化建议

  • 平台游戏可单独限制Y轴偏移最大值,避免玩家跳跃时相机上下晃动过度。
  • 可根据玩家移动速度动态调整FOLLOW_SMOOTHNESS:玩家快速移动时降低平滑度,让相机跟得更紧。

参考视频内容(已翻译):

  • Wanderbots:《核子王座》风格相机移动实现教程
  • Throneful:《核子王座》相机系统深度解析

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:03:07