You are on page 1of 29

ĐẠI HỌC BÁCH KHOA HÀ NỘI

Trường Công nghệ thông tin và Truyền thông

Tài liệu hướng dẫn làm game


Zombie Apocalypse AR
Lưu hành nội bộ

Môn: Đồ họa và hiện thực ảo

Hà Nội, ngày 14 tháng 12 năm 2018


1
2
MỤC LỤC
PHẦN 0. GIỚI THIỆU & CÁC YÊU CẦU BẮT BUỘC 5
A. Giới thiệu 5
1. Thể loại game và lối chơi 5
2. Hình ảnh trong game 5
B. Yêu cầu thiết bị 6
PHẦN 1. CÀI ĐẶT MÔI TRƯỜNG VÀ PHẦN MỀM 8
A. Cài đặt môi trường 8
B. Cài đặt phần mềm 9
PHẦN 2. XÂY DỰNG ỨNG DỤNG AR TRÊN ANDROID BẰNG GOOGLE ARCORE
10
A. Các bước thực hiện 10
B. Kết quả cần đạt được 10
PHẦN 3. TẠO ZOMBIES VỚI KHẢ NĂNG DI CHUYỂN 11
A. Chuẩn bị Zombie Models 11
B. Tạo khả năng di chuyển 11
1. Tạo Zombie đầu tiên trong Scene (FemaleZombie) 11
2. Tạo khả năng di chuyển về hướng Camera cho FemaleZombie 12
3. Tạo Animation chuyển động cho Zombie 13
PHẦN 4. TẠO KHẢ NĂNG TẤN CÔNG CHO ZOMBIES 15
A. Thêm các Components cần thiết cho việc va chạm (Collision) 15
B. Thêm Script điều khiển Zombie tấn công 16
C. Tinh chỉnh khả năng tấn công và thêm âm thanh 18
1. Tinh chỉnh khả năng tấn công của Zombie 18
2. Thêm hiệu ứng âm thanh khi Zombie tấn công 19
PHẦN 5. SỬ DỤNG HỖ TRỢ CỦA ARCORE ĐỂ TẠO ZOMBIES TỪ CÁC NẤM MỒ
TRÊN NỀN ĐẤT THẬT 20
A. Chuẩn bị Models cho nấm mồ 20
B. Tạo Zombies từ các nấm mồ 20
1. Tạo FemaleZombie Prefab 20
2. Viết Script sinh Zombies từ các nấm mồ 21
C. Sử dụng ARCore tìm nền đất và đặt nấm mồ 22
1. Tạo Prefab nền đất 22
2. Tạo nút đặt nền đất, đặt nấm mồ và bắt đầu game 23
3. Tạo bù nhìn (dummy) để kiểm tra tương quan trong không gian ba chiều 25
4. Sử dụng ARCore để xác định vị trí nền đất trong thế giới thực 25
PHẦN 6. THIẾT LẬP GAMEPLAY VÀ KHẢ NĂNG BẮN ZOMBIES 28
A. Hướng dẫn thiết lập Gameplay 28
B. Hướng dẫn thiết lập khả năng bắn zombies 28

3
PHẦN 7. HOÀN THIỆN GAMEPLAY VÀ CÁC THÔNG TIN HIỂN THỊ 2D CỦA
TRÒ CHƠI 29
A. Kết quả cần đạt được 29
B. Các hướng phát triển và mở rộng 29

4
PHẦN 0. GIỚI THIỆU & CÁC YÊU CẦU BẮT BUỘC

A. Giới thiệu

1. Thể loại game và lối chơi


● Zombie Apocalypse AR là một game trên nền tảng Android thuộc thể loại First-
person Shooter kết hợp Survival Horro, sử dụng công nghệ Google ARCore để tạo
trải nghiệm thực tế tăng cường (Augmented Reality).
● Lối chơi (Gameplay) của game Zombie Apocalypse AR rất đơn giản:
○ Trong game chỉ có một người chơi duy nhất.
○ Trong game có các quái vật zombies chồi lên từ các nấm mộ. Vị trí và số
lượng nấm mộ do người chơi quyết định (tuy nhiên phải đặt một số lượng nấm
mộ tối thiểu).
○ Người chơi ban đầu sẽ được đưa một khẩu súng lục, và bối cảnh sẽ chính là
khu vực mà người chơi đang đứng ngoài đời thực.
○ Người chơi cần phải hit and run, cố gắng sống sót cho đến khi thời gian kết
thúc và được giải cứu.
○ Zombies cấp độ cao sẽ có tỷ lệ xuất hiện nhiều hơn khi thời gian trôi qua.
Zombies cấp càng cao thì di chuyển càng nhanh, có lượng máu càng nhiều và
gây ra lượng sát thương càng lớn.

2. Hình ảnh trong game

5
B. Yêu cầu thiết bị
Bắt buộc cần phải có 2 loại thiết bị sau:
● Máy tính (PC/Laptop) sử dụng hệ điều hành có hỗ trợ Unity 3D;
● Thiết bị di động có hỗ trợ Google ARCore.

Về phần thiết bị di động, vì chúng ta dự định làm game AR sử dụng công nghệ Google
ARCore nên sẽ cần các thiết bị hỗ trợ công nghệ này. Danh sách các thiết bị di động có hỗ trợ
Google ARCore được liệt kê ở link dưới đây:

