Chủ Nhật, 13 tháng 4, 2014

ProjectGame 1.2 - Platform Game Đơn Giản - Tạo nhân vật 2D



Trong bài này, chúng ta sẽ tạo nhân vật 2D và vật liệu từ các file ảnh đã download ở bài viết 1.1. Chúng ta sẽ có nhân vật với 3 kiểu hành động khác nhau: đứng yên, đi bộ và nhảy.



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

Kiểm tra tài nguyên

Tại thẻ Project, các bạn vào thư mục Game Project 1 | Characters sẽ thấy 3 thư mục là Stay, Walk và Jump. Mở từng thư mục và kiểm tra xem đã có đủ các file như hình dưới đây chưa:



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

Nhân vật của chúng ta chỉ bao gồm các hình ảnh 2D nên chỉ cần sử dụng plane để tạo nhân vật là đủ.

B1. Tại thẻ Project, vào thư mục Game Project 1 | FBX và kéo thả prefab Plane vào thẻ Hierarchy.


B2. Nhấp chọn Plane ở thẻ Hierarchy, qua thẻ Inspector, nhấp phải vào Animator và chọn Remove Component.



B3. Vẫn ở thẻ Inspector, điều chỉnh các giá trị như hình sau:


B4. Tại thẻ Hierarchy, nhấp phải vào Plane và chọn Rename, gõ tên lại thành Player như hình sau:


B5. Tại thẻ Project, nhấp chọn nút Create | Material và đặt tên là M_Character.


B6. Nhấp chọn M_Character ở thẻ Project, qua thẻ Inspector và điều chỉnh như sau:
  • Shader: Transparent| Cutout| Soft Edge Unlit
  • Base (RGB) Alpha (A)
  • Kéo thả s_set.png trong thư mục Characters | Stay vào texture thumbnail
  • X: Tiling: 0.5, Offset: 0
    ‰Y: Tiling: 1, Offset: 0
  • Base Alpha cutoff: Kéo về tận cùng bên phải


B7. Tại thẻ Project, kéo thả M_Character vào Player ở thẻ Hierarchy.


B8. Nhấp chọn Player ở thẻ Hierarchy, vào Component | Physics | Box Collider, và qua thẻ Inspector điều chỉnh như sau:
  • Size: x = 0.4, y = 0.875, z = 1
  • Center: x = 0, y = -0.06275, z = 0


B9. Tiếp theo, chúng ta sẽ tạo Rigid body để hỗ trợ việc tính toán tốc độ di chuyển, nhảy và phát hiện va chạm với địa hình. Nhấp chọn Player ở thẻ Hierarchy, Component | Physics | RigidBody. Qua thẻ Inspector điều chỉnh như hình sau:



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

Chúng ta vừa tạo plane để mô phỏng nhân vật 2D cho người chơi. Chúng ta cũng vừa tạo vật liệu cho nhân vật bằng cách sử dụng  Transparent | Cutout | Soft Edge Unlit Shader. Shader này sẽ loại bỏ kênh Alpha và làm nó trong suốt. Trong khi đó, cũng sử dụng tính năng làm mượt đường viền của bức ảnh. Chúng ta có thể điều chỉnh việc phần nào được loại bỏ và độ mượt của đường nét dựa vào tính năng của thanh trượt Base Alpha Cutoff.

Chúng ta cũng đã điều chỉnh Tiling của trục X = 0.5 bởi vì file ảnh chứa 2 khung hình, như chúng ta chỉ cần sử dụng 1 khung hình cho một thời điểm. Chúng ta đã sử dụng Box Collider thay vì Mesh Collider. Cũng đã thêm RigidBody cho nhân vật và điều chỉnh đóng băng các góc xoay, để không sử dụng các tính năng xoay quanh các trục tọa độ mà sử dụng đến Engine Vật lý của Unity. Vì vậy Player của chúng ta không thể xoay tròn được. Rigid Body sẽ cung cấp cho nhân vật các tính chất để kích hoạt Engine Vật lý trong Unity, như lực hút (gravity) hoặc vận tốc (velocity), và các hoạt động vật lý như trong đời thực. Chúng ta sẽ hiểu rõ hơn trong bài viết sau.


