This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
events:getting_started_with_godot_in_3d [2020/03/30 18:31] admin |
events:getting_started_with_godot_in_3d [2020/03/31 18:04] (current) admin |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Getting Started with Godot in 3D ====== | ||
==== Notes for everyone ===== | ==== Notes for everyone ===== | ||
* Create 3D spatial node, called World | * Create 3D spatial node, called World | ||
Line 12: | Line 12: | ||
* Add new child now to World, MeshInstance, CubeMesh | * Add new child now to World, MeshInstance, CubeMesh | ||
* drag below player, then scale to a floor size (20x20 or whatever) | * drag below player, then scale to a floor size (20x20 or whatever) | ||
- | * Click, Mesh, create convex static body | + | * Click, Mesh, create Trimesh static body |
* Save Player as Scene | * Save Player as Scene | ||
* Enter Player 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 | * Right Click player, attach script, default, template empty | ||
<code python> | <code python> | ||
+ | extends KinematicBody | ||
+ | |||
export var speed = 10 | export var speed = 10 | ||
export var acceleration = 5 | export var acceleration = 5 | ||
export var gravity = 0.98 | export var gravity = 0.98 | ||
export var jump_power = 30 | 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) | ||
+ | |||
</code> | </code> | ||
+ | * Test the above code out, now lets add some camera/head controls | ||
+ | <code python> | ||
+ | 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) | ||
+ | |||
+ | </code> | ||
+ | * Add gravity. Oops. | ||
+ | <code python> | ||
+ | velocity.y += gravity | ||
+ | </code> | ||
+ | * Add jumping | ||
+ | <code python> | ||
+ | if Input.is_action_just_pressed("jump"): | ||
+ | velocity.y += jump_power | ||
+ | </code> | ||
+ | * Define the floor to fix jumping | ||
+ | <code python> | ||
+ | if Input.is_action_just_pressed("jump") and is_on_floor(): | ||
+ | velocity.y += jump_power | ||
+ | |||
+ | velocity = move_and_slide(velocity, Vector3.UP) | ||
+ | </code> | ||
+ | * Lock the mouse to the window | ||
+ | <code python> | ||
+ | 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) | ||
+ | </code> | ||
+ | |||
+ | * 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 ===== | ==== Notes for me ===== | ||
Line 36: | Line 139: | ||
* F to focus on object, O to focus on origin | * F to focus on object, O to focus on origin | ||
* right mouse, WASD | * 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]] | ||