Computer >> Hướng Dẫn Máy Tính >  >> Xử Lý Sự Cố >> Android

Cách tạo game Android cơ bản với Unity

Trong tutorial Appuals trước "Cách tạo game platform cơ bản với Unity" (và phần 2), chúng ta đã dùng Unity và WebGL plugin built-in tạo game HTML5 browser đơn giản – trong tutorial tương tự này, chúng ta sẽ tạo game Android cơ bản dùng Unity.

Yêu cầu:

  • Unity
  • Trình soạn thảo text tốt như NotePad++ (Tùy chọn nhưng khuyên dùng)
  • Android SDK

Nếu chưa có, tải cài Unity SDK và Android SDK. Cần Android SDK để test APK game trong môi trường Android.

Mở Unity, tạo project mới. Chọn 2D project.

Có vài panel cần quen: Hierarchy panel chứa tất cả element scene (scene = "level" bạn đang làm). Game tab dùng play/test game trong editor. Bên phải Inspector panel chỉnh lighting, physics, v.v.

Đầu tiên tạo sprite – sẽ là nhân vật chính (do ta điều khiển). Vẽ sprite riêng (ví dụ hình vuông có mắt), hoặc tải sprite từ net – đảm bảo file .PNG (nền trong suốt).

Kéo thả sprite vào cửa sổ Scene chính (cửa sổ lớn nhất) – cũng hiện trên Hierarchy panel bên trái.

Tạo vài platform – có thể là hình vuông đơn giản, vì dễ resize thành tường và platform khác.

Tạo square "sprite" mới, kéo thả vào Scene window như nhân vật.

Bây giờ chỉ dẫn Unity cho physics cho nhân vật chính – click sprite nhân vật (sẽ highlight xanh trong Scene), trên Inspector panel tìm "GameObjects".

Chọn "Add Component > Physics 2D > RigidBody2D". Sẽ tự động thêm physics cho sprite, thứ bạn phải tự script trong SDK khác.

Cách tạo game Android cơ bản với Unity

Ngăn nhân vật xoay loạn – tìm tab Constraints trong Inspector (vẫn highlight nhân vật), tick "Freeze Rotation Z".

Nhấn "Play", nhân vật sẽ rơi từ trời và rơi mãi – sẽ fix sau, nhưng chú ý như nào dễ dàng apply physics. Physics phụ thuộc hình dạng – nếu apply cho sphere, nó sẽ lăn.

Cũng fix orientation ngăn xoay tự do. Tìm 'constraints' trong inspector với player selected, tick freeze rotation Z. Play lại, player rơi từ trời xuống vực vô tận.

Để ngăn nhân vật rơi mãi, cần thêm collider – viền rắn của hình dạng thêm cho nhân vật. Highlight nhân vật, chọn "Add Component > Physics 2D > BoxCollider2D.

Làm y hệt với platform tạo trước. Nhân vật giờ sẽ "collide" với platform và đứng yên.

Đảm bảo camera follow nhân vật – trong scene đã có camera object. Kéo camera lên trên nhân vật chính.

Đặc biệt quan trọng nếu tạo 3D runner kiểu Slope cần camera luôn sau game object chính.

Cách tạo game Android cơ bản với Unity

Trong Hierarchy panel, kéo camera dưới nhân vật chính (Player GameObject). Làm nhân vật thành 'parent' của camera. Khi Player di chuyển, camera sẽ follow.

Tutorial này tạo game endless runner cơ bản kiểu Run 3, nhân vật chạy ngang màn hình né chướng ngại (hoặc game over nếu va chạm). Cần vài script, phần lớn cung cấp trong hướng dẫn.

Chuột phải folder "Assets" tạo folder mới tên Scripts. Chuột phải folder mới chọn "Create > C# Script" tên PlayerControls. Script này định nghĩa hành vi nhân vật.

Double click script, sẽ mở trong Visual Studio – hoặc tùy chỉnh dùng NotePad++.

File script đã có chút "boiler plate" code – code cần giữ nguyên hoặc điều chỉnh, tiết kiệm thời gian. Thêm object mới.

Trên dòng void Start():

Cách tạo game Android cơ bản với Unity

public Rigidbody2D rb;

Code tiếp theo vào trong Start(), dùng tìm rigidbody – chỉ dẫn Unity locate physics gắn vào GameObjects (nhân vật), Start() chạy khi object/script mới tạo.

Tìm physics object:

rb = GetComponent<Rigidbody2D>();

Thêm dòng này vào Update():

rb.velocity = new Vector2(3, rb.velocity.y);

Update() liên tục refresh, code trong đó chạy liên tục (trừ khi object destroyed). Ta set rigidbody velocity mới: tốc độ trục Y giữ nguyên (rb.velocity.y), trục ngang speed 3. Sau này có thể dùng 'FixedUpdate()' tương tự nhưng kiểm soát được update rate.

