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

PHÁT TRIỂN GAME VỚI UNITY, TẠI SAO KHÔNG? – Kỳ 2 : Coding for beginers – Bài 3: Timer & Movement


Các bài đã viết:


Phát triển game với Unity, tại sao không? – Kỳ 1 : Xin chào Unity!


PHÁT TRIỂN GAME VỚI UNITY, TẠI SAO KHÔNG? – Kỳ 2 : Coding for beginers – Bài 1: Mass / Gravity


PHÁT TRIỂN GAME VỚI UNITY, TẠI SAO KHÔNG? – Kỳ 2 : Coding for beginers – Bài 2: Collision, Trigger, Input


 


Bài 3. Timer & Movement


Giới thiệu: Ở bài trước, chúng ta đã làm quen với Input, hôm nay chúng ta sẽ ứng dụng Input để khảo sát về Movement  - một đề tài khá hấp dẫn 04. Nhưng trước tiên chúng ta phải giải bài tập ở bài vừa rồi, sau đó làm quen với một nội dung cơ bản khác đó là Timer.


1.    Giải bài tập:


Nhắc lại đề bài: Dựng một scene tương tự như ở ví dụ trong phần 1 (bài 2). Viết code cho phép người chơi nhấn một phím bất kỳ thì cửa sổ Debug sẽ hiển thị dòng chữ cho biết Cube đã rơi chạm Floor hay vẫn đang rơi.



Để khỏi phải viết dài dòng và cũng để cho các newbie chưa quen làm việc với Unity có thể học hỏi, mọi người cùng tôi làm qua video này nhé!



Code:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#pragma strict
private var daVaCham : boolean; //Flag cho biet Cube da roi cham Floor hay chua
 
function Start () {
    daVaCham = false; //Ban dau Cube chua cham Floor
}
 
function Update () {
    if(Input.GetKeyUp(KeyCode.Space)) //Nhan phim SpaceBar
    {
        if(daVaCham == true)
        {
            Debug.Log("Da cham floor!");
        }
        else
        {
            Debug.Log("Van~ dang roi ma`.... 04");
        }
    }
}
 
function OnCollisionEnter() //Neu co va cham thi set Flag = true
{
    daVaCham = true;
}

2.    Timer
Mục tiêu của phầnc này là giới thiệu cho mọi người làm quen với Class Time của Unity - một Class cung cấp thông tin về thời gian.
Dưới đây là các Variable của Class Timer:


1
2
3
4
5
6
7
8
9
10
11
time  //The time this frame has started (Read Only). This is the time in seconds since the start of the game.
timeSinceLevelLoad  //The time this frame has started (Read Only). This is the time in seconds since the last level has been loaded.
deltaTime  //The time in seconds it took to complete the last frame (Read Only).
fixedTime  //The time the latest FixedUpdate has started (Read Only). This is the time in seconds since the start of the game.
fixedDeltaTime //The interval in seconds at which physics and other fixed frame rate updates (like MonoBehaviour's FixedUpdate) are performed.
maximumDeltaTime  //The maximum time a frame can take. Physics and other fixed frame rate updates (like MonoBehaviour's FixedUpdate)
smoothDeltaTime  //A smoothed out Time.deltaTime (Read Only).
timeScale  //The scale at which the time is passing. This can be used for slow motion effects.
frameCount  //The total number of frames that have passed (Read Only).
realtimeSinceStartup  //The real time in seconds since the game started (Read Only).
captureFramerate //If captureFramerate is set to a value larger than 0, time will advance in.

Chúng ta sẽ đi vào 2 ví dụ sau đây để hiểu rõ vai trò của Class Timer trong game:


Ví dụ 1: Cooldown Timer
Tạo mới một GameObject, tạo mới một tập tin JavaScript và viết như đoạn code dưới đây:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma strict
var myTime : float;
 
function Start () {
    myTime = 5;
}
 
function Update () {
    if(myTime > 0)
    {
        myTime -= Time.deltaTime;
    }
     
    if(myTime < 0)
    {
        Debug.Log("Time is over!");
    }
}

Attach code, vẫn chọn Object và nhấn Play. Xem kết quả ở cửa sổ Inspector và cửa sổ Debug:



Ví dụ 2: Game Pause
Chúng ta sẽ khảo sát nhanh ví dụ này qua video sau:



Code:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#pragma strict
 
function Update () {
    if(Input.GetKeyDown(KeyCode.Space)) //Nhan SpaceBar de pause hoac resume game
    {
        if(Time.timeScale == 0) //Game dang pause (timeScale ==0)
        {
            Time.timeScale = 1;
        }
        else
        {
            Time.timeScale = 0;
        }
    }
}

