From a7dacfaecc470aad5d172f1275047ec9dc0b6efb Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Mon, 10 Feb 2025 13:03:37 +0100 Subject: [PATCH] Fix `look_at_from_position()` usage in Your first 2D game tutorial The mob's orientation was previously shifted according to the player's height, which could lead to collision and movement issues that were difficult to diagnose. --- .../first_3d_game/04.mob_scene.rst | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/getting_started/first_3d_game/04.mob_scene.rst b/getting_started/first_3d_game/04.mob_scene.rst index 5c63fd6db46..233f34bc3d6 100644 --- a/getting_started/first_3d_game/04.mob_scene.rst +++ b/getting_started/first_3d_game/04.mob_scene.rst @@ -160,7 +160,11 @@ between ``-PI / 4`` radians and ``PI / 4`` radians. func initialize(start_position, player_position): # We position the mob by placing it at start_position # and rotate it towards player_position, so it looks at the player. - look_at_from_position(start_position, player_position, Vector3.UP) + # + # Ignore the player's height, so that the mob's orientation is not slightly + # shifted if the mob spawns while the player is jumping. + var target = Vector3(player_position.x, start_position.y, player_position.z) + look_at_from_position(start_position, target, Vector3.UP) # Rotate this mob randomly within range of -45 and +45 degrees, # so that it doesn't move directly towards the player. rotate_y(randf_range(-PI / 4, PI / 4)) @@ -172,7 +176,11 @@ between ``-PI / 4`` radians and ``PI / 4`` radians. { // We position the mob by placing it at startPosition // and rotate it towards playerPosition, so it looks at the player. - LookAtFromPosition(startPosition, playerPosition, Vector3.Up); + // + // Ignore the player's height, so that the mob's orientation is not slightly + // shifted if the mob spawns while the player is jumping. + Vector3 target = new Vector3(playerPosition.X, startPosition.Y, playerPosition.Z); + LookAtFromPosition(startPosition, target, Vector3.Up); // Rotate this mob randomly within range of -45 and +45 degrees, // so that it doesn't move directly towards the player. RotateY((float)GD.RandRange(-Mathf.Pi / 4.0, Mathf.Pi / 4.0)); @@ -271,7 +279,11 @@ Here is the complete ``mob.gd`` script for reference. func initialize(start_position, player_position): # We position the mob by placing it at start_position # and rotate it towards player_position, so it looks at the player. - look_at_from_position(start_position, player_position, Vector3.UP) + # + # Ignore the player's height, so that the mob's orientation is not slightly + # shifted if the mob spawns while the player is jumping. + var target = Vector3(player_position.x, start_position.y, player_position.z) + look_at_from_position(start_position, target, Vector3.UP) # Rotate this mob randomly within range of -45 and +45 degrees, # so that it doesn't move directly towards the player. rotate_y(randf_range(-PI / 4, PI / 4)) @@ -310,7 +322,11 @@ Here is the complete ``mob.gd`` script for reference. { // We position the mob by placing it at startPosition // and rotate it towards playerPosition, so it looks at the player. - LookAtFromPosition(startPosition, playerPosition, Vector3.Up); + // + // Ignore the player's height, so that the mob's orientation is not slightly + // shifted if the mob spawns while the player is jumping. + Vector3 target = new Vector3(playerPosition.X, startPosition.Y, playerPosition.Z); + LookAtFromPosition(startPosition, target, Vector3.Up); // Rotate this mob randomly within range of -45 and +45 degrees, // so that it doesn't move directly towards the player. RotateY((float)GD.RandRange(-Mathf.Pi / 4.0, Mathf.Pi / 4.0));