Lưu script, quay Unity, click nhân vật highlight. Inspector panel, Add Component > Scripts thêm script vừa lưu. Nhấn Play, nhân vật sẽ di chuyển liên tục về mép platform.

Tạo điều khiển Player Input

Vì game endless runner có chướng ngại, cần control như nút 'jump'.

Mở lại script, thêm code:

if (Input.GetMouseButtonDown(0)) { rb.velocity = new Vector2(rb.velocity.x, 5); }

Đặt trong Update(). Code này: khi player click chuột (dịch thành tap màn hình Android), nhân vật "nhảy" vì thêm velocity trục Y giá trị 5 (giá trị cao = nhảy cao hơn).

Nếu không rành code, dùng If vì If là kiểu "làm hoặc không" – nghĩa là NẾU điều kiện xảy ra, THỰC HIỆN lệnh này. Nếu player không click/tap thì script không chạy.

Nhấn Play test trước khi tiếp.

Vấn đề: nhấn jump sẽ nhảy dù nhân vật đang trên mặt đất hay không – giống Flappy Bird, không phải runner. Sẽ fix.

Trong script, thêm code trên Update():

public Transform groundCheck; public Transform startPosition; public float groundCheckRadius; public LayerMask whatIsGround; private bool onGround; 
Thêm dòng này vào Update() phía trên if:
onGround = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, whatIsGround);
Sửa dòng if thành:
if (Input.GetMouseButtonDown(0) && onGround) { 
Toàn bộ script nên như sau:
public class PlayerControls : MonoBehaviour { 
public Rigidbody2D rb; 
public Transform groundCheck; 
public Transform startPosition; 
public float groundCheckRadius; 
public LayerMask whatIsGround; 
private bool onGround; 
void Start() { 
rb = GetComponent<Rigidbody2D>(); 
} 
void Update() { 
rb.velocity = new Vector2(3, rb.velocity.y); 
onGround = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, whatIsGround); 
if (Input.GetMouseButtonDown(0) && onGround) { 
rb.velocity = new Vector2(rb.velocity.x, 5); 
} 
} 
}

Giải thích: tạo "transform" mới (vị trí trong không gian game). Set radius, chỉ dẫn Unity check radius overlap với layer "ground" – nếu radius sync với "ground", nhân vật nhảy, nếu đã nhảy ở giữa không khí thì không nhảy lại. onGround true NẾU transform groundCheck overlap ground layer.

Lưu script, quay Unity, highlight player, Inspector sẽ có thêm option public variable để điều chỉnh.

Chuột phải Hierarchy tạo empty object mới, kéo xuống dưới nhân vật trong Scene window – đặt vị trí muốn detect sàn. Đổi tên "Check Ground", kéo nó dưới player game object (tạo quan hệ parent-child như camera). Empty object sẽ follow nhân vật, liên tục check khoảng cách sàn.

Chọn nhân vật, Inspector – kéo object Check Ground vào ô "groundCheck". Transform position = vị trí object này, "Radius" set 0.1.

Định nghĩa ground layer. Chọn terrain platform, Inspector, tìm dropdown "Layer: Default" chọn "Add Layer".

Chọn "ground" làm layer cho platform, lặp cho các platform khác. Ở "What is Ground" trên nhân vật, cũng chọn layer ground.

Ta đã chỉ dẫn script player check – NẾU điểm nhỏ trên màn hình overlap layer matching, nhân vật nhảy chỉ khi true.

Game Over khi va chạm và Menu Game

Để hoàn thiện: A: Va chạm chướng ngại = game over, B: Tạo màn hình "game over" với nút play again.

Cơ bản làm:

  1. Thêm object Player gán rigidbody và collider tùy chọn.
  2. Thêm object Enemy gán rigidbody và collider tùy chọn. (tùy chọn thêm tag "Enemy")
  3. Tạo C# script mới thêm component vào Player (hoặc dùng script đã gắn player, không cần mới nếu đã có)
  4. Thêm code sau vào script:
void OnCollisionEnter(Collision coll){ Debug.Log("Collision"); //Check xem có register collision không, nếu chạy xóa dòng này if(coll.gameobject.tag == "Enemy"){ //check object va chạm có tag "Enemy", thay bằng if(coll.gameobject.name == ... nhưng tag dễ hơn. //Thêm code ở đây, ví dụ: Application.LoadLevel("GameOver"); Debug.Log("Working"); //nếu chạy xóa dòng này. }

Thử nghiệm script ví dụ – với thử sai vài lần sẽ đạt yêu cầu.

Cách tạo level GameOver với nút Play, xem phần cuối hướng dẫn Appuals "Cách tạo game platform Unity cơ bản Phần 2".