U

Hỏi đáp Unity

47 câu hỏi mà câu nào cũng có cả đống thread trên diễn đàn chính thức của Unity, được trả lời trọn vẹn ngay tại đây. Câu nào cũng chỉ ra bản đầy đủ nằm ở đâu — bài hướng dẫn nếu đó là một công thức, bài học nếu đó là một chặng của khoá học.

01

Làm sao cho nhân vật di chuyển?

Chọn đúng một trong ba, đừng dùng cùng lúc hai cách: CharacterController cho nhân vật bạn điều khiển trực tiếp, Rigidbody cho vật để vật lý đẩy đi, và transform.Translate chỉ cho vật không va chạm. Mọi tốc độ đều phải nhân Time.deltaTime, không thì máy càng mạnh, game chạy càng nhanh.

Hướng dẫn · 17.09.2026Di chuyển nhân vật: ba cách, cách nào hợp với bạn8 phút →
02

Làm sao cho nhân vật nhảy, và không cho nó nhảy tiếp khi đang ở trên không?

Lệnh nhảy chỉ một dòng; phần khó là biết lúc nào chân đang chạm đất. Kiểm tra một hình cầu nhỏ ngay dưới chân nhân vật với layer Ground, và chỉ cho nhảy khi phép kiểm tra đó trả về true. Đừng kiểm tra vận tốc dọc có bằng 0 hay không — ở đỉnh cú nhảy nó cũng bằng 0.

Hướng dẫn · 17.09.2026Nhảy, và bước kiểm tra chạm đất giúp nó chạy đúng9 phút →
03

Làm sao xoay một vật, và Quaternion là gì?

Dùng Quaternion.Euler(x, y, z) khi bạn biết góc mình muốn, và Quaternion.LookRotation kèm RotateTowards hoặc Slerp để quay dần về phía một vật nào đó. Đừng bao giờ cộng thẳng vào transform.rotation: nó chứa bốn con số không phải là góc, ghi góc vào đó chỉ ra kết quả vô nghĩa.

Hướng dẫn · 17.09.2026Xoay vật: góc Euler, Quaternion, và cái nào bạn được đụng vào11 phút →
04

Làm sao cho camera bám nhân vật mà không bị giật?

Di chuyển camera trong LateUpdate, đừng dùng Update: LateUpdate chạy sau khi mọi thứ khác đã di chuyển xong, nên camera đọc được vị trí đã chốt. Nếu nhân vật dùng Rigidbody thì đặt thêm tuỳ chọn Interpolate của Rigidbody thành Interpolate — vật lý chạy theo nhịp khác với nhịp khung hình.

Hướng dẫn · 17.09.2026Camera bám theo không bị giật8 phút →
05

Làm sao biết người chơi đang nhắm vào đâu, hoặc đứng trên cái gì?

Physics.Raycast bắn một đường thẳng vô hình rồi báo lại collider đầu tiên nó gặp, kèm điểm trúng, khoảng cách và pháp tuyến bề mặt. Luôn truyền LayerMask và khoảng cách tối đa — thiếu hai thứ đó, tia sẽ kiểm mọi layer tới vô cực, và tia bắn từ camera góc nhìn thứ ba sẽ trúng nhân vật đứng trước nó đầu tiên.

Hướng dẫn · 17.09.2026Raycast: hỏi thế giới xem trước mặt có gì10 phút →
06

Làm sao sinh object bằng code?

Biến thứ đó thành prefab, giữ tham chiếu tới nó trong một trường public, rồi gọi Instantiate(prefab, position, rotation). Kéo prefab từ bảng Project vào trường đó — kéo nhầm bản đang nằm trong Hierarchy là lỗi gây ra một nửa số bug của spawner.

Hướng dẫn · 17.09.2026Instantiate: sinh prefab, và tái sử dụng chúng9 phút →
07

Làm sao cho một việc diễn ra dần theo thời gian, hoặc chờ rồi mới chạy?

Coroutine là một hàm bạn tạm dừng được: yield return new WaitForSeconds(1f) chờ một giây rồi chạy tiếp từ đúng dòng đó. Khởi động bằng StartCoroutine, giữ lại handle nếu sẽ có lúc cần dừng nó, và nhớ rằng coroutine sẽ dừng khi GameObject đang chạy nó bị tắt hoặc bị huỷ.

