8/27/2014

ProjectGame 1.5 - Tạo chìa khóa và mở cửa




Trong bài này, chúng ta sẽ tạo cửa để làm điểm kết thúc game. Chúng ta cũng sẽ tạo ra Trigger Collider, để người chơi không thể hoàn thành game nếu như không nhặt đủ vật phẩm, dĩ nhiên là chiếc chìa khóa cửa.


Mục tiêu

1.1 - Tạo Camera và Level
1.2 - Tạo nhân vật 2D
1.3 - Tạo class (lớp) CharacterController và SpriteManager
1.4 - Nhảy và yếu tố vật lý
>>1.5 - Tạo chìa khóa và mở cửa
1.6 - Chèn âm thanh và nút Replay


Chuẩn bị

Hãy chắc rằng bạn đã có đủ các bức ảnh chúng ta cần, vào folder Level ở thẻ Project và chắc rằng bạn đang có các bức ảnh doorClose.png, doorOpen.png, và key.png.


Bắt tay vào làm việc

B1. Đầu tiên chúng ta sẽ tạo vật liệu cho chiếc chìa khóa. Tại thẻ Project, nhấp chọn nút Create | Material và đặt tên là M_Key. Qua thẻ Inspector điều chỉnh lại như sau:
  • Shader: Transparent| Cutout| Specular
  • Main Color: R: 255, G: 166, B: 0, A: 255
  • Specular Color: R: 236, G: 224, B: 26, A: 0
  • Shininess: Kéo về gần cuối bên phải.
  • ‰Base (RGB) TransGloss (A)
  • Kéo thả key.png trong thư mục Level ở thẻ Project vào khung hình bên phải.


B2. Tiếp theo, chúng ta sẽ tạo vật liệu cho cánh cửa. Vẫn tại thẻ Project, nhấp chọn Create | Material và đặt tên là M_Door. Qua thẻ Inspector điều chỉnh như sau:
  • Shader: Diffuse
  • Main Color: R: 219, G: 255, B: 255, A: 255
  • Base (RGB)
  • Kéo thả doorClose.png vào khung hình bên phải.



B3. Trước khi tạo vật thể, chúng ta cần phải đặt Tag cho Door và Key. Vào Edit | Project Settings | Tags. Các bạn nhập giá trị như hình sau:


B4. Để tạo vật thể Key cũng tương tự như khi chúng ta tạo Player. Tại thẻ Project, vào thư mục FPX và kéo thả Plane vào thẻ Hierarchy. Qua thẻ Hierarchy, đổi tên Plane lại thành Key.


B5. Nhấp chọn Key ở thẻ Hierarchy, qua thẻ Inspector, nhấp phải vào component Animator rồi chọn Remove Component. Thêm component Box Collider cho Key bằng cách bấm nút Add Component ở thẻ Inspector và gõ vào Box Collider. Điều chỉnh ở thẻ Inspector như hình sau:



B6. Kéo thả vật liệu M_Key ở thẻ Project vào Key ở thẻ Hierarchy.



B7. Tại thẻ Hierarchy, nhấp chuột chọn Key và ấn Ctrl + D để copy đối tượng này, đổi tên đối tượng mới lại thành Door, kéo thả vật liệu M_Door ở thẻ Project vào Door vừa tạo ở thẻ Hierarchy và qua thẻ Inspector điều chỉnh lại như sau:



B8. Vậy là đã xong phần tạo vật thể, bây giờ chúng ta sẽ qua phần code. Nhấp đúp chuột vào file Js CharacterController_2D và thêm đoạn code sau vào phần khai báo đầu chương trình:

public var doorOpenTexture : Texture2D;
public var doorCloseTexture : Texture2D;
private var b_hasKey : boolean;


B9. Chúng ta sẽ thiết lập cho nhân vật không giữ vật phẩm Key vào đầu game. Chèn thêm dòng này vào đầu trong hàm Star( ) :

//Start with no Key
b_hasKey = false;


B10. Bây giờ chúng ta sẽ thêm hàm OnTriggerEnter( ) để kiểm tra nhân vật có chạm vào Door hay Key bằng cách chèn đoạn code sau bên dưới hàm LateUpdate( ):

public function OnTriggerEnter (hit : Collider) : IEnumerator {
        if (hit.collider.tag == "Key") {
            if (!b_hasKey) {
                //We hit our Key
                b_hasKey = true;
                Destroy (hit.gameObject);
            }
        }
        if (hit.collider.tag == "Door") {
            if (b_hasKey) {
                //If we had Key and hit door the door will open
                hit.gameObject.renderer.material.mainTexture = doorOpenTexture;
                //wait for 1 second and destroy our character
                yield WaitForSeconds(1);
                Destroy (gameObject);
                //We close the door
                hit.gameObject.renderer.material.mainTexture = doorCloseTexture;
            }
        }
}


Trong hàm này, chúng ta sẽ kiểm tra việc nhân vật có va chạm với Key và Door bằng cách kiểm tra tag của vật thể va chạm. Khi nhân vật chạm vào chìa khóa, vật thể Key sẽ bị hủy và thiết lập cho nhân vật đang có chìa khóa bằng cách thiết lập biến b_hasKey thành true. Cũng tương tự khi nhân vật chạm vào cửa, lúc đó chúng ta sẽ kiểm tra nhân vật có đang có chìa khóa hay không. Nếu có, cửa sẽ chuyển vật liệu thành doorOpen. Khi đó chúng ta phải chờ 1 giây để nhân vật biến mất và đổi vật liệu cánh cửa lại thành doorClose để đóng cánh cửa.