Kiến thức bổ sung

Tại sao lại đóng băng các trục xoay và vị trí trong RigidBody?

Chúng ta cần đóng băng góc xoay vì chúng ta sử dụng các sprite để mô phỏng việc di chuyển của nhân vật. Vì vậy chúng ta không cần nhân vật phải xoay hướng nhìn khi di chuyển. Chúng ta cũng đóng băng việc di chuyển trên trục Z bởi nhân vật chỉ di chuyển trên trục X và Y. Trong trường hợp này, chúng ta có thể tiết kiệm được chu trình xử lý của CPU bởi Unity sẽ vô hiệu hóa các tính toán không cần thiết và tập trung vào thực hiện những phần cần thiết khác.

Box Collider và Mesh Collider

Vậy tại sao chúng ta lại dùng Box Collider thay vì Mesh Collider? Cả hai collider này hầu hết đều tương tự nhau. Mỗi bề mặt của vật thể điều có các trục vuông góc đặt ở mỗi đỉnh để kiểm tra có va chạm với các vật thể khác hay không. Với vật thể plane chúng ta dùng để tạo nhân vật thì chỉ có một bề mặt hướng thẳng đến camera. Vì thế nếu chúng ta dùng Mesh Collider, chúng ta sẽ không nhận được giá trị nào phát hiện việc va chạm của các bề mặt trên, dưới, trái, phải và phía sau cả. Đơn giản là bởi vì plane chỉ có bề mặt phía trước mà thôi.

 

Bên cạnh đó, Box Collider sử dụng hình khối để kiểm tra phát hiện va chạm. Kết quả này sẽ nhanh hơn nhiều so với Mesh Collider. Trong trường hợp này, chúng ta kiểm tra hình khối của nhân vật với địa hình để xem phần nào va chạm, phần nào không.

Box Collider sẽ tiết kiệm nhiều bộ nhớ và CPU hơn Mesh Collider.


Kế tiếp, chúng ta sẽ bàn về Tiling của vật liệu, tương tự như các phần mềm 3D khác. Mỗi Texture đều được áp vào vật liệu vì thế chúng sẽ được kéo dãn ra để phủ kín vật thể.


Tiling rất giống với scaling, và cơ bản là việc lặp lại texture theo trục X và Y. Vì vậy nếu chúng ta đặt Tiling X = 0.5 và Y = 1.0, chúng ta sẽ thấy kết quả ở hình bên trên trục X chỉ bằng phân nữa và trục Y vẫn giữ nguyên. Chúng ta sẽ thấy, hình bên phải chỉ hiển thị khung hình thứ nhất (hình đứng yên bên trái trong khối hộp bên trái). Vậy để hiển thị hình bên phải trong khối hộp bên trái thì làm như thế nào? Chúng ta sẽ cần dùng đến tính năng Offset.Offset sẽ cho phép chúng ta điều chỉnh vị trí bắt đầu của texture. Nếu chúng ta điều chỉnh Offset là X = 0, Y = 0 thì đồng nghĩa với việc sẽ bắt đầu hiển thị texture từ góc trên bên trái. Và nếu điều chỉnh X = 0.5 thì texture sẽ hiển thị bắt đầu từ điểm giữa góc trên, đồng nghĩa với việc hiển thị hình ảnh bên phải của khối hộp bên trái. Xem hình dưới đây sẽ rõ:


Chúng ta có thể điều chỉnh Tiling thông qua hàm material.mainTextureScale và sử dụng hàm material.mainTextureOffset để điều chỉnh Offset.

Sau khi đã hiểu về nguyên lý làm việc ở phần này, chúng ta sẽ có thể tiến hành xử lý sprite ảnh của chúng ta bằng cách thay đổi trị số Tiling và Offset của vật liệu ở bài viết tiếp theo.