Hướng dẫn · 17.09.2026Coroutine: làm một việc dần dần theo thời gian mà không cần Update10 phút →
08

Làm sao cho giao diện vừa mọi kích thước màn hình?

Đặt Canvas Scaler thành Scale With Screen Size kèm một độ phân giải tham chiếu, rồi neo từng phần tử vào đúng góc hoặc cạnh của nó, đừng để nó neo ở giữa. Trên điện thoại có tai thỏ, co một object cha phủ toàn màn hình vào vùng Screen.safeArea để không có gì quan trọng nằm dưới phần khuyết.

Hướng dẫn · 17.09.2026Giao diện vừa mọi màn hình, kể cả máy tai thỏ11 phút →
09

Làm sao lưu tiến trình của người chơi?

Dùng PlayerPrefs cho vài thiết lập lặt vặt, và file JSON trong Application.persistentDataPath cho mọi thứ thật sự là trạng thái game. Ghi file trong cả OnApplicationPause chứ không chỉ OnApplicationQuit — trên điện thoại, Quit thường không bao giờ chạy.

Hướng dẫn · 17.09.2026Lưu tiến trình: PlayerPrefs, JSON, và khi nào dùng cái nào9 phút →
10

Làm sao build file APK và cài lên điện thoại Android?

Cài module Android Build Support, chuyển nền tảng sang Android, đặt package name của riêng bạn, rồi build. Thứ chặn phần lớn các lần build đầu tiên là Unity không tìm thấy đường dẫn SDK hay JDK; thứ gây phiền về sau là phát hành với package name mặc định com.DefaultCompany, vì package name không bao giờ đổi được sau khi app đã lên Google Play.

Hướng dẫn · 17.09.2026Từ dự án tới file APK trên điện thoại thật10 phút →
11

Vì sao nhân vật rơi xuyên qua sàn?

Bốn nguyên nhân, theo thứ tự nên kiểm tra: sàn không có Collider; một trong hai Collider bị tick Is Trigger; vật đi đủ xa trong một bước vật lý để nhảy qua cái sàn mỏng, mà Plane thì luôn mỏng; hoặc hai layer đang bị bỏ tick với nhau trong Collision Matrix. Với CharacterController còn có ca thứ năm: di chuyển nó bằng transform.position thay vì Move() là bỏ qua va chạm hoàn toàn.

bàiCảnh đầu tiên: sàn 3D phẳngCăn bản →
12

NullReferenceException nghĩa là gì?

Bạn đã dùng một biến đang rỗng. Bấm đúp vào dòng đỏ trong Console là nó mở đúng dòng gây lỗi; trên dòng đó, có một thứ bên trái dấu chấm đang null. Thủ phạm quen thuộc nhất là một ô trong Inspector chưa ai kéo gì vào, nó hiện là None và hoạt động như null.

bàiClass = componentCăn bản →
13

Vì sao biến public không hiện trong Inspector?

Kiểm tra Console trước: khi còn script nào trong dự án không biên dịch được, Unity vẫn chạy bản cuối cùng biên dịch thành công, nên trường bạn vừa thêm có trong file nhưng chưa có trong bản Unity đang chạy. Nếu không phải thì tên class không trùng khớp tên file, hoặc kiểu dữ liệu là thứ Unity không serialize được — Dictionary, interface, hay property có get và set.

bàiClass = componentCăn bản →
14

Vì sao OnTriggerEnter không bao giờ chạy?

Phải đủ cả bốn điều: ít nhất một trong hai vật có Rigidbody, ít nhất một trong hai collider được tick Is Trigger, tên hàm viết đúng OnTriggerEnter và nhận tham số Collider, và hai layer được bật với nhau trong Collision Matrix. CharacterController là ngoại lệ của điều đầu tiên: nó vẫn phát sự kiện trigger dù không có Rigidbody, miễn là bạn di chuyển nó bằng Move().

Hướng dẫn · 20.09.2026Va chạm và trigger: vì sao sự kiện không chạy9 phút →
15

Làm sao chuyển scene trong Unity?

