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
- 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ở).

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

- Đổi tên node gốc vừa tạo thành
Player.
Player (CharacterBody3D)
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:
- Chọn node
Player, nhấnCtrl + Avà thêm một node conNode3D. - Đổi tên node này thành
Pivot. - Trong bảng FileSystem (ở góc dưới bên trái), mở thư mục
art/. - Kéo và thả file mô hình
player.glbvào thả đè lên nodePivottrong cây Scene.

- 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ànhCharacter.
Cây node hiện tại:
Player (CharacterBody3D)
└── Pivot (Node3D)
└── Character (player.glb)

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:
- Chọn node gốc
Player(đảm bảo chọn đúngPlayer, không chọnPivot). - Nhấn
Ctrl + Ađể thêm một node conCollisionShape3D.

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

- 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.8mét). - Di chuyển vị trí củaCollisionShape3Dlên trên dọc theo trục Y (khoảng0.8m) 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).

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.
- Vào menu Project -> chọn Project Settings... (Cài đặt dự án).

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

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

move_leftmove_rightmove_forwardmove_backjump

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.