Đăng ký
Cộng đồng phát triển game Việt - kết nối đam mê !

bởi

Hê hê, sê ri Mần game mobile với Unity3D đã trở lại sau một thời gian dài vắng bóng.



Ở phần 3 này chúng ta sẽ tập trung vào xử lý 2 vấn đề chính:


  1. Xử lý chuyển động của đối tượng cho mượt mà và nhìn thực hơn
  2. Di chuyển đối tượng bằng Accelerometer 


Như các bạn đã thấy trong screenshot ở trên, chiếc hộp màu xanh ở phần trước đã được thay thế bằng chiếc xe màu xanh 65



Và nhiệm vụ đặt ra bây giờ là làm cho chiếc xe chuyển động trông giống với thực tế, chứ ko phải là dịch chuyển tọa độ của nó theo trục x cho nó qua trái qua phải như chiếc hộp ở phần trước nữa. Vậy mới tạo được cảm giác phê khi lái xe (thì đối với bất cứ game nào, cái sự phê khi chơi cũng rất là quan trọng)


Và ý tưởng để xử lý chuyển động thì như thế này:


1. Di chuyển chiếc xe về phía trước theo 1 trục cố định


1
2
// Di chuyển xe thẳng hướng phía trước
transform.Translate(new Vector3(0, 0, -MovingSpeed * Time.deltaTime));

2. Khi nhận lệnh xử lý rẽ trái/phải thì xoay đầu chiếc xe sang hướng tương ứng


1
2
// Khi nghiên phone thì cho xe quẹo trái
transform.Rotate(new Vector3(0, -20 * Time.deltaTime, 0), Space.Self);

1
2
// Quẹo phải
transform.Rotate(new Vector3(0, 20 * Time.deltaTime, 0), Space.Self);

3. Khi hết lệnh xử lý rẽ trái/phải thì xoay đầu chiếc xe từ từ về lại hướng di chuyển ban đầu


1
2
// Mặc định thì xoay xe hướng về phía trước nó sẽ chạy thẳng
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0, 0, 0), 5 * Time.deltaTime);

Về cơ bản là thế


Còn về việc xử lý di chuyển bằng cảm ứng nghiên, chúng ta có thể lấy được Vector các trục nghiên hiện tại của phone bằng lệnh sau


1
Vector3 AccelerometerDirection = Input.acceleration;

Theo như thiết kế ban đầu của game, thì điện thoại sẽ ở tư thế thẳng đứng bình thường (Portait) và nghiên, như thế thì trục nghiên cần lấy ra xử lý sẽ là trục Y.


Chúng ta sẽ cần một giá trị làm mốc biên độ nghiên (gọi là độ nhạy cũng được, giả sử biến đó tên là AccelerometerSensitivity), khi ta nghiên đến vượt một mức giá trị nào đó thì mới bắt đầu xử lý lệnh rẽ trái/phải, nếu không thì nó sẽ quá nhạy và khó chơi.


Đoạn code xử lý nghiên kết hợp với phần di chuyển đã trình bày ở trên  như sau:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (AccelerometerDirection.y > AccelerometerSensitivity)
        {
            // Khi nghiên phone thì cho xe quẹo trái
            transform.Rotate(new Vector3(0, 0, -20 * Time.deltaTime), Space.Self);
        }
        else if (AccelerometerDirection.y < -AccelerometerSensitivity)
        {
            // Quẹo phải
            transform.Rotate(new Vector3(0, 0, 20 * Time.deltaTime), Space.Self);
        }
        else
        {
            // Mặc định thì xoay xe hướng về phía trước nó sẽ chạy thẳng
            transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(-90, 90, 0), 5 * Time.deltaTime);
        }

Nội dung phần 3 đến đây là hết, và sau đây là Demo + Source code


Demo: Dùng phím mũi tên trái / phải để di chuyển chiếc xe


https://dl.dropbox.com/u/6934517/Demo/racing/racin...


 


Source code: trong này có kèm theo file APK để bạn nào có điện thoại chạy Android thì cài vô test accelerometer


https://dl.dropbox.com/u/6934517/Demo/racing/SRC.z...


Phần 4 xin hẹn gặp lại các bạn vào một ngày đẹp trời nào đó 

Chủ đề: unity3d, game, lập trình, mobile
ádasd
bạn Huy Trần ơi, cho mình hỏi thêm về lệnh transform.Rotate(new Vector3(0, 0, 20 * Time.deltaTime), Space.Self);
Space.Self nghĩa là gì vậy bạn ?!
  • tháng 3 17, 2014
  • ·
  • Thích
  • ·
Huy Trần
Cái đó là tham số cho mình tùy chọn xoay theo tọa độ tương ứng của chính Object đó hay Space.World (là tọa độ tương ứng với tất cả vật thể trên màn hình)
Bạn xem hình sau để rõ hơn này: http://imgur.com/snRCV0g
  • tháng 3 17, 2014
  • ·
  • Thích
  • ·
Huy Trần
Với O là gốc tọa độ của scene nhé
  • tháng 3 17, 2014
  • ·
  • Thích
  • ·
iceball
huy trần cho hỏi , 1 game trong unity là tập hợp của nhiều scene phải ko , giờ ví dụ đến 1 mốc nhất định ng chơi sẽ sang bài 2 (thế là mình phải tạo 1 scene thứ 2) , thế lúc đó mình phải xử lý chuyển scene ở chỗ nào và dùng câu lệnh nào để chuyển nhỉ
  • tháng 3 18, 2014
  • ·
  • Thích
  • ·
Huy Trần
Dùng lệnh Application.LoadLevel("Tên_Scene") để chuyển giữa các scene.
Vấn đề chuyển ở đâu là tùy bạn chứ
Còn việc dùng 1 scene hay nhiều scene cho nhiều level khác nhau cũng tùy ý bạn luôn. Mỗi game mỗi kiểu, mỗi người chọn 1 cách giải quyết khác nhau bạn à.
  • tháng 3 18, 2014
  • ·
  • Thích
  • ·
iceball
-giả sử game có 3 lv , thế giờ mình nhét cả 3 lv vào cùng 1 scene cũng đc à bạn ?
-Sự kiện trong phần 2 bạn xử lý cho chuột , giờ muốn xử lý cho cảm ứng để sử dụng trên mobile thì dùng hàm nào nhỉ
-Giờ mình muốn add 1 dòng text để hiện điểm thì xài object bạn nhỉ , và mình phải xử lý cho dòng text đó ...
  • tháng 3 19, 2014
  • ·
  • Thích
  • ·
long nguyen
phần 4 đâu vậy các bạn
  • tháng 9 12, 2014
  • ·
  • Thích
  • ·
Bá Thế
ad cho mình hỏi chuyển thành file apk thế nào vậy
  • tháng 11 5, 2014
  • ·
  • Thích
  • ·
young
Huy Tran có thể nói cho mình biết về phần mềm tạo file .fbx hình chiếc xe được k.
Cám ơn Huy Tran.
  • tháng 8 16, 2016
  • ·
  • Thích
  • ·
Tran Day
Chào các bạn, nếu ai cần 1 môi trường để rèn luyện thêm kỹ năng dev unity3D thì appy gởi Cv vào mail này nhé : day@mecury.com.vn. Thân
  • tháng 10 19, 2016
  • ·
  • Thích
  • ·
Captcha Challenge