Thêm mọi scene vào Scene List trong File > Build Profiles, rồi gọi SceneManager.LoadScene kèm tên scene. Việc đổi diễn ra ở khung hình kế tiếp, mọi thứ trong scene cũ bị huỷ, và chỉ object gốc có DontDestroyOnLoad sống sót — cùng với biến static và Time.timeScale, hai thứ không ai reset hộ bạn.

Hướng dẫn · 20.09.2026Chuyển scene: LoadScene, màn hình chờ, và thứ gì sống sót10 phút →
16

Singleton là gì, và nên viết GameManager thế nào?

Singleton là một object duy nhất đang sống, kèm một trường static trỏ tới nó, nên script nào cũng gọi được GameManager.Instance mà không cần giữ tham chiếu. Gán trường đó trong Awake, đọc trong Start, huỷ bản thứ hai sinh ra khi nạp lại scene, và chỉ gọi DontDestroyOnLoad khi manager thật sự phải sống lâu hơn scene.

Hướng dẫn · 20.09.2026Singleton: một GameManager mà cả game gọi được9 phút →
17

Prefab trong Unity là gì?

Prefab là một GameObject được lưu thành file trong bảng Project; các bản nằm trong cảnh đều bám theo nó, nên sửa file là đổi hết một lượt. Còn sửa một bản thì thay đổi đó chỉ là override của riêng bản ấy — hiện ở dạng chữ đậm, kèm Apply All và Revert All trong nút Overrides.

Hướng dẫn · 20.09.2026Prefab: cái file, các bản sao, và những chỗ sửa ở giữa8 phút →
18

Vì sao điện thoại báo Ứng dụng chưa được cài đặt?

Gần như luôn là xung đột chữ ký: package name đó đã ở trên máy từ một bản build ký bằng debug key khác. Chạy adb uninstall com.yourstudio.yourgame rồi cài lại — dữ liệu lưu trên máy cũng mất theo bản cũ.

Hướng dẫn · 22.09.2026Build game Unity ra APK không cài được: lỗi nào nguyên nhân nấy11 phút →
19

Sự cố khi phân tích gói tin nghĩa là gì?

Bộ cài không đọc được gì trong APK cả: file bị cắt hoặc bị đổi tên khi chuyển, một file .aab bị đổi thành .apk, Minimum API Level cao hơn máy, hoặc bản build chỉ ARM64 đưa lên máy 32-bit. Hãy đối số byte với file trên máy tính trước, vì việc đó chỉ mất mười giây.

Hướng dẫn · 22.09.2026Build game Unity ra APK không cài được: lỗi nào nguyên nhân nấy11 phút →
20

Vì sao game Unity vừa mở lên đã văng trên Android?

Chạy adb logcat -s Unity rồi mở game: lý do sẽ in ra trong vài giây, và dấu vết nêu tên file cùng số dòng là lỗi C# của chính bạn — thường vì scene chưa nằm trong Build Profiles hoặc một reference chưa set trong Inspector. Nếu không có dòng Unity nào, hãy build lại với Managed Stripping Level ở Minimal, vì IL2CPP có thể đã xoá kiểu mà chỉ reflection mới tới được.

Hướng dẫn · 22.09.2026Build game Unity ra APK không cài được: lỗi nào nguyên nhân nấy11 phút →
21

Vì sao game Unity đen màn hình trên Android mà trong editor vẫn ngon?

Vì điện thoại khởi động vào scene ở index 0 của Build Scenes, chứ không phải cái bạn đang mở; và scene thiếu trong danh sách đó thậm chí không được đóng gói. Nên LoadScene thất bại chỉ bằng một dòng log, còn menu lẽ ra bị nó thay thế thì vẫn nằm đó nửa sống nửa chết. Hãy kiểm danh sách trước khi động tới thiết lập render, và để adb logcat gọi tên nguyên nhân.

Hướng dẫn · 22.09.2026Game Unity bị đen màn hình khi build và chạy trên điện thoại12 phút →
22

Màn hình đen nhưng vẫn nghe game đang chạy. Là lỗi gì?

Logic còn sống, chỉ mất hình, nên hoặc là camera không có gì để vẽ, hoặc là giao diện đang phủ hết tất cả. Bỏ tick Canvas rồi build một lần: thế giới hiện ra nghĩa là cái vung nằm ở giao diện. Nếu không đổi gì, đặt Clear Flags thành Solid Color với màu nền thật chói rồi build tiếp — hồng nghĩa là camera trống, đen nghĩa là scene đó không có camera nào đang bật.

