02. Scene người chơi và các Input Actions (Player scene and input actions)


Trong hai bài học tiếp theo, chúng ta sẽ thiết kế scene cho người chơi (Player), đăng ký các hành động nhập liệu (Input Actions) tùy chỉnh và lập trình chuyển động. Kết thúc phần này, bạn sẽ có một nhân vật có thể di chuyển mượt mà theo 8 hướng.

Tạo Scene người chơi

  1. Trên menu trên cùng của Godot, chọn Scene -> New Scene (hoặc nhấn vào dấu + cạnh các tab scene đang mở).

  1. Nhấn vào nút Other Node (Node khác) trong bảng Scene dock.
  2. Tìm kiếm và chọn loại node CharacterBody3D.

  1. Đổi tên node gốc vừa tạo thành Player.
Cấu trúc Node
Player (CharacterBody3D)
📌 Lưu ý
**CharacterBody3D là gì?** Khác với `StaticBody3D` (dành cho vật cản tĩnh không di chuyển) hay `RigidBody3D` (chuyển động hoàn toàn do động cơ vật lý kiểm soát), `CharacterBody3D` được thiết kế chuyên biệt cho nhân vật do người chơi hoặc AI điều khiển. Bạn trực tiếp quyết định vận tốc và hướng di chuyển trong mã nguồn thông qua hàm `move_and_slide()`, trong khi động cơ vật lý xử lý va chạm với môi trường xung quanh.

Thiết lập mô hình 3D và khung xoay (Pivot)

Chúng ta sẽ tạo một node trung gian đóng vai trò là trục xoay (Pivot) cho mô hình 3D của nhân vật. Việc tách riêng trục xoay sẽ giúp chúng ta xoay hướng mặt của nhân vật bằng code mà không làm ảnh hưởng đến hoạt ảnh nhún nhảy sau này:

  1. Chọn node Player, nhấn Ctrl + A và thêm một node con Node3D.
  2. Đổi tên node này thành Pivot.
  3. Trong bảng FileSystem (ở góc dưới bên trái), mở thư mục art/.
  4. Kéo và thả file mô hình player.glb vào thả đè lên node Pivot trong cây Scene.

  1. Mô hình sẽ được khởi tạo thành một node con của Pivot. Đổi tên node mô hình này thành Character.

Cây node hiện tại:

Cấu trúc Node
Player (CharacterBody3D)
└── Pivot (Node3D)
    └── Character (player.glb)

💡 Mẹo hay
Định dạng `.glb` là định dạng file 3D tiêu chuẩn mở glTF 2.0 (được xuất từ các phần mềm như Blender). Nó nhỏ gọn, hiện đại và được Godot hỗ trợ tối ưu.

Thêm vùng va chạm (CollisionShape3D)

Như mọi thân vật lý khác, CharacterBody3D cần một hình dạng va chạm để không bị rơi xuyên qua mặt sàn:

  1. Chọn node gốc Player (đảm bảo chọn đúng Player, không chọn Pivot).
  2. Nhấn Ctrl + A để thêm một node con CollisionShape3D.

  1. Trong bảng Inspector, tại thuộc tính Shape, chọn New SphereShape3D (Hình cầu va chạm).

  1. Bạn sẽ thấy khung dây hình cầu màu xanh dương xuất hiện quanh nhân vật trong viewport 3D: - Kéo chấm tròn màu cam trên khung hình cầu trong viewport để phóng to nó (hoặc nhấp vào SphereShape3D trong Inspector và đặt Radius khoảng 0.8 mét). - Di chuyển vị trí của CollisionShape3D lên trên dọc theo trục Y (khoảng 0.8 m) sao cho đáy của hình cầu tiếp xúc vừa khít với mặt sàn phẳng (Y = 0).
💡 Mẹo hay
Để nhìn rõ khung va chạm mà không bị mô hình che khuất, bạn có thể tạm thời ẩn mô hình bằng cách nhấp vào biểu tượng con mắt bên cạnh node `Character` hoặc `Pivot`.

Lưu scene này lại bằng tổ hợp phím Ctrl + S, đặt tên file là player.tscn.


Cấu hình Input Actions (Hệ thống ánh xạ phím)

Để điều khiển nhân vật bằng bàn phím hoặc tay cầm (gamepad), Godot cung cấp hệ thống Input Map (Ánh xạ đầu vào). Thay vì viết cứng các phím cụ thể trong code, chúng ta gán một nhãn hành động (ví dụ: move_left) cho nhiều phím khác nhau.

  1. Vào menu Project -> chọn Project Settings... (Cài đặt dự án).

  1. Chuyển sang tab Input Map ở trên cùng.

  1. Nhập tên hành động vào ô trống phía trên và nhấn Add:

  • move_left
  • move_right
  • move_forward
  • move_back
  • jump

Gán phím cho từng hành động

Nhấn vào dấu + ở bên phải của mỗi hành động để thêm các phím:

1. Hành động move_left (Di chuyển sang trái)

  • Nhấn +, sau đó bấm phím Mũi tên trái (Left Arrow) trên bàn phím -> nhấn OK.
  • Nhấn + lần nữa, bấm phím A -> nhấn OK.

  • Hỗ trợ tay cầm: Nhấn +, trong cây lựa chọn tìm Joypad Axes -> chọn cần gạt trái nghiêng sang trái (Left Stick Left / Negative X Axis) -> nhấn OK.

2. Hành động move_right (Di chuyển sang phải)

  • Phím Mũi tên phải (Right Arrow).
  • Phím D.
  • Cần gạt trái tay cầm nghiêng sang phải (Left Stick Right / Positive X Axis).

3. Hành động move_forward (Di chuyển tiến tới)

  • Phím Mũi tên lên (Up Arrow).
  • Phím W.
  • Cần gạt trái tay cầm đẩy lên trên (Left Stick Up / Negative Y Axis).

4. Hành động move_back (Di chuyển lùi lại)

  • Phím Mũi tên xuống (Down Arrow).
  • Phím S.
  • Cần gạt trái tay cầm kéo xuống dưới (Left Stick Down / Positive Y Axis).

5. Hành động jump (Nhảy)

  • Phím cách (Space).
  • Nút A trên tay cầm Xbox / nút X trên PlayStation (Joypad Button 0 / Bottom Action Button).

Sau khi gán xong, bảng Input Map của bạn đã sẵn sàng hỗ trợ cả bàn phím và tay cầm chơi game. Nhấn Close để đóng hộp thoại Project Settings.


Tổng kết bài 2

Bạn đã chuẩn bị xong các thành phần cần thiết cho người chơi: - Tạo scene Player với node gốc CharacterBody3D. - Thêm cấu trúc Pivot chứa mô hình 3D player.glb. - Thiết lập vùng va chạm hình cầu SphereShape3D. - Định nghĩa các hành động move_left, move_right, move_forward, move_back, jump trong Input Map.