Cách nhập bảng sprite vào Godot
Godot 4 đọc bảng sprite theo ba cách; chọn sai khiến viết lại thiết lập hai lần. Hướng dẫn gồm AnimatedSprite2D với SpriteFrames, vùng AtlasTexture và đường tắt hframes/vframes trên Sprite2D thường: chức năng từng cách và xử lý bảng không có lưới thực.
Đưa texture vào dự án
Godot nhập tài nguyên bằng theo dõi hệ tệp. Chép PNG vào bất kỳ đâu trong thư mục dự án sẽ hiện trong FileSystem, cùng một .import tệp được tạo bên cạnh. Bạn không bao giờ sửa tệp đó thủ công; bạn đổi thiết lập trong bảng Import và nhấn Nhập lại.
Trước hết xử lý lọc, vì đây là cài đặt dễ thấy nhất với pixel art. Trong Godot 4, lọc texture nằm trên nút thay vì bước nhập, dưới CanvasItem → Texture → Filter. Đặt thành Nearest và các mép pixel cứng vẫn sắc. Đặt riêng từng node sẽ nhanh chóng trở nên phiền phức, nên thay đổi mặc định dự án: Project Settings → Rendering → Textures → rendering/textures/canvas_textures/default_texture_filter → Nearest. Mọi CanvasItem để ở Inherit sau đó nhận nó.
Khi bạn đang ở bảng Import, hãy để Mipmaps tắt cho sprite 2D vẽ gần kích thước gốc, và lưu ý Godot 4 chỉ nén texture sang định dạng VRAM khi bạn chọn VRAM Compressed. Giá trị mặc định Lossless là chế độ bạn cần cho pixel art; nén VRAM gây đúng các lỗi khối mà hình màu phẳng thể hiện rõ nhất.
Cách 1: AnimatedSprite2D và SpriteFrames
Đường cho mọi thứ hoạt ảnh, phần đa số dự án nên bắt đầu. AnimatedSprite2D là một node chứa một SpriteFrames tài nguyên — một tập hoạt ảnh được đặt tên, mỗi hoạt ảnh là danh sách texture có thứ tự với giá trị khung mỗi giây và cờ lặp.
- Thêm một AnimatedSprite2D vào cảnh của bạn.
- Trong Inspector, nhấp Sprite Frames thuộc tính và chọn New SpriteFrames. Bảng SpriteFrames mở ở cuối trình chỉnh sửa.
- Đổi tên hoạt ảnh mặc định từ default thành điều có ý nghĩa — walk, idle. Bạn sẽ tham chiếu các chuỗi này trong mã.
- Thêm khung bằng một trong hai nút trên thanh công cụ: Add Frames from Sprite Sheet (biểu tượng lưới) hoặc Add Frames from File(s) (biểu tượng tệp).
- Đặt FPS và bật/tắt lặp rồi phát trong bảng để kiểm tra thời gian trước khi nối mã.
Add Frames from Sprite Sheet
Chọn biểu tượng lưới mở hộp thoại để chọn PNG rồi mô tả bố cục: Horizontal và Vertical số lượng, cùng với Separation và Offset nếu sheet có lề hoặc khoảng cách. Bản xem trước cập nhật trực tiếp, rồi bạn nhấn các ô muốn chọn theo thứ tự mong muốn. Shift-nhấn chọn một dải.
Hai điểm: thứ tự chọn thành thứ tự khung, nhấp sai thứ tự phát sai. Dialog giả lưới đều như Grid By Cell Count Unity, không phát hiện nội dung hay tương đương Automatic. Lưới không thật thì không cứu.
Add Frames from File(s)
Chọn nhiều PNG riêng, chúng thành khung theo thứ tự Godot sắp, tức bảng chữ cái. Thêm số 0 đầu tên tệp — walk_01.png qua walk_12.png — nếu không khung 10 sẽ ngay sau khung 1. Đây là cách dễ làm đúng nhất, và là lý do cắt sheet trước thành tệp thường là quy trình thuận tiện hơn riêng trong Godot.
Cách 2: vùng AtlasTexture
Một AtlasTexture là một tài nguyên trỏ đến vùng của texture lớn hơn và hoạt động như texture riêng ở mọi nơi Godot nhận texture. Bạn tạo bằng cách đặt bất kỳ thuộc tính texture nào thành New AtlasTexture, gán bảng vào atlas thuộc tính, và nhập region hình chữ nhật (x, y, width, height).
Linh hoạt nhất và thủ công nhất. Tốt khi sprite vị trí tùy ý, nhiều node dùng mảnh khác cùng texture, hoặc tạo vùng bằng dữ liệu mã:
- Chủ đề giao diện lấy các phần nine-patch và biểu tượng từ một texture dùng chung.
- Tileset hoặc danh mục vật phẩm có script tạo AtlasTexture từ manifest JSON xuất kèm bảng.
- Sprite tĩnh dùng một lần, khi tạo tệp riêng có vẻ không cần thiết.
Phần filter_clip là thuộc tính đáng biết: bật nó ngăn texture lấy mẫu ngoài vùng của mình, là cách sửa vệt mảnh của sprite bên cạnh tràn vào dọc mép.
Cách 3: hframes và vframes trên Sprite2D
Một Sprite2D có ba thuộc tính giúp đọc sheet mà không cần thêm tài nguyên nào: hframes, vframes, và frame. Đặt hframes là 4 và vframes là 4, Godot chia texture thành lưới 4×4; đặt frame thành chỉ số từ 0 đến 15 sẽ hiển thị ô đó.
Đây là cách nhẹ nhất, tạo hoạt ảnh sạch từ track AnimationPlayer trên frame thuộc tính, hoặc từ vài dòng trong _process. Với bảng xuất từ công cụ, đó thực sự là tất cả những gì bạn cần.