Hướng dẫn · 22.09.2026Game Unity bị đen màn hình khi build và chạy trên điện thoại12 phút →
23

Material trên điện thoại hoá hồng thay vì đen — cùng lỗi à?

Cùng một họ nhưng khác lỗi. Hồng nghĩa là không subshader nào trong file đó hỗ trợ nền tảng này, nên Unity vẽ chất liệu lỗi thay vào; đen nghĩa là shader đã được nhận còn biến thể bạn cần đúng lúc đó thì bị cắt mất hoặc driver từ chối. Tắt Auto Graphics API và thử OpenGLES3 không Vulkan trước khi động tới bất kỳ material nào.

Hướng dẫn · 22.09.2026Game Unity bị đen màn hình khi build và chạy trên điện thoại12 phút →
24

Unity CharacterController không di chuyển được, nên bắt đầu từ đâu?

Gắn một script tạm chỉ log vector input mỗi giây, rồi bấm Play và giữ W. Có số: input ổn, thủ phạm quen thuộc là field speed còn 0 vì public float speed; không có giá trị mặc định. Không có số: script không chạy — object đang tắt, component bị bỏ tick, hoặc dự án dùng Input System mới trong khi code gọi Input.GetAxis.

Hướng dẫn · 22.09.2026CharacterController không di chuyển được: bảy phép kiểm tra12 phút →
25

Vì sao nhân vật bò gần như không nhúc nhích?

Hai dạng: speed 0.001 thay vì 6, tức một milimét mỗi giây, hoặc deltaTime bị chia thay vì nhân, hoặc bỏ hẳn. Move() nhận mét của khung hình này, nên tốc độ mét/giây phải nhân Time.deltaTime. Bỏ deltaTime thì cùng nhân vật đó thành phụ thuộc số khung hình — nhanh gấp đôi trên điện thoại 120 Hz.

Hướng dẫn · 22.09.2026CharacterController không di chuyển được: bảy phép kiểm tra12 phút →
26

Nhân vật quay được nhưng không tiến về phía trước, vì sao?

Quay thì bỏ qua scale còn tiến thì không, nên hãy kiểm scale của Transform và của mọi object cha: một trục bằng 0 hoặc giá trị âm lật gương khiến capsule của CharacterController không còn thể tích, còn root bị scale thì chặn Move ở nơi phép tính chờ nó đi tiếp. Unity cần Transform ở 1, 1, 1 — hãy đặt kích thước model ở tab Model của importer.

Hướng dẫn · 22.09.2026CharacterController không di chuyển được: bảy phép kiểm tra12 phút →
27

Tự học Unity làm game mất bao nhiêu lâu?

Khoá này có 40 bài, tổng 447 phút tức 7,45 giờ. Làm đủ 5 bài tập cuối chặng đúng như chính đề bài ghi — 60–90 phút, rồi 3–4, 2–3, 3–4 và 3–5 giờ — thì tổng thật là 18–23 giờ, tương đương 35–46 buổi 30 phút, tức một đến hai tháng mỗi ngày học nửa tiếng.

Hướng dẫn · 22.09.2026Học Unity mất bao lâu? Con số thật từ chính khoá học11 phút →
28

Mỗi ngày học 30 phút có đủ không?

Đủ cho một bài: trung bình là 447 ÷ 40 = 11,2 phút, và riêng phần bài là 447 ÷ 30 = 14,9 buổi, tức khoảng 2 tuần nếu học mỗi ngày, 3 tuần nếu học 5 buổi mỗi tuần. Cộng phần bài tập thì vẫn phép tính đó ra 35–46 buổi.

Hướng dẫn · 22.09.2026Học Unity mất bao lâu? Con số thật từ chính khoá học11 phút →
29

Bao lâu thì làm được game của riêng mình và publish?

Không con số nào trong curriculum trả lời được câu đó, vì nó là chuyện phạm vi chứ không phải chuyện Unity. Điều khoá này nói gần nhất được: một game thứ hai dùng lại đúng những gì bài tập tab 02 và tab 05 dạy — di chuyển, ba skill, kẻ địch đuổi và đánh trả, một file APK — tốn 6–9 giờ, và chỉ khi art đã có sẵn.