Thứ Năm, 10 tháng 4, 2014

COOKBOOK - HIỂN THỊ TÊN ĐỒ VẬT ĐƯỢC NHẶT


Hầu hết các game đều có những món đồ vật buộc người chơi phải chạy đến để nhặt. Điển hình như việc nhặt một chiếc chìa khóa để mở một cánh cổng nào đó để đi tiếp chẳng hạn. Bài viết này sẽ hướng dẫn các bạn sử dụng collider để thực hiện điều đó.



Chuẩn bị

TextureImage.rar


Cách để làm

B1. Vào File | New Project và đặt tên cho project mới là Player Inventory. Và đánh dấu vào ô Character Controller.


B2. Kéo thả các file ảnh vừa tải ở phần Chuẩn bị về vào thẻ Project trong Unity.


B3. Tại thẻ Hierarchy, nhấp chọn nút Create | Terrain và qua thẻ Inspector điều chỉnh Position như hình dưới đây:


B4. Vẫn đang chọn Terrain ở thẻ Hierarchy, qua thẻ Inspector, điều chỉnh như hình sau:



B5. Vẫn tại thẻ Hierarchy, nhấp chọn nút Create | Cube đổi tên thành Cube-key và qua thẻ Inspector điều chỉnh như sau:


B6. Kéo thả file ảnh key_yellow vào Cube-key ở thẻ Hierarchy như sau:


B7. Kéo thả 3rd Person Controller trong thư mục Standard Assets | Character Controllers ở thẻ Project vào thẻ Hierarchy.


B8. Nhấp chọn 3rd Person Controller ở thẻ Hierarchy và qua thẻ Inspector điều chỉnh như sau:


B9. Tại thẻ Project, nhấp chọn nút Create | C# Script và đặt tên là PlayerInventory, chèn đoạn code sau vào:
 
using UnityEngine;
using System.Collections;

public class PlayerInventory : MonoBehaviour
{
    private bool isCarryingKey = false;
   
    private void OnGUI()
    {
        string keyMessage = "(bag is empty)";
        if( isCarryingKey )
        {
            keyMessage = "carrying: [ key ]";   
        }
       
        GUILayout.Label ( keyMessage );
    }
   
    private void OnTriggerEnter(Collider hitCollider)
    {
        if( "key" == hitCollider.tag )
        {
            isCarryingKey = true;
            Destroy ( hitCollider.gameObject );
        }
    }
}


B10. Kéo thả file C# PlayerInventory ở thẻ Project vào 3rd Person Controller ở thẻ Hierarchy.


B11. Tại thẻ Hierarchy, nhấp chọn nút Create | Directional Light.


B12. Nhấp nút Play để kiểm tra thành quả.



Nguyên lý làm việc

Biến luận lý CarryingKey biểu diễn việc người chơi có đang mang chiếc chìa khóa trong người tại bất kỳ thời điểm nào hay không.

Trong hàm OnGUI( ), biến mang chuỗi ký tự thông báo keyMessagestring được hiển thị thông qua hàm GUILayout.Label( ). Giá trị ban đầu của chuỗi này là thông báo việc hành lý của người chơi đang rỗng. Nhưng nếu hàm điều kiện If kiểm tra giá trị của CarryingKey là đúng thì thông báo sẽ được thay đổi rằng người chơi đang mang chiếc chìa khóa trong người.

Hàm OnTriggerEnter( ) sẽ kiểm tra chuỗi tag của bất kỳ vật thể nào mà 3rd chacracter controller va chạm vào nếu đối tượng đã được đánh dấu vào hôp chọn Is Trigger.

Mỗi lần nhân vật chạm vào bất kì vật thể nào, giá trị của Is Trigger sẽ được chuyển thành True, một thông báo sự kiện OnTriggerEnter( ) đều được gửi đến cả 2 vật thể đang va chạm.