Vì sao sheet không đều làm cả ba cách thất bại và cách khắc phục
Mọi phương pháp trên có cùng giả định: có thể mô tả bảng bằng toán. Add Frames from Sprite Sheet cần số lượng. hframes/vframes cần số lượng. AtlasTexture cần hình chữ nhật rõ, có thể đúng nhưng chỉ khi đo từng cái bằng tay.
Sheet từ mô hình tạo ảnh phá giả định đó. “Chu kỳ đi bộ 4×4” trông như lưới vì mô hình thấy hàng nghìn lưới, không vì tính ranh giới. Khe lệch vài pixel mỗi cột, tích lũy trái sang phải; cỡ đổi theo tư thế, nội dung lệch tâm. Đặt hframes 4: cột đầu ổn, cột hai hơi cắt, cột bốn cắt qua nhân vật.
Sửa chắc là ngừng mô tả sheet, bắt đầu đọc nó. Trên nền trong suốt, pixel là sprite (alpha trên không) hoặc nền (alpha không), hàng/cột hoàn toàn trong suốt đánh dấu ranh giới thật bất kỳ đâu. Cắt giữa khe, gọn từng phần theo nội dung, có khung riêng không phụ thuộc lưới giả định.
Đó là việc tab Magic Slice trong công cụ Cắt sprite sheet làm, với vài lượt tinh chỉnh để phát hiện các phần vẫn chứa hai sprite hoặc dư đệm. Xuất kết quả thành PNG riêng và nạp bằng Add Frames from File(s). Khi nhận diện tự động gặp khó khăn — sprite chạm nhau, vùng sáng trải qua canvas, nhân vật có phần tách rời — thẻ Thủ công & Có sẵn cho phép kéo từng đường lưới vào đúng khoảng trống, tức sáu lần kéo cho bảng mười sáu khung hình.
Nếu bảng có nền đặc thay trong suốt, chạy qua xóa nền trước. Làm một lần trên toàn sheet là một thao tác và một kết quả nhất quán; làm trên mười sáu khung riêng sau đó là mười sáu cơ hội bị lệch.
PNG riêng so với một bảng
| Một bảng | PNG riêng | |
|---|---|---|
| Công sức thiết lập | Thấp nếu lưới thật, cao nếu không | Luôn thấp |
| Chỉnh một khung | Xuất lại và cắt lại sheet | Thay một tệp |
| Sắp thứ tự khung | Thứ tự nhấp trong hộp thoại | Sắp tên — thêm 0 đầu |
| Lệnh vẽ | Gộp lệnh tốt — một texture | Nhiều texture hơn trừ khi tạo atlas |
| Xử lý bố cục không đều | Không | Có — mỗi tệp là một khung riêng |
Với phần lớn dự án 2D, chênh lệnh vẽ không phải nút thắt và sự thuận tiện tệp riêng tốt hơn. Nếu đến lúc đổi texture quan trọng, đóng khung hoàn chỉnh vào atlas như bước build thay vì dựng thành bảng khổng lồ cắt tay từ đầu.
Câu hỏi thường gặp
Pixel art mờ trong Godot 4. Thiếu gì?
Bộ lọc texture. Đặt rendering/textures/canvas_textures/default_texture_filter thành Nearest trong Project Settings, và kiểm tra Texture Filter riêng của node ở Inherit chứ không phải Linear chỉ định rõ. Nếu vẫn mềm, viewport có thể đang phóng thu không nguyên — xem stretch mode và scale mode trong Display → Window.
Nên dùng AnimatedSprite2D hay AnimationPlayer điều khiển Sprite2D?
AnimatedSprite2D cho hoạt ảnh từng khung đơn giản: được thiết kế riêng và cần ít thiết lập. AnimationPlayer khi cần đồng bộ thứ khác với khung: vị trí hitbox, kích hoạt âm thanh, phát hạt, khả năng hiển thị nút. Nhiều dự án cuối cùng dùng cả hai.
Một mảnh mỏng của khung tiếp theo hiện dọc cạnh sprite.
Lem do lấy mẫu ngay ngoài vùng. Chuyển Nearest, bật filter_clip nếu bạn dùng AtlasTexture, và xác nhận kích thước ô chia hết texture. Một hoặc hai pixel đệm trong suốt giữa sprite trong nguồn sẽ loại bỏ vấn đề vĩnh viễn.
Tôi có thể đổi khung bằng mã thay vì bảng hoạt ảnh không?
Có. Trên Sprite2D, gán vào frame thuộc tính trực tiếp. Trên AnimatedSprite2D, gọi play("walk") hoặc đặt frame khi tạm dừng. Điều khiển khung thủ công thường dùng cho những thứ như thanh máu được dựng từ các trạng thái sprite rời.
Cắt bảng thành khung trước
Các importer Godot đều giả lưới đều. Nếu không, cắt trong trình duyệt và tải bằng Add Frames from File(s). Magic Slice đọc alpha; Thủ công & Có sẵn cho tự đặt đường. Không có gì rời máy.
Mở Cắt bảng sprite