Hướng dẫn · 22.09.2026Học Unity mất bao lâu? Con số thật từ chính khoá học11 phút →
30

Unity có miễn phí thật không, hay bản free chỉ là bản dùng thử?

Đó là một gói giấy phép chứ không phải bản thử: không hết hạn, không cần thẻ, và bạn phát hành game thương mại bình thường. Điều kiện là ngưỡng 200.000 USD doanh thu cộng vốn trong mười hai tháng gần nhất, và không build console nếu không có licence Pro.

Hướng dẫn · 22.09.2026Unity có miễn phí không? Bản free thật sự cho bạn gì11 phút →
31

Unity còn thu phí runtime theo lượt cài đặt không?

Không. Unity đã huỷ runtime fee ngày 12/9/2024, có hiệu lực ngay và không áp dụng cho bất kỳ game nào, rồi quay lại mô hình subscription tính theo ghế. Mọi lời cảnh báo về thu tiền theo lượt cài đều được viết trước ngày đó.

Hướng dẫn · 22.09.2026Unity có miễn phí không? Bản free thật sự cho bạn gì11 phút →
32

Khi nào thật sự cần mua Unity Pro?

Khi doanh thu cộng vốn của tổ chức trong mười hai tháng qua vượt 200.000 USD, hoặc khi bạn bắt buộc lên nền tảng đóng — Switch, PlayStation, Xbox, Vision Pro spatial. Học Unity và phát hành game đầu tay không nằm trong danh sách đó.

Hướng dẫn · 22.09.2026Unity có miễn phí không? Bản free thật sự cho bạn gì11 phút →
33

Làm game Unity có cần biết C# trước không?

Không, nhưng cần một chút: tab đầu dành bốn bài ngắn cho biến, hàm, class và if/for/List — đúng bằng lượng C# một game đầu tiên hỏi tới. Phần còn lại là Unity, và bạn học ngay trong cái project mình đang dựng.

Hướng dẫn · 22.09.2026Hướng dẫn làm game Unity: 5 chặng, đúng một project11 phút →
34

Game Unity đầu tiên mất bao lâu?

40 bài của khoá học tổng lại cỡ bảy tiếng rưỡi làm theo hướng dẫn, và hệ số thành thật để làm xong hẳn là 2 tới 3 lần: thời gian dư ra nằm ở bản build, frame rate và những phần chỉ project của bạn mới có. Một cuối tuần có thể cho bạn sân đấu chơi được; đi hết năm chặng mới có game trên điện thoại.

Hướng dẫn · 22.09.2026Hướng dẫn làm game Unity: 5 chặng, đúng một project11 phút →
35

Xem thêm tutorial có tốt hơn làm xong một project không?

Tutorial dạy phần giữa của game và dừng trước những thứ quyết định nó có phát hành được không — build settings, thiết bị, frame rate. Chúng chỉ tồn tại trong project của bạn, nên mười tutorial để lại kết quả là bạn bắt đầu được nhiều game mà không xong cái nào.

Hướng dẫn · 22.09.2026Hướng dẫn làm game Unity: 5 chặng, đúng một project11 phút →
36

Đã gắn Animator rồi mà animation không chạy, vì sao?

Có ba chỗ chặn nó, theo đúng thứ tự này. GameObject phải có component Animator và ô Controller phải có asset — để trống thì không chạy gì mà cũng chẳng báo lỗi. Clip phải nằm trong một state của Controller, và một state phải là state mặc định màu cam; clip nằm im trong cửa sổ Project thì không bao giờ được phát. Và transition ra khỏi state mặc định phải có điều kiện mà code thật sự set: gọi SetTrigger("Attack") thì tham số phải viết đúng Attack, đúng kiểu Trigger, và transition phải dùng nó. Mở cửa sổ Animator trong lúc game chạy — state nào đang phát sẽ sáng lên, nhìn là biết thiếu cái nào trong ba cái.

bàiMáy trạng thái AnimatorNhân vật & Chiến đấu →
37

Làm sao cho kẻ địch đuổi theo và đánh nhân vật?