Hàm OnTriggerEnter( ) được gán cho nhân vật sẽ kiểm tra tag của đối tượng, nếu tag là key thì hàm điều kiển sẽ phát hiện va chạm với Cube-key và sẽ thực hiện 2 hành động sau:
Điều chỉnh biến luận lý CarryingKey thành True.
Hủy đối tượng vừa va chạm (Trong trường hợp này là Cube-key).


Còn nữa...

So sánh tag của đối tượng bằng hàm chuỗi đặc biệt

So sánh chuỗi tag của đối tượng với một chuỗi là cách thông dụng mà Unity đã cung cấp. Hàm này có tên là CompareTag( ), và mang biến là một chuỗi. Vì vậy chúng ta có thể viết lại hàm điều kiện trong hàm OnTriggerEnter( ) như sau:

if( hitCollider.CompareTag("key") )

Thứ Tư, 9 tháng 4, 2014

Project RPG BÀI 14B. DỌN DẸP FILE SKILL


Thêm chú thích và các công dụng để dễ hiểu rõ hơn phần nào về các tính năng của script Skill...


Double click vào file Skill và xóa tất cả đi, chèn lại đoạn code sau vào:

/// <summary>
/// Skill.cs
///
/// This class contain all the extra function that are needed for a skill
/// </summary>
public class Skill : ModifiedStat {
    private bool _known;            //a boolean variable to toggle if a character knowns a skill

    /// <summary>
    /// Initializes a new instance of the <see cref="Skill"/> class.
    /// </summary>
    public Skill(){
        UnityEngine.Debug.Log ("Skill created");
        _known = false;
        ExpToLevel = 25;
        LevelModifier = 1.1f;
    }

    /// <summary>
    /// Gets or sets a value indicating whether this <see cref="Skill"/> is known.
    /// </summary>
    /// <value><c>true</c> if known; otherwise, <c>false</c>.</value>
    public bool Known{
        get{ return _known; }
        set{ _known = value; }
    }
}

/// <summary>
/// This enumeration is just a list of skills the player can learn
/// </summary>
public enum SkillName{
    Melee_Offence,
    Melee_Defence,
    Ranged_Offence,
    Ranged_Defence,
    Magic_Offence,
    Magic_Defence
}

Project RPG BÀI 14A. DỌN DẸP FILE VITAL


Thêm chú thích và các công dụng để dễ hiểu rõ hơn phần nào về các tính năng của script Vital...


Double click vào file Vital và xóa tất cả đi, chèn lại đoạn script sau vào:

/// <summary>
/// Vital.cs
/// This class contain all the extra function for a character vitals
/// </summary>

public class Vital : ModifiedStat {
    private int _curValue;                //this is the current value of this vital

    /// <summary>
    /// Initializes a new instance of the <see cref="Vital"/> class.
    /// </summary>
    public Vital(){
        UnityEngine.Debug.Log ("Vital Created");
        _curValue = 0;
        ExpToLevel = 40;
        LevelModifier = 1.1f;
    }

    /// <summary>
    /// When getting the _curValue, make sure that it is not greater than our AdjustedBaseValue
    /// If it is, make it the same as our AdjustedBaseValue
    /// </summary>
    /// <value>The current value.</value>
    public int CurValue{
        get{
            if(_curValue > AdjustedBaseValue)
                _curValue = AdjustedBaseValue;
           
            return _curValue;
        }
        set{ _curValue = value; }
    }
}

/// <summary>
/// This enumerations is just a list of the vitals our character will have
/// </summary>
public enum VitalName{
    Health,
    Energy,
    Mana
}

Thứ Ba, 8 tháng 4, 2014

DEVGAME 1.5 - CẤU TRÚC CỦA MỘT TỆP MÃ - BIẾN (Phần 2)

 

Ở bài viết trước, chúng ta đã cài đặt biến kiểu số nguyên vào script SimpleRotate để điều chỉnh tốc độ quay của khối hộp. Bài viết này, chúng ta sẽ tiếp tục cài đặt biến với các kiểu dữ liệu khác nhau.

