====== Getting Started with Godot in 3D ====== ==== Notes for everyone ===== * Create 3D spatial node, called World * Add child node, create KinematicBody, called Player * Add child node to player, type Collision Shape, type capsule * Make vertical. Transform x by 90 degrees. * Click capsule shape dropdown, Set radius to 0.75, height to 1.25. * To player, add child node, type spatial, name it head * Add child node to head, type camera, move it to around 0.9 on the Y axis * Add a child to the player node, add meshinstance with shapre capsule * Size the capsule to the collision mesh - click on capusulemesh then 0.75 radius, height 1.25 and transform rotate 90 on x * Add new child now to World, MeshInstance, CubeMesh * drag below player, then scale to a floor size (20x20 or whatever) * Click, Mesh, create Trimesh static body * Save Player as Scene * Enter Player scene * edit input map (Project -> Project Settings -> Input Map) * add move_forward, move_backward, move_left, move_right and jump * assign keys (WASD, space) * Right Click player, attach script, default, template empty extends KinematicBody export var speed = 10 export var acceleration = 5 export var gravity = 0.98 export var jump_power = 30 onready var head = $Head onready var camera = $Head/Camera var velocity = Vector3() func _physics_process(delta): var head_basis = head.get_global_transform().basis var direction = Vector3() if Input.is_action_pressed("move_forward"): direction -= head_basis.z elif Input.is_action_pressed("move_backward"): direction += head_basis.z if Input.is_action_pressed("move_left"): direction -= head_basis.x elif Input.is_action_pressed("move_right"): direction += head_basis.x direction = direction.normalized() velocity = velocity.linear_interpolate(direction * speed, acceleration * delta) velocity = move_and_slide(velocity) * Test the above code out, now lets add some camera/head controls extends KinematicBody export var speed = 10 export var acceleration = 5 export var gravity = 0.98 export var jump_power = 30 export var mouse_sensitivity = 0.3 onready var head = $Head onready var camera = $Head/Camera var velocity = Vector3() var camera_x_rotation = 0 func _input(event): if event is InputEventMouseMotion: head.rotate_y(deg2rad(-event.relative.x * mouse_sensitivity)) var x_delta = event.relative.y * mouse_sensitivity if camera_x_rotation + x_delta > -90 and camera_x_rotation + x_delta < 90: camera.rotate_x(deg2rad(-x_delta)) camera_x_rotation += x_delta func _physics_process(delta): var head_basis = head.get_global_transform().basis var direction = Vector3() if Input.is_action_pressed("move_forward"): direction -= head_basis.z elif Input.is_action_pressed("move_backward"): direction += head_basis.z if Input.is_action_pressed("move_left"): direction -= head_basis.x elif Input.is_action_pressed("move_right"): direction += head_basis.x direction = direction.normalized() velocity = velocity.linear_interpolate(direction * speed, acceleration * delta) velocity = move_and_slide(velocity) * Add gravity. Oops. velocity.y += gravity * Add jumping if Input.is_action_just_pressed("jump"): velocity.y += jump_power * Define the floor to fix jumping if Input.is_action_just_pressed("jump") and is_on_floor(): velocity.y += jump_power velocity = move_and_slide(velocity, Vector3.UP) * Lock the mouse to the window func _ready(): Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) func _process(delta): if Input.is_action_just_pressed("ui_cancel"): Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) * I think that's as far as we'll get in the first session, I'll make a start on [[Getting started with Godot in 3D Part 2|part two]] though. ==== Notes for me ===== * Axis, blue is Z (left to right generally), green is Y (up and down), X is red, back and forward (depth) * Explain viewports: * move mode: * middle mouse - change position * shift middle, move around in 3d space * right mouse - change angle * rotate mode: * middle rotate around object * mouse wheel zoom * F to focus on object, O to focus on origin * right mouse, WASD * Ctrl + Left click for inline help ==== Further reading/viewing ==== * This tutorial is based on [[https://www.youtube.com/channel/UCdU9e4eNsJif0rBrBiYRb5g|Code with Tom's]] Youtube series [[https://www.youtube.com/watch?v=UV-bhtb3734|Make and FPS in Godot]]. Part two is [[https://www.youtube.com/watch?v=Y_2oiLjOx54|here]]. * [[https://www.youtube.com/watch?v=49awsu1VJbo|Building 3D levels]]