Một phép đo khoảng cách chọn ra trạng thái, trạng thái chọn ra hành vi: xa hơn tầm phát hiện thì đứng yên, vào trong thì đi tới chỗ bạn, tới tầm tay thì vung theo nhịp hồi chiêu. Nhớ làm phẳng trục Y của vector hướng trước khi đo, không thì người chơi đứng trên khối sẽ bị tính là ở xa. Nếu sân có vật cản thì dùng NavMeshAgent và SetDestination thay vì tự dời transform — agent biết đi vòng qua khối, còn đường thẳng thì đâm vào rồi đứng đó.

bàiKẻ địch biết đuổi và đánh trảNhân vật & Chiến đấu →
38

Làm hệ thống skill có hồi chiêu thì làm thế nào?

Giữ skill ở dạng dữ liệu, đừng để nó là script. Một ScriptableObject giữ hồi chiêu, sát thương, tầm, icon, trigger animation và prefab hiệu ứng; script thi triển giữ một dictionary từ skill sang thời điểm sớm nhất được dùng lại. Tung skill khi đó là: Time.time đã qua mốc lưu chưa, rồi thì chạy animation, sinh hiệu ứng, trừ máu và lưu lại Time.time cộng hồi chiêu. Dùng Time.time chứ đừng dùng biến đếm ngược trừ dần mỗi khung hình — một con số, không sai lệch, và tắt bật object vẫn đúng.

bàiHệ thống skill có hồi chiêuNhân vật & Chiến đấu →
39

Bắn nhiều đạn là game giật, sửa thế nào?

Giật là do Instantiate với Destroy, không phải do viên đạn. Mỗi lần Destroy để lại rác cho bộ dọn rác, mà bộ dọn rác chạy là khựng nguyên một khung hình. Hãy tái sử dụng: tạo sẵn một danh sách đạn lúc Awake rồi tắt hết đi, mỗi phát bắn lấy một viên đang tắt, dời vào chỗ rồi bật lên; trúng thứ gì thì tắt nó đi chứ đừng destroy. Số lượng cố định, lúc chơi không cấp phát gì thêm, và cú khựng biến mất.

bàiĐạn, sát thương và hiệu ứngNhân vật & Chiến đấu →
40

Input System mới khác gì Input.GetKey cũ?

Cái cũ hỏi thẳng phần cứng mỗi khung hình, nên mỗi loại thiết bị lại phải thêm một nhánh trong code, và làm màn đổi phím thì gần như bất khả. Cái mới đặt một asset ở giữa: bạn khai một action tên Move hay Jump, gán bàn phím, tay cầm và cảm ứng vào nó riêng từng cái, còn code chỉ đọc action. Sau này thêm tay cầm là sửa asset, không phải sửa script nhân vật. Cài từ Package Manager, để Active Input Handling là Both trong lúc chuyển, và chuyển từng action một.

bàiInput System mớiCamera & Điều khiển →
41

Làm nút ảo và joystick cho game mobile thế nào?

Đừng viết đường điều khiển thứ hai. Hãy cho cái stick trên màn hình đẩy vào đúng input action mà bàn phím đang đẩy, rồi script nhân vật không bao giờ phải biết có cảm ứng. Một cái stick là hai Image — phần đế và phần núm — cộng một trình xử lý kéo, biến độ lệch của núm so với tâm thành một vector dài tối đa bằng một. Đặt cả lớp điều khiển trong một Canvas kiểu Screen Space Overlay, neo mỗi nút vào góc của nó, và nhớ chừa vùng an toàn trên máy có tai thỏ.

bàiĐiều khiển cảm ứng, joystickCamera & Điều khiển →
42

Có cần Cinemachine không hay tự viết camera bám là đủ?

Tự viết là đủ để bám theo nhân vật, và viết một lần thì rất đáng vì nó dạy bạn vì sao camera phải nằm trong LateUpdate. Cinemachine đáng giá ở bước sau: giảm chấn theo từng trục, vùng chết để cử động nhỏ không làm camera nhúc nhích, va chạm để góc nhìn không xuyên tường, và chuyển mượt giữa các camera cho đoạn cắt cảnh hay chế độ ngắm. Mấy thứ đó tự viết mất hàng tuần, còn cấu hình thì mất một buổi chiều. Đang học thì giữ script của bạn, tới lúc cần camera thứ hai thì chuyển.

bàiCinemachine và rung cameraCamera & Điều khiển →
43