https://developers.google.com/ar/discover/supported-devices

6
Khuyến khích sử dụng các thiết bị di động có khả năng quay video tốt vì chất lượng quay sẽ
ảnh hưởng trực tiếp đến độ chính xác của Google ARCore.

Về phần máy tính dùng để phát triển, tốt nhất nên chọn máy tính có sử dụng hệ điều hành
Windows. Nếu bạn nào đang chỉ dùng mỗi Ubuntu thì cài thêm Windows chạy song song.

➥ Lưu ý:

● Unity 3D ngốn khá nhiều tài nguyên nên tuyệt đối không sử dụng máy ảo hay một thứ
gì tương tự để chạy Unity 3D.
● Các bạn sử dụng hệ điều hành MacOS thì theo lý thuyết khi thực hiện các bước hướng
dẫn sau này thì mọi thứ cũng gần tương tự như trên Windows.

7
PHẦN 1. CÀI ĐẶT MÔI TRƯỜNG VÀ PHẦN MỀM
Nếu như bạn chưa cài Unity thì khuyến cáo nên sử dụng Unity Hub để tải và cài đặt bản
Unity mới nhất, lúc đó các bước cài đặt ở dưới sẽ được đơn giản hóa. Tải và cài đặt Unity
bằng Unity Hub tại đây: https://store.unity.com/download.

A. Cài đặt môi trường


● JDK 8: Để phát triển game cho Android thì cần cài JDK, và ở đây chúng ta sẽ sử
dụng JDK 8. Thường thì Unity mặc định đã sử dụng sẵn OpenJDK 8. Nếu Unity chưa
có JDK 8 (kiểm tra bằng cách vào Edit > Preferences... > External Tools >
Android) thì sẽ phải cài đặt thủ công bằng một trong các cách sau:
○ Tải trên Oracle (phải trải qua bước đăng ký tài khoản mới tải được):
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-
2133151.html
○ Tải bằng link Google Drive (do tác giả Tutorial up, chỉ dành cho Windows):
https://drive.google.com/open?id=1G3WtG7uy3GqB4ezQDoMfX9DoFsq8rz_
h