Còn nhiều thứ khác bạn cần phải tìm hiểu về biến bởi nó có vài kiểu khác nhau. Trong script SimpleRotate, chúng ta đã cài đặt tốc độ quay của khối hộp thông qua biến myDegrees = 50, chương trình sẽ mặc định biến này thuộc kiểu dữ liệu int ( số nguyên, không có phần thập phân ). Nếu bạn muốn sử dụng số thực ( số có phần thập phân ) như 50.0 thì bạn phải đổi nó sang kiểu float ( kiểu số thực ). Nhiều biến bắt buộc phụ thuộc vào cách thiết lập kiểu dữ liệu của chúng để xử lý cho các công việc tiếp theo.

Hãy mở file SimpleMove lên và thêm vài dòng script vào để tiến hành tìm hiểu.

B1. Double click vào file java SimpleMove ở thẻ Project và chèn thêm các dòng được tô đỏ như sau:

#pragma strict
var mySpeed : float;
var someString : String = "This is a test";
var someSetting : boolean = true;
var someObject : GameObject;

function Update () {
    //transform.Rotate(0,50* Time.deltaTime,0);
    transform.Translate(2* Time.deltaTime, 0,0);
}

Hãy cùng nhìn lại đoạn code vừa được thêm vào:
  • var mySpeed : float; : Định nghĩa kiểu float ( số thực ) cho biến mySpeed nhưng cài đặt giá trị.
  • var someString : String = "This is a test"; : Định nghĩa kiểu String ( chuỗi ) và cài đặt biến này mang giá trị là các ký tự nằm trong dấu ngoặc kép " ". Dạng chuỗi thường được đặt giữa dấu ngoặc kép " " và có màu đặt trưng của kiểu chuỗi trong trình biên tập code của Unity.
    >>Chú ý: Nếu bạn copy và paste văn bản kể cả dấu ngoặc kép từ trình soạn thảo văn bản, các ký tự có thể bị thay đổi, khi đó chương trình biên tập code sẽ báo lỗi, buộc bạn phải tự nhập lại đoạn văn bản.
      • var someSetting : boolean = true; : Định nghĩa biến kiểu Boolean ( luận lý, chỉ mang giá trị True hoặc False) và cài đặt nó mang giá trị True. Ở thẻ Inspector, biến Boolean được hiển thị dưới dạng kiểu hộp đánh dấu checkbox.

      B2. Lưu đoạn script lại và qua Unity Editor, nhấp chọn Cube Parent ở thẻ Hierarchy, qua thẻ Inspector, nhìn vào script SimpleMove đã được gắn ở bài viết trước và xem sự khác biệt.

        >>Mẹo: Ngay cả khi kiểu dữ liệu của biến là bất kỳ kiểu nào cũng được và không bắt buộc phải định nghĩa. Nếu bạn quyết định định nghĩa, thì bạn nên save lại để tránh việc chương trình tự động gán kiểu dữ liệu cho biến. Nếu bạn lập trình trên nền tảng IOS hay Android, bạn nên định nghĩa rõ ràng. Trong loạt bài viết về DevGame này, mình sẽ sử dụng cả hai cách trên.

          Chú ý rằng, phía trước tất cả tên biến điều có từ var. Trong Unity, var được định nghĩa cho các biến public ( biến toàn cục ). Nếu một hàm hay một biến được khai báo là public thì những lớp khác có thể gọi sử dụng trực tiếp được. Ngược lại nếu hàm hay biến đó được khai báo là private thì chỉ những thành viên trong lớp đó mới có thể sử dụng được thôi.

          B3. Bây giờ thử thêm từ private vào phía trước var someSetting và save đoạn script lại.



          B4. Nhấp chọn Cube Parent ở thẻ Hierarchy, qua thẻ Inspector và để ý rằng biến mang kiểu luận lý Some Setting đã biến mất.


          Ngoài ra, trong đoạn script vừa được thêm vào còn có:
          • varsomeObject : GameObject; : Kiểu dữ liệu xuất hiện hầu hết trong các ngôn ngữ lập trình, Unity cho phép bạn định nghĩa biến của bất kể vật thể cấp cao như GameObject, hay thấp hơn là các Transform ( xoay, kéo, co dãn đối tượng) và thậm chí là các loại đối tượng khác như Camera hoặc Light ( đèn ).  

          Một đoạn script có thể truy cập đến các biến hay hàm của đối tượng khác phải được định nghĩa như một giá trị của biến. Tuy nhiên, tên thuộc tính của vật thể là duy nhất, không được trùng nên phải đặt sao cho dễ hình dung công dụng nhất.

          B6. Nhấp chọn Cube Parent ở thẻ Hierarchy. Kéo thả Camera hoặc Directional Light ở thẻ Hierarchy vào biến Some Object ở thẻ Inspector.


          B7. Lưu đoạn script và qua Unity Editor lưu project của bạn lại với tên Demo.



          Thứ Năm, 3 tháng 4, 2014

          ProjectGame 1.1 - Platform Game Đơn Giản - Tạo Camera và Level


          Vẫn còn nhiều platform game kinh điển tồn tại trong kí ức mọi người như Mario, Sonic, Megaman... Platform game là dạng game với động tác nhảy và yếu tố trọng lực là chính, ngoài ra các yếu tố phụ khác đã góp phần làm nên tên tuổi của các platform game kinh điển trên. Bài viết này được chia ra làm 6 phần nhỏ. Tất cả đều là nền tảng 2D, để các bạn dễ hiểu hơn những kiến thức về lập trình game và dễ đi sâu hơn vào các project game sau trên nền tảng 3D.


          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

          Tài nguyên
          GameProject1



            PG 1.1 - Platform Game đơn giản: Tạo Camera và Level

          B1. Vào File | New Project để tạo Project mới với tên là SimplePlatform như hình sau:


          B2. Giải nén file GameProject1 vừa tải ở trên và kéo thả thư mục Game Project 1 vào thẻ Project như hình sau:


          B3. Tại thẻ Project, nhấp chuột chọn Plane trong thư mục Game Project 1 | FBX và qua thẻ Inspector, điều chỉnh Scale Factor = 1. Sau đó nhấn Apply để hoàn tất việc điều chỉnh.


          B4. Kéo thả Plane vào thẻ Hierarchy và đổi tên thành Background.


          B5. Nhấp chọn Background trong thẻ Hierarchy, qua thẻ Inspector và điều chỉnh như hình sau:


          B6. Vẫn đang chọn Background, ở thẻ Inspector, nhấp phải vào Animator và chọn Remove Component.


          B7. Tại thẻ Project, nhấp chọn Create | Material và đặt tên là M_Background.


          B8. Nhấp chọn M_Background, qua thẻ Inspector, nhấp vào chữ Select và chọn Background như hình sau.


          B9. Vẫn đang chọn M_Background, điều chỉnh như sau:
          • Shader: Diffuse
          • Main Color: R = 164, G = 219, B = 225, A = 255
          • Base (RGB): Tiling X =  2, Y = 2; Offset: X = 0, Y = 0



          B10. Nhấp chọn Background ở thẻ Hierarchy, qua thẻ Inspector, tại mục Mesh Renderer | Material điều chỉnh Element 0 là M_Background.


          B11. Vào Edit | Project Setting | Tags & Layers và nhập vào các giá trị như sau:


          B12. Nhấp chọn Background ở thẻ Hierarchy, qua thẻ Inspector, chọn Tag = Background và Layer = Background như hình sau:


          B13. Tại thẻ Hierarchy, nhấp chọn Main Camera, qua thẻ Inspector, điều chỉnh Projection thành Perspective và Position như trong hình sau:


          B14. Tại thẻ Hierarchy, nhấp chọn Create | Directional Light và qua thẻ Inspector điều chỉnh như sau:


          B15. Vào GameObject | Create Empty và đổi tên thành Level. Qua thẻ Inspector, điều chỉnh các thông số như hình sau:

          B16. Tại thẻ Hierarchy, nhấp chọn nút Create | Cube và đổi tên thành Floor. Đặt tag là Floor, layer là Level như hình sau:

          B17. Thực hiện lại bước trên một lần nữa với tên cube là Wall, tag là Wall và layer là Level.


          B18. Tại thẻ Project, nhấp chọn Create | Material và đặt tên là M_Level.


          B19. Nhấp chọn M_Level vừa tạo và qua thẻ Inspector, bấm vào ô điều chỉnh màu và chỉnh các thông số màu sắc là R = 150, G = 230, B = 225, A = 255.


          B20. Kéo thả M_Level ở thẻ Project vào Wall và Floor ở thẻ Hierarchy.

           


          B21. Tại thẻ Hierarchy, kéo thả Wall và Floor vào Level như hình sau:


          B22. Tại thẻ Hierarchy, nhấp chọn Wall và ấn Ctrl + D 6 lần để tạo thêm 6 bản sao nữa. Nhấp chọn Floor và ấn Ctrl + D 2 lần để tạo ra thêm 2 bản sao nữa. Và đặt tên như hình dưới đây:


          B23. Tại thẻ Hierarchy, điều chỉnh các bản sao vừa tạo ở bước trên với tên và thông số ở thẻ Inspector như dưới đây:
          • Floor 1 : Position: x = -4, y = -9, z = 0 - Scale: x = 125, y = 15, z = 1
          • Floor 2: Position: x = -6,  y = 5, z = 0 - Scale: x = 32, y = 1, z = 1
          • Floor 3: Position: x = -25, y = 12, z = 0 - Scale: x = 19.5, y = 1, z = 1
          • Floor 4: Position: x = 14, y = 12, z = 0 - Scale: x = 20, y = 1, z = 1
          • Floor 5: Position: x = -7, y = 9, z = 0 - Scale: x = 9, y = 1, z = 1
          • Floor 6: Position: x = -31, y = 1, z = 0 - Scale: x = 6, y = 1, z = 1
          • Floor 7: Position: x = 21, y = 2, z = 0 - Scale: x = 10, y = 1, z = 1

          • Wall 1: Position: x = -49, y = 17, z = 0 - Scale: x = 36, y = 40, z = 1
          • Wall 2: Position: x = 42, y = 17, z = 0 - Scale: x = 38, y = 39, z = 1
          • Wall 3: Position: x = -7, y = 23, z = 0 - Scale: x: 1, y = 36, z = 1

          B24. Nhấn Ctrl + S để save scene này lại với tên là SimplePlatform.



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

          Vừa rồi chúng ta đã tạo Background đặt phía sau Level, Level bao gồm các khối gạch được xếp theo tầng (Floor) và tường (Wall) để nhân vật có thể di chuyển lên các tầng và giới hạn phạm vi di chuyển của nhân vật bởi các bức tường.





          Ở đây, chúng ta điều chỉnh Main Camera ở chế độ Perspective để tạo chiều sâu cho game, khiến góc nhìn đẹp mắt hơn.


          Kiến thức bổ sung
          Phần Projection ở Main Camera có 2 giá trị là Orthographic (Góc nhìn trực quan) và Perspective (Góc nhìn phối cảnh). Ở chế độ Orthographic, vật thể sẽ không bị kéo dãn bởi khoảng cách của camera. Bởi vậy trong màn hình game, chúng ta chỉ thấy được 1 mặt của vật thể. Ở chế độ Perspective, chúng ta sẽ nhìn thấy được các mặt bên của vật thể do có chiều sâu, tựa như góc nhìn thực tế của mắt người bởi luật phối cảnh.