Thêm địa hình với đèn xong cảnh tối thui, sửa sao?

Đổi gì xong mà tối thì gần như luôn là dữ liệu ánh sáng đã cũ, chứ không phải đèn sai. Mở Window rồi Rendering rồi Lighting và bấm Generate Lighting; thứ gì đánh dấu Static sẽ giữ nguyên ánh sáng lúc bake cho tới khi bạn bake lại. Kiểm thêm ba thứ: Directional Light còn bật và chúc xuống một góc chứ không nằm ngang đường chân trời, skybox vẫn còn được gán trong Environment, và Ambient không bị đặt thành màu đen. Nếu chỉ vài vật tối, thì chúng là static và đã bake lúc chưa có đèn.

bàiÁnh sáng và bầu trờiThế giới & Vòng lặp game →
44

Trong editor chạy mượt mà lên điện thoại tụt FPS, vì sao?

Editor chạy trên GPU máy bàn và không bị giới hạn nhiệt; điện thoại thì không có cả hai thứ đó. Đo trước khi sửa bất cứ gì: build bản development, nối profiler qua USB và xem khung hình đang nghẽn ở CPU hay GPU. Bốn thủ phạm quen thuộc là draw call do quá nhiều material rời, texture nhập ở 2048 mà chẳng ai nhìn thấy ở cỡ đó, bóng thời gian thực từ nhiều hơn một đèn, và post-processing quên tắt. Ngân sách 60 khung hình mỗi giây nghĩa là 16 mili giây cho tất cả — hãy quyết định tiêu vào đâu thay vì cắt bừa.

bàiNgân sách hiệu năng mobileXuất lên điện thoại →
45

Làm sao cho âm thanh phát ra từ một vị trí, và chỉnh âm lượng ở một chỗ?

Âm thanh có vị trí khi Spatial Blend của AudioSource kéo từ 2D sang 3D; để nguyên 2D thì nó phát đều nhau ở mọi nơi, và đó là lý do tiếng bước chân nghe như bám theo camera. Đặt khoảng cách rolloff để tiếng nhỏ dần trong một tầm hợp lý. Còn âm lượng thì đừng chỉnh tay từng nguồn: tạo một AudioMixer có các nhóm nhạc nền, hiệu ứng và giao diện, cho mọi nguồn đi vào nhóm của nó, rồi expose âm lượng từng nhóm thành tham số. Khi đó một thanh trượt trong phần cài đặt điều khiển cả một nhóm, và tắt tiếng lúc tạm dừng chỉ còn một dòng.

bàiÂm thanh và không khíThế giới & Vòng lặp game →
46

Project Unity thì commit gì và bỏ qua gì?

Commit Assets/, ProjectSettings/ và mọi file .meta — file .meta giữ id của từng asset, thiếu nó là tham chiếu thành missing script trên máy kế tiếp. Bỏ qua Library/, Temp/, obj/, Build/ và Logs/: Unity tự dựng lại chúng, chúng nặng vài gigabyte, và mỗi máy một khác. Trước khi có ai clone, đặt Version Control thành Visible Meta Files và Asset Serialization thành Force Text, không thì file scene vẫn là nhị phân và không bao giờ đọc được trong diff.

Hướng dẫn · 24.09.2026Git cho Unity: commit gì và bỏ qua gì10 phút →
47

Model import vào bị bé tí, bị xoay, hoặc trắng bệch là sao?

Ba chỗ lệch khác nhau, chỗ nào cũng sửa trong trình import chứ không sửa Transform. Bé tí hay to đùng là do đơn vị: tick Convert Units ở tab Model, hoặc đặt Scale Factor thành 100 cho file Blender. Nằm úp mặt là do Blender lấy Z làm hướng lên còn Unity lấy Y: tick Bake Axis Conversion, hoặc apply rotation trong Blender trước khi xuất. Trắng bệch là vì FBX chỉ mang tên material chứ không mang ảnh: chép texture vào, bấm Extract Materials rồi điền vào các ô. Còn hồng chói lại là chuyện khác — đó là thiếu shader, thường là material Built-in nằm trong project URP.

Hướng dẫn · 24.09.2026Import model 3D: tỉ lệ, hướng xoay và texture bị mất9 phút →

Tất cả bài hướng dẫn