● ARCore by Google: Đây là một ứng dụng trên Google Play Store. Thiết bị Android
của bạn cần phải có ứng dụng này thì mới chạy được các ứng dụng có sử dụng AR
trên Android. Nếu không tìm thấy trên Google Play Store ứng dụng này thì khả năng
cao thiết bị Android của bạn không hỗ trợ ARCore (danh sách các thiết bị hỗ trợ
ARCore có thể xem chi tiết ở link sau:
https://developers.google.com/ar/discover/supported-devices).

8
B. Cài đặt phần mềm
Tải Unity (bản Personal) tại https://store.unity.com/download.
Ngoài ra nếu sau này gặp lỗi trong quá trình Build Android App (hoặc bất kỳ một lỗi nào đó
mà không Google Search ra được) thì có thể sửa bằng cách cài đặt thêm:
● Android Target Support: https://unity3d.com/unity/whats-new/unity-2018.1.0 (Lưu
ý chọn đúng phiên bản Unity tương ứng)
● Android SDK: https://docs.unity3d.com/2018.1/Documentation/Manual/android-
sdksetup.html (Lưu ý chọn đúng phiên bản Unity tương ứng)
● Visual Studio: Dùng cho việc lập trình (bằng C#) trong Unity. Thường thì Visual
Studio sẽ được cài đặt cùng Unity. Còn nếu vì một lý do nào đó mà Visual Studio
không được cài đặt cùng Unity thì bạn có thể tải và cài đặt thủ công:
https://visualstudio.microsoft.com/vs/community.

9
PHẦN 2. XÂY DỰNG ỨNG DỤNG AR TRÊN ANDROID
BẰNG GOOGLE ARCORE

A. Các bước thực hiện


● Mở Unity Hub, tạo một Unity 3D Project mới tên là ZombieAR.
● Làm theo các bước trong trang hướng dẫn của Google ARCore sau đây để cài và
chạy ứng dụng HelloAR: https://developers.google.com/ar/develop/unity/quickstart-
android
● Đảm bảo rằng option ARCore Required đã được kích hoạt bằng cách vào Edit >
Project Settings... > ARCore > ARCore Required.

➥ Lưu ý:

● Phải đảm bảo thiết bị Android của bạn đã cài đặt ARCore by Google.
● Thiết bị có camera càng tốt thì khả năng nhận diện của Google ARCore sẽ càng
nhanh và chính xác.

B. Kết quả cần đạt được


● Thiết bị phải chạy được ứng dụng HelloAR.

10
PHẦN 3. TẠO ZOMBIES VỚI KHẢ NĂNG DI CHUYỂN

A. Chuẩn bị Zombie Models


● Tải các Zombie Models tại đây: https://drive.google.com/open?id=13o-
qel3gHAvt8E12faaBE3SkoY2nwFqG.
● Giải nén ZombieModels.zip, copy & paste thư mục ZombieModels vừa giải nén vào
thư mục Assets/Models (nếu không có thì tạo mới) trong thư mục Project ZombieAR
của bạn (nếu quên đường dẫn tới thư mục thì có thể xem lại khi mở Unity Hub).

➥ Lưu ý:
● Các Models trên được lấy từ trang https://www.mixamo.com. Đây là một trang cung
cấp các Models miễn phí (có cả Animations).

● Để sử dụng các Models trên Mixamo thì bạn sẽ phải ngồi lựa chọn các Animations
phù hợp, rồi khi import vào Unity thì cũng sẽ phải trải qua một số bước lằng nhằng
nữa mới có thể sử dụng được (video hướng dẫn:
https://www.youtube.com/watch?v=P4PrO8fHZ4E). Còn các Zombie Models trong
link Google Drive bên trên thì đã làm sẵn mọi thứ, chỉ việc sử dụng.

B. Tạo khả năng di chuyển

1. Tạo Zombie đầu tiên trong Scene (FemaleZombie)


● Đổi tên Scene HelloAR thành ZombieAR. Mở Scene ZombieAR này ra.
● Trong cửa sổ Project (nếu không tìm thấy thì có thể vào Window > General >
Project để mở), chọn Model Assets > Models > ZombieModels > ZombieGirl >
zombiegirl_w_kurniawan và kéo thả vào trong cửa sổ Scene.

11
● Trong cửa sổ Hierarchy, đổi tên zombiegirl_w_kurniawan thành FemaleZombie.

2. Tạo khả năng di chuyển về hướng Camera cho FemaleZombie


● Trong cửa sổ Hierarchy, chọn FemaleZombie, cửa sổ Inspector sẽ xuất hiện (nằm
bên phải màn hình). Lúc này, chọn nút Add Component, sau đó chọn New script.
Đặt tên Script mới này là ZombieController.

● Trong thư mục Assets sẽ xuất hiện file ZombieController. Kích đúp chuột vào file
này để chỉnh sửa. Lúc này Visual Studio sẽ mở ra.

12
● Copy & paste đoạn code sau vào trong phương thức Update:

transform.LookAt(Camera.main.transform.position);
transform.Translate(Vector3.forward * Time.deltaTime);
transform.eulerAngles = new Vector3(0, transform.eulerAngles.y, 0);

○ Dòng 1 là để khiến cho Zombie “quay mặt” về hướng Camera.


○ Dòng 2 là để dịch chuyển Zombie về phía trước.
○ Dòng 3 là để cố định cho Zombie dịch chuyển trong 2 chiều X và Z, còn chiều
Y (chiều cao) thì cố định.
○ Phương thức Update sẽ được gọi một lần trong mỗi khung hình (frame) mới
được tạo ra.

● Save file ZombieController.cs, sau đó quay trở lại Unity bấm nút Play để kiểm tra
thử xem Zombie đã được dịnh chuyển chưa.
● Chuyển 3 dòng code trên vào 1 phương thức mới void Move.

3. Tạo Animation chuyển động cho Zombie


Hiện giờ con FemaleZombie chỉ bị dịch chuyển mà không có Animation cử động chân tay.
Trong các bước sau đây chúng ta sẽ thêm Walk Animation cho nó.
● Trong thư mục Assets, tạo một thư mục mới tên là Animators. Bấm chuột phải vào
thư mục Animators, chọn Create > Animator Controller, đặt tên là
FemaleZombieAnimatorController.
● Kích đúp vào FemaleZombieAnimatorController để mở ra cửa sổ Animator. Kéo
thả
Assets/Models/ZombieModels/Animations/Mixamo/zombiegirl_w_kurniawan@Z
ombie Walk vào cửa sổ Animator.

13
● Trong cửa sổ Hierarchy, chọn FemaleZombie. Sau đó kéo thả
Assets/Animators/FemaleZombieAnimatorController vào ô Controller của
Component Animator trong cửa sổ Inspector.

● Bấm nút Play để kiểm tra thử xem Zombie đã được dịnh chuyển kèm theo Walk
Animation chưa.

14
PHẦN 4. TẠO KHẢ NĂNG TẤN CÔNG CHO ZOMBIES
Khi một Zombie tiến lại gần MainCamera thì chúng ta sẽ khiến nó tấn công người chơi.
Unity cung cấp cho chúng ta 2 phương thức: OnCollisionEnter và OnCollisionExit,
tương ứng với khi một vật thể va chạm với một vật thể khác và khi 2 vật thể đó không còn va
chạm. Dưới đây là links tài liệu chi tiết về 2 phương thức trên:
● OnCollisionEnter:
https://docs.unity3d.com/ScriptReference/Collider.OnCollisionEnter.html
● OnCollisionExit:
https://docs.unity3d.com/ScriptReference/Collider.OnCollisionExit.html

Dưới đây là các bước hướng dẫn chi tiết.

A. Thêm các Components cần thiết cho việc va chạm (Collision)


● Trong cửa sổ Hierarchy, chọn ARCore Device > First Person Camera. Tiếp đó,
trong cửa sổ Inspector, chọn Add Component > Box Collider. Chỉnh các thông số
để phù hợp cho việc va chạm:
○ Vị trí First Person Camera ngoài đời thực chính là vị trí của thiết bị Android.
Do đó để nguyên Center(0, 0, 0) là phù hợp.
○ Về kích cỡ thì cho Size(1, 2, 1) để mô phỏng kích cỡ người chơi thật.
● Trong cửa sổ Hierarchy, chọn FemaleZombie:
○ Trong cửa sổ Inspector, thêm 2 Components mới bằng cách chọn Add
Component:
■ Rigidbody: tạm thời bỏ chọn Use Gravity, giữ nguyên các thông số
còn lại.
■ Box Collider: Center(0, 1, 0) và Size(0.7, 2, 0.8).
○ Mở FemaleZombieAnimatorController, kéo thả
Assets/Models/ZombieModels/Animations/Mixamo/zombiegirl_w_kurnia
wan@Zombie Attack vào cửa sổ Animator. Sau đó bấm chuột phải vào ô
Zombie Attack, chọn Make Transition và kéo tới ô Zombie Walk (điều này
sẽ khiến cho Zombie sau khi tấn công xong thì sẽ quay về trạng thái di
chuyển).

15
B. Thêm Script điều khiển Zombie tấn công
● Chúng ta sẽ sử dụng 2 phương thức do Unity cung cấp là OnCollisionEnter và
OnCollisionExit như đã đề cập. Thêm đoạn code sau vào trong
ZombieController:

private bool isZombieClose;

...

private void OnCollisionEnter(Collision collision)


{
if (collision.gameObject.tag == "MainCamera")
{
isZombieClose = true;
}
}

private void OnCollisionExit(Collision collision)


{
if (collision.gameObject.tag == "MainCamera")
{
isZombieClose = false;
}
}

16
Ý tưởng của đoạn code trên chính là khi một FemaleZombie va chạm với
MainCamera thì sẽ gắn giá trị isZombieClose = true, và ngược lại khi không còn
va chạm.
● Trong ZombieController, ta sẽ tạo một phương thức Attack để điều khiển Zombie
tấn công:

void Attack()
{
GetComponent<Animator>().Play("Zombie Attack");
}

● Tiếp theo chúng ta sẽ sử dụng phương thức Update có sẵn để gọi tới hàm Attack
khi isZombieClose == true. Tuy nhiên chúng ta cần thêm 2 biến nữa để quản lý
thời gian giữa 2 lần tấn công của Zombie, nếu không thì Zombie sẽ tấn công liên tục.
Hãy thử tự suy nghĩ và làm viết ra đoạn code phù hợp cho phần này, sau đó có thể
tham khảo đoạn code dưới đây:

public int timeBetweenAttacks = 3;


private bool isZombieClose;
private float attackCooldownTimer;

// Start is called before the first frame update


void Start()
{
attackCooldownTimer = timeBetweenAttacks;
}

// Update is called once per frame


void Update()
{
Move();

attackCooldownTimer -= Time.deltaTime;
if (attackCooldownTimer <= 0 && isZombieClose)
{
Attack();
attackCooldownTimer = timeBetweenAttacks;
}
}

● Quay lại Unity, bấm nút Play và thử xem FemaleZombie đã tấn công khi tới gần
MainCamera hay chưa.

17
C. Tinh chỉnh khả năng tấn công và thêm âm thanh
1. Tinh chỉnh khả năng tấn công của Zombie

Hiện giờ FemaleZombie đã có khả năng tấn công khi tiếp cận MainCamera. Tuy nhiên có
một vấn đề là trong quá trình con Zombie đang giơ tay tấn công thì nó vẫn được dịch chuyển
do phương thức Move được gọi liên tục mỗi lần Update. Để khắc phục, ta sẽ thêm một thuộc
tính nữa gọi là isZombieAttacking để khi con Zombie đang tấn công thì không được gọi tới
phương thức Move nữa.
● Trong phương thức Attack, ta sẽ gắn isZombieAttacking = true. Vấn đề là ta sẽ
phải gắn isZombieAttack = false sau một khoảng thời gian (khi Zombie đã tấn
công xong). Để làm được điều đó ta sẽ dùng StartCoroutine. Trong
ZombieController sửa lại code như sau:

private bool isZombieAttacking;

...

void Attack()
{
isZombieAttacking = true;
GetComponent<Animator>().Play("Zombie Attack");
StartCoroutine(finishAttacking());
}

private IEnumerator finishAttacking()


{
yield return new WaitForSeconds(1.2f);
isZombieAttacking = false;
}

Ở đây 1.2s là khoảng thời gian (tương đối) mà animation Zombie Attack hoàn thành.
● Rồi sau đó trong hàm Update thêm dòng code sau:

// Update is called once per frame


void Update()
{
if (isZombieAttacking) return;

Move();

attackCooldownTimer -= Time.deltaTime;
if (attackCooldownTimer <= 0 && isZombieClose)
{
Attack();
attackCooldownTimer = timeBetweenAttacks;
}

18
}

● Save file ZombieController.cs và quay lại Unity bấm nút Play để test thử xem
Zombie còn bị dịch chuyển khi tấn công không.

2. Thêm hiệu ứng âm thanh khi Zombie tấn công


● Tải file âm thanh khi Zombie tấn công Female Zombie Attack.ogg tại link:
https://drive.google.com/open?id=1ssjy4vH8eLWtkO47K5Sm2zThK53DJAdc.
● Trong cửa sổ Project, tạo thư mục mới tên là Sounds, trong đó tạo thư mục Zombies
để lưu các âm thanh của Zombies.
● Trong cửa sổ Hierarchy, chọn FemaleZombie, bấm Add Component, chọn Audio
Source. Kéo thả Sounds/Zombies/Female Zombie Attack từ cửa sổ Project vào
mục AudioClip của Audio Source vừa tạo và bỏ tick Play On Awake.
● Trong cửa sổ Project, mở Assets/ZombieController để tiến hành thêm code xử lý âm
thanh khi Zombie tấn công:

private AudioSource attackSound;

void Start()
{
attackCooldownTimer = timeBetweenAttacks;

initializeSounds();
}

private void initializeSounds()


{
AudioSource[] audioSources = GetComponents<AudioSource>();
attackSound = audioSources[0];
}

● Save file ZombieController.cs và bấm Play test thử xem khi Zombie tấn công đã có
âm thanh hay chưa. Nếu gặp lỗi “There are no audio listeners in the scene.” và không
nghe được âm thanh thì sửa bằng cách chọn ARCore Device > First Person Camera
trong cửa sổ Hierarchy rồi thêm Audio Listener thông qua nút Add Component
trong cửa sổ Inspector.

19
PHẦN 5. SỬ DỤNG HỖ TRỢ CỦA ARCORE ĐỂ TẠO
ZOMBIES TỪ CÁC NẤM MỒ TRÊN NỀN ĐẤT THẬT

A. Chuẩn bị Models cho nấm mồ


● Tải các Models nấm mồ tại đây:
https://drive.google.com/open?id=1LWgjfLNXGpBkprUztA5BsvN93Hz9Fwly.
● Giải nén CemetaryPack.zip, copy & paste thư mục CemetaryPack vừa giải nén vào
thư mục Assets/Models trong thư mục Project ZombieAR của bạn (nếu quên đường
dẫn tới thư mục của Project thì có thể xem lại khi mở Unity Hub). Quay lại giao diện
của Unity 3D, bạn sẽ phải chờ một lúc để các assets được import vào.
● Trong cửa sổ Project, kiểm tra xem có prefab Tombstones trong thư mục
Assets/Models/CemetaryPack/Prefabs/Tombstones hay không (khái niệm prefab sẽ
được ngay sau đây).

B. Tạo Zombies từ các nấm mồ

1. Tạo FemaleZombie Prefab


● Hiện giờ trong cửa sổ Hierarchy, chúng ta có 1 FemaleZombie. Tuy nhiên đây chỉ là
1 instance riêng lẻ không có khả năng tái sử dụng. Chẳng hạn như muốn tạo nhiều con
FemaleZombie, chúng ta phải copy paste thủ công.
● Để giải quyết vấn đề trên, Unity sử dụng Prefab. Để dễ hình dung so sánh thì Prefab
giống như khái niệm Class trong OOP vậy, và đương nhiên có thể khởi tạo nhiều
instances có cùng đặc điểm.
● Để tạo Prefab cho FemaleZombie thì rất đơn giản, chỉ việc kéo FemaleZombie từ
cửa sổ Hierarchy vào trong Assets/Models/ZombieModels/ZombieGirl/Prefabs.
Khi có cửa sổ xác nhận hiện lên thì chọn “Original Prefab”:

20
2. Viết Script sinh Zombies từ các nấm mồ
● Trong cửa sổ Project, kéo thả Prefab Tombstones trong thư mục
Assets/Models/CemetaryPack/Prefabs/Tombstones vào bất cứ vị trí nào trong
Scene (bạn có thể chọn bất cứ mẫu prefab nấm mồ nào trong thư mục đó đều được).
● Bấm chọn vào nấm mồ mà bạn vừa đặt vào trong Scene. Trong cửa sổ Inspector,
chọn Add Component > New script, đặt tên là SpawnController. Mở
SpawnController để thêm đoạn code sau (nhớ save file):

public class SpawnController : MonoBehaviour


{
public GameObject FemaleZombiePrefab;

// Start is called before the first frame update


void Start()
{
InvokeRepeating("spawnZombie", Random.Range(0f, 2f),
Random.Range(10f, 15f));
}

// Update is called once per frame


void Update()
{

private void spawnZombie()


{
Vector3 position = gameObject.transform.position;

GameObject zombieGO = Instantiate(FemaleZombiePrefab, new


Vector3(position.x, position.y, position.z), Quaternion.Euler(0,
Random.Range(0f, 360f), 0));
}
}

1. Dòng bôi đen đầu tiên


2. Dòng bôi đen thứ hai có tác dụng gọi đến phương thức spawnZombie mỗi 10-
15s, kể từ thời điểm 0-2s.

21
3. Phương thức spawnZombie làm 2 việc: thứ nhất là lấy vị trí hiện tại của nấm
mồ, thứ hai là tạo một con Zombie mới (dựa trên Prefab được truyền vào)
ngay tại vị trí đó.

● Như vừa đề cập, giờ chúng ta sẽ tiến hành truyền vào Prefab tương ứng với Zombie
muốn tạo ra cho SpawnController, ở đây chính là Prefab FemaleZombie. Trong cửa
sổ Hierarchy, bấm chọn Tombstones (nấm mồ mà bạn vừa đặt trong Scene). Quan
sát trong cửa sổ Inspector, bạn sẽ thấy phần Spawn Controller (Script) sẽ có thêm
thuộc tính mới là Female Zombie Prefab, giờ chỉ cần kéo thả Prefab FemaleZombie
vào là xong (Assets/Models/ZombieModels/ZombieGirl/Prefabs/ FemaleZombie).
● Bấm Play và giờ Zombie sẽ được tạo ra liên tục từ nấm mồ mỗi 10-15s.
● Tạo thư mục Tombstones trong Assets/Models. Kéo Tombstones trong cửa sổ
Hierarchy vào thư mục Assets/Models/Tombstones trong cửa sổ Project để tạo
thành 1 Prefab mới. Đổi tên Prefab này thành ZombieSpawnerTomb để tránh nhầm
lẫn sau này.

C. Sử dụng ARCore tìm nền đất và đặt nấm mồ

1. Tạo Prefab nền đất


● Tải file Shader sau:
https://drive.google.com/open?id=1pDIuoL4FKoKetJM4TFCG50ItDZJlJ_n_
● Giải nén và TransparentWithShadows.zip và copy file
TransparentWithShadows.shader vào thư mục
Assets/Models/InfiniteGround/Shaders (nếu chưa có thì tạo mới).
● Tạo mới thư mục Materials trong Assets/Models/InfiniteGround. Bấm chuột phải
vào thư mục này, chọn Create > Material. Đặt tên Material mới tạo là
TransparentWithShadows. Lúc này, trong cửa sổ Inspector, chọn mục Shader, đổi
từ Standard thành TransparentWithShadows.
● Trong cửa sổ Hierarchy, bấm chuột phải chọn 3D Object > Plane. Lúc này trong
cửa sổ Inspector, bạn sẽ thấy có Default-Material, chúng ta cần chuyển thành
Material TransparentWithShadows vừa tạo xong bằng cách kéo thả
Assets/Models/InfiniteGround/Materials/TransparentWithShadows vào trong
cửa sổ Inspector.
● Tiếp đó, vẫn trong cửa sổ Inspector của Plane, tìm thuộc tính Transform, tiến hành
thay đổi kích cỡ của nền đất thành Scale(1000, 0.01, 1000) (nền đất rộng gần như vô
hạn).
● Tạo mới thư mục Prefabs ở trong Assets/Models/InfiniteGround. Từ cửa sổ
Hierarchy, kéo thả Plane vào trong thư mục Prefabs vừa tạo. Sau đó sửa tên Prefab
Plane thành InfiniteGround.
● Trong PHẦN 3 khi tạo Zombie chúng ta đã bỏ qua trọng lực, giờ sẽ quay lại để thêm
trọng lực cho Zombie. Trong cửa sổ Project, chọn
Assets/Models/ZombieModels/ZombieGirl/Prefabs/FemaleZombie. Lúc này,
trong cửa sổ Inspector, ở thuộc tính Rigidbody thì tích vào Use Gravity.
● Bấm Play để kiểm tra Zombie vẫn đi lại được bình thường, không bị “rơi tự do” là
được.
22
2. Tạo nút đặt nền đất, đặt nấm mồ và bắt đầu game
● Tải các nguyên liệu cần dùng (khung UI và Font) để tạo các nút:
○ Textures and Sprites (SF UI):
https://drive.google.com/open?id=1Px8sidhimDXYdTn8tlCsajDuHeawzuco
○ Font Jupiter: https://drive.google.com/open?id=1M_322B_FGu8y2Ga6nE-
KPLHWXasLsPIa
● Giải nén 2 files trên ra được 2 thư mục là Textures and Sprites và Jupiter. Trong
cửa sổ Project, tạo 2 thư mục mới trong thư mục Assets là UI và Fonts.
○ Kéo thả thư mục Textures and Sprites vào thư mục Assets/UI.
○ Kéo thả thư mục Jupiter vào thư mục Assets/Fonts.
● Trong cửa sổ Hierarchy, bấm chuột phải chọn UI > Canvas. Bấm chuột phải vào
Canvas vừa tạo, chọn UI > Button, đặt tên là PlaceGroundButton. Sau đó chỉnh sửa
các thông số sau ở trong cửa sổ Inspector:
○ Trong thuộc tính Rect Transform:
■ Chọn Anchor Presets là bottom center.

■ Pos X: 0, Pos Y: 50, Pos Z: 0.


■ Width: 500, Height: 150.
■ Pivot: X: 0.5, Y: 0.
○ Trong thuộc tính Image (Script), chọn Source Image là SF Button - Hover
(chọn bằng cách bấm vào nút hình tròn nhỏ ở bên phải).
23
● Trong cửa sổ Hierarchy, bấm vào mũi tên mở rộng PlaceGroundButton, lúc này
bấm chọn vào thành phần Text trong đó. Trong cửa sổ Inspector, sửa lại thuộc tính
Text (Script) như sau:
○ Text: Place Ground
○ Paragraph > Min Size: 10
○ Paragraph > Max Size: 80
○ Tích vào Paragraph > Best Fit.
● Kết quả cần đạt được của nút PlaceGroundButton (nút đặt nền đất) như sau (nằm ở
dưới cùng màn hình và được căn chính giữa):

● Đối với nút đặt nấm mồ, ta chỉ việc duplicate PlaceGroundButton (bấm chuột phải
chọn Duplicate), sửa tên thành PlaceTombButton và sửa Text thành “Place Tomb”
là xong. Lưu ý là nút PlaceTombButton vẫn phải nằm trong Canvas ở trong cửa sổ
Hierarchy. Sau đó ta tạm thời ẩn nút này đi bằng cách bỏ tích ở ô bên trái ngay cạnh
tên PlaceTombButton trong cửa sổ Inspector.

● Chúng ta sẽ tiến hành tạo tiếp nút bắt đầu game. Duplicate PlaceGroundButton, sửa
tên thành StartGameButton.
○ Trong thuộc tính Rect Transform:
■ Chọn Anchor Presets là middle center.
■ Pos X: 0, Pos Y: 0, Pos Z: 0.
■ Width: 600, Height: 200.
■ Pivot: X: 0.5, Y: 0.
○ Trong thuộc tính Image (Script), chọn Source Image là SF Window.
● Trong cửa sổ Hierarchy, bấm vào mũi tên mở rộng StartGameButton, lúc này bấm
chọn vào thành phần Text trong đó. Trong cửa sổ Inspector, sửa lại thuộc tính Text
(Script) như sau:
○ Text: Start Game
○ Paragraph > Min Size: 10
○ Paragraph > Max Size: 100
● Kết quả cần đạt được của nút StartGameButton (nút bắt đầu game) như ở hình dưới
(nằm ở chính giữa màn hình). Sau đó chúng ta cũng tạm thời ẩn nút này đi, chỉ để lại
nút đặt nền đất.

24
3. Tạo bù nhìn (dummy) để kiểm tra tương quan trong không gian ba chiều
● Chúng ta sẽ tạo bù nhìn từ chính Prefab FemaleZombie. Trước hết ở cửa sổ
Inspector, ta sẽ sửa lại kích cỡ của FemaleZombie trong thuộc tính Transform
thành Scale(0.8, 0.8, 0.8).
● Để ý rằng trong cửa sổ Project, khi bấm chuột phải vào
Assets/Models/ZombieModels/ZombieGirl/Prefabs/FemaleZombie thì sẽ không
thấy tùy chọn “Copy” hay “Duplicate”. Để tạo 1 Prefab giống hệt vậy thì tạm thời
đành phải kéo Prefab FemaleZombie trong cửa sổ Project vào trong cửa sổ
Hierarchy, rồi lại kéo ngược lại vào folder
Assets/Models/ZombieModels/ZombieGirl/Prefabs trong cửa sổ Project (chọn
“Original Prefab”).
● Sửa tên Prefab FemaleZombie 1 thành Dummy.
● Trong cửa sổ Inspector của Prefab Dummy, xóa các thuộc tính Animator,
Rigidbody, Box Collider, Audio Source và Zombie Controller (Script) đi (bấm
chuột phải vào thuộc tính và chọn Remove Component).

4. Sử dụng ARCore để xác định vị trí nền đất trong thế giới thực
● Trong cửa sổ Project, tìm đến file
Assets/GoogleARCore/Examples/HelloAR/Scripts/HelloARController và đổi tên
thành GameInitController.
● Mở file GameInitController.cs ra, đổi tên class từ HelloARController thành
GameInitController. Thêm mới các thuộc tính sau đây vào class
GameInitController:

public class GameInitController : MonoBehaviour


{
...

public Button PlaceGroundButton;


public Button PlaceTombButton;
public Button StartGameButton;

public GameObject DummyPrefab;


public GameObject GroundPlanePrefab;
public GameObject TombPrefab;

private GameObject groundPlaneGO;


private GameObject dummyGO;

25
private bool isDummyInitialized;
private bool isGroundPlaced;
private bool hasGameStarted;
private int numOfTombsPlaced = 0;

...
}

1. Các thuộc tính PlaceGroundButton, PlaceTombButton, StartGameButton


lần lượt chính là các nút đặt nền đất, đặt nấm mồ và bắt đầu game mà lúc nãy
chúng ta vừa tạo ra. Lát nữa chúng ta sẽ “liên kết” các nút đó vào trong đoạn
Script này.
2. Thuộc tính DummyPrefab chính là bù nhìn mà chúng ta vừa tạo từ phần C3.
Lát nữa chúng ta sẽ “liên kết” Prefab bù nhìn vào trong đoạn Script này.
3. Thuộc tính GroundPlanePrefab chính là phần nền đất InfiniteGround mà
chúng ta tạo từ phần C1.
4. Thuộc tính TombPrefab chính là nấm mồ ZombieSpawnerTomb mà chúng ta
tạo ra ở phần B.
5. Thuộc tính isDummyInitialized để kiểm tra xem bù nhìn đã được khởi tạo
chưa.
6. Thuộc tính isGroundPlaced để kiểm tra xem nền đất đã được đặt chưa.
7. Thuộc tính numOfTombsPlaced để lưu trữ số lượng nấm mồ đã được đặt.
8. Thuộc tính hasGameStarted để kiểm tra xem game đã bắt đầu chưa.
● Trong cửa sổ Hierarchy, chọn và đổi tên Example Controller thành
MainController. Sau đó, trong cửa sổ Inspector, kéo thả PlaceGroundButton,
PlaceTombButton, StartGameButton từ cửa sổ Hierarchy vào các phần tương ứng
và kéo thả các Prefabs Dummy, InfiniteGround, ZombieSpawnerTomb từ cửa sổ
Project vào các phần tương ứng. Kết quả được như hình dưới là chúng ta đã liên kết
các thành phần này vào trong Script thành công.

● Cuối cùng, xóa các thuộc tính DetectedPlanePrefab, AndyVerticalPlanePrefab,


AndyHorizontalPlanePrefab, AndyPointPrefab, k_ModelRotation đi vì không
còn dùng tới nữa.
● Sau đây là phần tự tìm hiểu, tự code dựa theo “dàn ý” cho sẵn (không có hướng dẫn
code cụ thể):

26
1. Mục đích dùng ARCore là để xác định vị trí nền đất trên thực tế. Thay vì đặt
các con Android (AndyPrefab) lên mặt đất như ở phần 1 thì ta sẽ đặt Dummy
rồi sau đó quan sát vị trí của con Dummy này xem vị trí mặt đất xác định bởi
ARCore đã tốt chưa (Dummy không bị nghiêng ngả, chân phải đứng sát mặt
đất) ⇒ Sửa code trong GameInitController để có thể đặt Dummy thay cho
AndyPrefab.
2. Sau khi dùng Dummy để “ướm thử” vị trí mặt đất xác định bởi ARCore thì
khi bấm nút “Place Ground” ta sẽ thay InfiniteGround vào vị trí của
Dummy. InfiniteGround sẽ đóng vai trò làm “nền đất ảo” để các vật thể
trong game không bị rơi tự do. Sau khi hoàn thành xong bước này thì cần phải
xóa các “lưới” do ARCore sinh ra để không vướng mắt trong khi chơi (tắt
chức năng Plane Detection của ARCore đi - google cụm từ khóa “How to stop
Plane Detection in ARCore” sẽ tìm được đáp án) ⇒ Sửa code trong
GameInitController để khi bấm nút “Place Ground” thì sẽ đặt
InfiniteGround vào vị trí của Dummy, sau đó ẩn nút này đi.
3. Sau khi bấm nút “Place Ground” để đặt InfiniteGround xong, nút này được
ẩn đi thì sau đó hiển thị nút “Place Tomb” (đặt nấm mộ). Sau đó việc còn lại
chỉ là đặt nấm mộ mỗi khi bấm nút “Place Tomb” tại đúng vị trí camera hiện
tại (vị trí người chơi đang đứng). ⇒ Sửa code trong GameInitController để
hiển thị nút “Place Tomb” và khi bấm nút “Place Tomb” sẽ lấy vị trí hiện tại
của camera và 1 đặt nấm mộ ZombieSpawnerTomb tại đó.
4. Sau khi đặt một số lượng nấm mộ vừa ý thì sẽ bấm “Start Game” để bắt đầu
trò chơi. ⇒ Sửa code sao cho ZombieSpawnerTomb chỉ hoạt động khi bấm
nút “Start Game”.

27
PHẦN 6. THIẾT LẬP GAMEPLAY VÀ KHẢ NĂNG
BẮN ZOMBIES

A. Hướng dẫn thiết lập Gameplay


● Yêu cầu:
○ Khi Zombie tấn công phải có hiệu ứng âm thanh tấn công.
○ Khi người chơi bị tấn công thì sẽ bị trừ máu và có hiệu ứng báo hiệu đang bị
tấn công.
● Tham khảo các videos trong link sau để hoàn thiện phần này:
https://www.mediafire.com/file/2vg5jsq5cp7b3vs/Zombie_Apocalypse_AR_-
_Gameplay_Video_Tutorials.zip/file

B. Hướng dẫn thiết lập khả năng bắn zombies


● Trong Unity, để làm các games dạng bắn súng thì bắt buộc phải dùng Raycasting.
Xem video sau đây để hiểu rõ về khái niệm Raycasting trong Unity:
https://www.youtube.com/watch?v=EINgIoTG8D4
● Sau đó dựa vào các videos hướng dẫn chi tiết ở link dưới đây để hoàn thiện:
https://www.mediafire.com/file/6pfrosj5gqlv8zg/Zombie_Apocalypse_AR_-
_Shooting_Zombies_Video_Tutorials.zip/file
● Kết quả cần đạt được:
○ Khi bắn phải có âm thanh và hiệu ứng bắn súng.
○ Khi zombie trúng đạn phải có âm thanh trúng đạn và có hiệu ứng máu.
○ Mỗi lần zombie bị bắn trúng sẽ nhận 1 lượng damage nhất định, và khi hết HP
thì zombie sẽ chết ⇒ có animation khi zombie chết.
○ Khi bắn súng sẽ tốn đạn và hết đạn sẽ mất thời gian nạp đạn.

28
PHẦN 7. HOÀN THIỆN GAMEPLAY VÀ CÁC THÔNG
TIN HIỂN THỊ 2D CỦA TRÒ CHƠI

A. Kết quả cần đạt được


Tự nghiên cứu và tìm hiểu để đạt được các yêu cầu sau:
● Thiết lập được Gameplay hoàn chỉnh: người chơi có HP, khi bị tấn công sẽ mất máu,
khi bắn súng sẽ tốn đạn và hết đạn sẽ mất thời gian nạp đạn…
● Cần phải có đầy đủ các thông tin hiển thị 2D của trò chơi như hình dưới:

B. Các hướng phát triển và mở rộng


● Tối ưu hóa các chuyển động (animations) của zombies.
● Thêm các loại vũ khí đa dạng: nhiều loại súng khác nhau, dao, bom…
● Cải thiện Gameplay: nhiều chế độ, độ khó khác nhau, nhiều loại zombies khác nhau…
● ...tùy ý sáng tạo.

29

You might also like