B11. Save file script lại và trở qua Unity Editor, nhấp chọn Player ở thẻ Hierarchy và kéo thả doorOpen và doorClose vào thẻ Inspector như hình sau:



B12. Save scene lại bằng cách nhấn Ctrl + S và nhấn nút Play để kiểm tra thành quả.



Hoàn thành mục tiêu 1.5

Chúng ta vừa tạo vật thể chìa khóa và cánh cửa, và đặt chúng vào màn chơi. Chúng ta cũng tạo thêm hàm để kiểm tra va chạm của nhân vật với vật thể chìa khóa và cánh cửa. Sau đó, chúng ta thay đổi vật liệu cánh cửa khi nhân vật đã có chìa khóa và va chạm với cánh cửa. Cuối cùng, chúng ta đợi 1 giây để nhân vật biến mất và đổi vật liệu của cánh cửa lại như cũ bằng cách sử dụng yield và Destroy.


Kiến thức bổ sung

Chúng ta có thể làm game ngưng hoặc chờ để đến hành động tiếp theo bằng cách sử dụng coroutines.

Coroutines

Trong file code của chúng ta, chúng ta cần chờ một giây khi cửa mở và kết thúc game. Chúng ta có thể làm điều này bằng vòng lặp hoặc hiển thị một vài câu lệnh cho một giây, nhưng sẽ làm ngưng chuyển động, âm thanh và mọi thứ khác. Chúng ta khắc phục điều này bằng cách sử dụng câu lệnh yield, nó sẽ giúp Unity ngừng hoạt động câu lệnh và làm việc trở lại sau (trong game, trễ hơn 1 giây giống như đoạn code của chúng ta yield WaitForSecond(1) ). Bằng cách sử dụng yield, hàm của chúng ta trở thành Coroutine và bây giờ nó phải trả về IEnumerator (Unity cần điều này để có thể khi nào bắt đầu lại hàm lần nữa). Nghĩa là Coroutine không trả về giá trị như hàm bình thường. Chúng ta cần thay đổi hầu hết hàm trong MonoBehaviour trong Coroutines với cái chúng ta đã từng chạy với mỗi khung hình, như Update( ), FixedUpdate( ), OnGUI( ), và vâng vâng. Chúng ta có thể tham khảo thêm về coroutines ở đường dẫn sau:

http://unity3d.com/support/documentation/ScriptReference/Coroutine.html

Tiếp theo, chúng ta sẽ nói về các kiểu trả về giá trị. Đôi khi, chúng ta sử dụng JavaScript, chúng ta không quan tâm nhiều về kiểu giá trị trả về hay kiểu thông số sẽ phải đưa vào hàm, bởi vì nó rất tiện lợi cho kiểu chỉ khai báo var hay ép kiểu DoSomething(var). Điều này không nên, khi chúng ta làm việc với một nhóm người, việc code dễ đọc rất quan trọng. Vì vậy, tốt hơn hết là phải tập thành thói quen. Nó cũng làm chương trình chạy nhanh hơn, khi nó không cần phải thực thi ép kiểu hay phải tra kiểu. Mặt khác, nếu sử dụng C#, chúng ta sẽ phải đặt kiểu cho biến hay kiểu của thông số. Vì vậy, nó là một chuyện tốt cho bạn biết thêm để bạn đọc code C# dễ dàng hơn cho bạn và cũng như cho mọi người, kể cả người code bằng C#.

6 comments:

  1. Bạn ơi cho mình hỏi, tai sao mình làm theo hướng dẫn mà đến lúc nhân vật chạm vào chìa khóa hay, cửa thì ko gọi đc đến hàm Destroy, có thể nó ko vào hàm OnTriggerEnter.

    ReplyDelete
  2. Bạn ơi có project hoàn chỉnh ko - để mình dễ tham khảo - tới bài nhảy và vật lý là nó cứ toàn update hình "J_frame2" , ko biết phải sửa thế nào giờ! Mong bạn giúp đỡ

    ReplyDelete
  3. Chia sẻ cách làm hết hôi miệng sau khi ăn tỏi, ăn hành bằng nước chè xanh, gừng và dấm rất hiệu quả được nhiều người chữa thành công

    Bệnh hôi miệng có lây không, chữa bằng cách nào ? cách chữa hoàn toàn đơn giản với các loại thảo dược mang lại hiệu quả cao

    Cách chữa chảy máu chân răng gây hôi miệng chảy máu chân răng để lâu ngày rất nguy hiểm cần chữa ngay lập tức

    Hôi miệng là dấu hiệu, triệu chứng của bệnh gì ? đó là: nhiễm trùng kinh niên phổi, viêm xoang kinh niên, ung thư phổi, viêm cuống họng, yếu gan, thận, tiểu đường,

    Hướng dẫn cách chữa hôi miệng bằng hương nhu hiệu quả cực kỳ

    ReplyDelete