3.    Movement:



3.1.     Translate Movement:
Tạo một Cube trong Scene và attach code sau vào Cube:


1
2
3
4
5
6
7
#pragma strict
 
private var speed :float = 5.0;
 
function Update () {
    transform.Translate(Vector3(speed, 0, 0) * Time.deltaTime);
}

Nhấn Play để xem kết quả!



Giải thích: Translate là một Function của Component transform (component lưu giữ thông tin cơ bản về vị trí, góc xoay và tỉ lệ của Object so với Object gốc). Function này cho phép chúng ta tịnh tiến Object theo một Vector3 (Vector trong không gian 3D), tốc độ di chuyển được tính bằng độ lớn của Vector tịnh tiến trên một giây. (Vector3 * Time.deltaTime).


Tiện đây, chúng ta tìm hiểu một ít về Vector3, đây là một Struct mà Unity cung cấp cho chúng ta để xử lý, lưu trữ các thông tin về hướng (direction) và vị trí (position) của Object trong không gian 3D.
Struct này cung cấp khá nhiều Variable và Function mà chúng ta sẽ sử dụng thường xuyên trong quá trình phát triển game.
Tham khảo chi tiết tại: http://docs.unity3d.com/Documentation/ScriptRefere...



3.2.    Force for movement:
Ở trên chúng ta khảo sát về một chuyển động tịnh tiến đều. Phải làm sao nếu chúng ta muốn có một Object di chuyển tuân theo các quy tắc vật lí khi liên quan đến các yếu tố về lực?
Tạo một Scene như phần trên rồi attach đoạn code sau đây vào Cube:


1
2
3
4
5
6
7
#pragma strict
 
private var power  : float = 500.0;
 
function Start () {
    rigidbody.AddForce(Vector3(power,0,0));
}

*Lưu ý: Phải attach Component Rigidbody vào Cube.


Kết quả:



Qua video chúng ta thấy, Object di chuyển nhờ vào một Vector lực với một hướng, độ lớn cho trước và tuân theo các quy tắc vật lí, điển hình là Object lăn chậm dần cho đến dừng.

Tạm kết: Chúng ta kết thúc bài ở đây, không có bài tập nhé! Nhưng đừng lo, bài sau sẽ có!

Đặng Minh Dự
Admin
Admin can thiệp dc thì edit bài giùm em, cớ sao mà mấy cái video không canh giữa được... @@
  • tháng 8 29, 2012
  • ·
  • Thích
  • ·
Nguyễn Quang Vinh
Done
  • tháng 8 29, 2012
  • ·
  • Thích
  • ·
Đặng Minh Dự
Admin
@@ Kỳ này ế ẩm thế, mấy ngày rồi mà có 20 view, 3 like, 1 comment... ==' Đi vắng mấy ngày nay tưởng bở về nhà sẽ có thông báo rất nhiều like chứ
  • tháng 9 2, 2012
  • ·
  • Thích
  • ·
Nguyễn Quang Vinh
Hehe, lễ lạc chắc anh em đi chơi hết roài
  • tháng 9 2, 2012
  • ·
  • Thích
  • ·
kingleo
tớ like nè hay quá , tớ thích làm game trên nền nay lém
có dịp nào rãnh bạn làm 1 bài hướng dẫn 1 game fps đi,sẵn tiện hỏi lun sao mình load model vào nó không có solid (vật cứng) để play đi đc trên nó ? chắc mình nghỉ phải xét va chạm trên mesh (dạng lưới của vật thểWink
  • tháng 9 2, 2012
  • ·
  • Thích
  • ·
Đặng Minh Dự
Admin
Model import vào mình phải attach Collider cho nó thì nó mới tương tác va chạm được, việc này thì có 2 giải pháp là attach component collidier một cách thủ công, 2 là check Generate Collider để Engine tự động áp Collider, tùy trường hợp và nhu cầu mà mình cho Generate hoặc làm thủ công...
  • tháng 9 2, 2012
  • ·
  • Thích
  • ·
Đặng Minh Dự
Admin
p/s: Nếu chưa biết thì mời xem lại các bài trước nha...
Còn tutorial về một game cụ thể như FPS thì mời đợi kỳ 3 nhé...
  • tháng 9 2, 2012
  • ·
  • Thích
  • ·
hà thực
anh ơi viết bài tiếp theo đi, bài viết rất hay và bổ ích.
  • tháng 10 27, 2012
  • ·
  • Thích
  • ·
hà thực
bài tiếp theo anh có thể viết bằng C# thì hay quá
  • tháng 10 27, 2012
  • ·
  • Thích
  • ·
Captcha Challenge