纳米AI给出的教程

in STEEM CN/中文7 days ago

1. 简要的实现思路说明

这个街机风格飞行游戏的核心实现思路是:

  • 使用CharacterBody3D作为飞机主体,利用Godot 4的物理系统
  • 实现两种状态:地面状态(只能前进和转向)和飞行状态(可以俯仰和偏航)
  • 通过速度阈值控制状态切换,达到最小起飞速度后进入飞行状态
  • 使用插值函数实现平滑的机身倾斜效果,增强视觉真实感
  • 简化物理模型,专注于游戏性而非真实空气动力学

2. Godot操作步骤(初学者详细版)

步骤1:创建新项目

  1. 打开Godot 4.3+
  2. 点击"新建项目"
  3. 选择项目路径,输入项目名称"easy_flight_template"
  4. 点击"创建并编辑"

步骤2:创建场景结构

  1. 在场景树中,点击"+"按钮创建"3D场景"
  2. 创建以下节点结构:
    • CharacterBody3D(重命名为"Plane")
      • MeshInstance3D(重命名为"Mesh")
        • BoxMesh(作为临时飞机模型)
      • CollisionShape3D
        • BoxShape3D
      • Camera3D(作为主摄像机)

步骤3:设置输入映射

  1. 点击菜单"项目"→"项目设置"
  2. 选择"输入映射"选项卡
  3. 添加以下输入动作:
    • throttle_up:映射到W键或上箭头
    • throttle_down:映射到S键或下箭头
    • roll_left:映射到A键或左箭头
    • roll_right:映射到D键或右箭头
    • pitch_up:映射到空格键
    • pitch_down:映射到Shift键

步骤4:创建地面

  1. 在场景树根节点下创建"MeshInstance3D"(重命名为"Ground")
  2. 为Ground添加"PlaneMesh"资源
  3. 调整PlaneMesh的size为100x100
  4. 设置Ground的位置为(0, -2, 0)

步骤5:创建脚本

  1. 选择Plane节点
  2. 在检查器中点击"附加脚本"
  3. 将脚本命名为"plane.gd"
  4. 粘贴下面的完整代码

步骤6:调整摄像机

  1. 选择Camera3D节点
  2. 设置其位置为(0, 5, 10)
  3. 设置其旋转为(-30, 0, 0),使其俯视飞机

步骤7:测试运行

  1. 点击右上角的"播放"按钮
  2. 使用设置好的按键测试飞行控制

3. 完整的GDScript代码块

extends CharacterBody3D

# 飞行参数
var min_flight_speed = 10.0
var max_flight_speed = 30.0
var turn_speed = 0.75
var pitch_speed = 0.5
var level_speed = 3.0
var throttle_delta = 30.0
var acceleration = 6.0

# 状态变量
var forward_speed = 0.0
var target_speed = 0.0
var velocity = Vector3.ZERO
var turn_input = 0.0
var pitch_input = 0.0
var grounded = false

func _ready():
    # 确保重力设置正确
    gravity = 9.8

func get_input(delta):
    # 油门控制
    if Input.is_action_pressed("throttle_up"):
        target_speed = min(forward_speed + throttle_delta * delta, max_flight_speed)
    if Input.is_action_pressed("throttle_down"):
        var limit = 0.0 if grounded else min_flight_speed
        target_speed = max(forward_speed - throttle_delta * delta, limit)
    
    # 转向输入(只在有速度时允许转向)
    turn_input = 0.0
    if forward_speed > 0.5:
        turn_input = Input.get_action_strength("roll_left") - Input.get_action_strength("roll_right")
    
    # 俯仰输入
    pitch_input = 0.0
    if not grounded:
        # 飞行状态下可以俯冲
        pitch_input -= Input.get_action_strength("pitch_down")
    # 达到最小飞行速度后可以爬升
    if forward_speed >= min_flight_speed:
        pitch_input += Input.get_action_strength("pitch_up")

func _physics_process(delta):
    get_input(delta)
    
    # 应用旋转
    # 俯仰控制(绕X轴旋转)
    if pitch_input != 0:
        transform.basis = transform.basis.rotated(transform.basis.x, pitch_input * pitch_speed * delta)
    
    # 偏航控制(绕Y轴旋转)
    if turn_input != 0:
        transform.basis = transform.basis.rotated(Vector3.UP, turn_input * turn_speed * delta)
    
    # 机身倾斜效果
    var mesh_node = $Mesh
    if mesh_node:
        if grounded:
            # 地面状态时机身保持水平
            mesh_node.rotation.y = 0
        else:
            # 飞行状态时机身根据转向倾斜
            var target_roll = turn_input * 0.5  # 限制倾斜角度
            mesh_node.rotation.y = lerp(mesh_node.rotation.y, target_roll, level_speed * delta)
    
    # 速度插值
    forward_speed = lerp(forward_speed, target_speed, acceleration * delta)
    
    # 计算前进速度(沿-z方向)
    velocity = -transform.basis.z * forward_speed
    
    # 应用重力
    if not is_on_floor():
        velocity.y -= gravity * delta
    else:
        velocity.y = -1.0  # 轻微下压确保接触地面
    
    # 移动并碰撞检测
    move_and_slide()
    
    # 更新地面状态
    grounded = is_on_floor()
    
    # 调试信息(可选)
    if Input.is_action_just_pressed("ui_accept"):  # 按回车显示状态
        print("状态: ", "地面" if grounded else "飞行", 
              " 速度: ", forward_speed, 
              " 目标速度: ", target_speed)

func _process(delta):
    # 更新摄像机跟随(可选改进)
    var camera = get_node_or_null("../Camera3D") if get_parent() else null
    if camera and camera is Camera3D:
        # 简单的摄像机跟随逻辑
        var target_pos = global_position + Vector3(0, 5, 10)
        camera.global_position = camera.global_position.lerp(target_pos, delta * 2.0)
        camera.look_at(global_position)

4. 代码说明

主要改动说明(从Godot 3到Godot 4):

  • KinematicBody 改为 CharacterBody3D
  • is_on_floor()move_and_slide() 方法保持不变但API略有更新
  • 重力系统需要显式设置 gravity 属性
  • 3D向量操作使用 Vector3 类型

核心功能实现:

  1. 状态管理:通过 grounded 变量和速度阈值控制地面/飞行状态切换
  2. 平滑控制:使用 lerp 函数实现速度和机身倾斜的平滑过渡
  3. 简化物理:忽略空气动力学,专注于游戏性
  4. 输入响应:响应多按键输入,实现复合动作

运行项目后,你可以使用W/S键控制油门,A/D键转向,空格/Shift键控制俯仰。飞机在地面时只能前进和转向,达到起飞速度后即可升空飞行。
以上内容由AI搜集并生成,仅供参考

Sort:  

Upvoted! Thank you for supporting witness @jswit.

Coin Marketplace

STEEM 0.09
TRX 0.30
JST 0.033
BTC 111682.58
ETH 3964.89
USDT 1.00
SBD 0.58