Tìm hiểu về Unity
Chào cả nhà, dạo này rảnh rỗi sinh nông nổi tìm hiểu qua loa 1 chút về unity để có thể thêm nghề tay trái làm game đa nền tảng về khoe cho con cháu về sau cũng như có thêm kinh nghiệm khj join vào các dự án Unity khác của công ty. Những gì mình note lại tại đây là dành cho những member mới tiếp cận ...
Chào cả nhà, dạo này rảnh rỗi sinh nông nổi tìm hiểu qua loa 1 chút về unity để có thể thêm nghề tay trái làm game đa nền tảng về khoe cho con cháu về sau cũng như có thêm kinh nghiệm khj join vào các dự án Unity khác của công ty. Những gì mình note lại tại đây là dành cho những member mới tiếp cận với unity như mình, những ng đã có 1 chút kiến thức về lập trình và đơn giản nhất là mình muốn hệ thống lại những gì đã đọc được.
Với mọi ngôn ngữ lập trình, chúng ta tốt nhất vẫn vào trang chủ của nó và học theo các tutorial của họ. Đó là những bài học cơ bản nhưng đầy đủ các kiến thức cần thiết. Khi truy cập vào http://unity3d.com/learn/tutorials/modules. Có rất nhiều video cũng như các mục cần phải học nhưng theo mình tốt nhất cũng ta lên vào thư mục scripting để tìm hiểu về các cái cơ bản là tốt nhất.
Ở đây có 29 mục mà chúng ta cần phải châm cứu, tuỳ với kiến thức của từng ng mà có thể bỏ qua 1 số phần nhỏ. Unity sử dụng trên ngôn ngữ C# và JS, tuỳ vào bạn đã học ngôn ngữ nào mà có thể viết theo ngôn ngữ tương ứng. Nhưng mình thấy C# là 1 ngôn ngữ khá mạnh và phổ biến bậc nhất hiện nay và cực kì dễ học nên mình khuyên bạn nào chưa học thì nên tìm hiểu 1 chút về C#, nó sẽ giúp bạn tiếp cận với các ngôn ngữ hiện đại khá nhanh. Như mọi ngôn ngữ khác các script đều kế thừa từ lớp MonoBehaviour
Trong C#, các biến có các phạm vi truy cập khác nhau:
- Public: sẽ truy cập được từ tất cả mọi nơi
- Private: đc truy cập ngay trong tất cả các phương thức thuộc class đó. Các biến không được khai báo là public thì mặc định sẽ là private.
Cái chũng ta cần quan tâm nữa là các phương thức sẽ được gọi khi khởi tạo các script. Dựa vào đó mà chúng ta bắt các dự kiện xử lí tương ứng. Chúng ta cần chú ý các phương thức sau:
- Awake(): Phương thức này được gọi khi khởi tạo 1 script, chỉ đc gọi 1 lần duy nhất
- Start(): Phương thức này được gọi khi một thành phần nào đó được enable, gọi 1 lần duy nhất
- Update : Phương thức này được gọi khi: - Call Every Frame - Used for regular update such as: - Moving non - physics objects - Simple Timers - Receiving Input - Update interval time vary
- FixedUpdate(): Phương thức này được gọi khi:
- Call every physics step
- Fixed Update intervals are consistent
- Used for reular update such as: adjusting physics (Rigidbody) objects.
Đó là những hàm cơ bản nhưng rất cần thiết cho việc tạo ra ứng dụng unity. Tiếp theo ta cần quan tâm đến 2 phương thức cơ bản cho việc di chuyển các component: TRANSLATE AND ROTATE. Để hiểu rõ ràng và demo cụ thể ta có thể xem qua tại link sau: http://unity3d.com/learn/tutorials/modules/beginner/scripting/translate-and-rotate
using UnityEngine; using System.Collections; public class TransformFunctions : MonoBehaviour { public float moveSpeed = 10f; public float turnSpeed = 50f; void Update () { if(Input.GetKey(KeyCode.UpArrow)) transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime); if(Input.GetKey(KeyCode.DownArrow)) transform.Translate(-Vector3.forward * moveSpeed * Time.deltaTime); if(Input.GetKey(KeyCode.LeftArrow)) transform.Rotate(Vector3.up, -turnSpeed * Time.deltaTime); if(Input.GetKey(KeyCode.RightArrow)) transform.Rotate(Vector3.up, turnSpeed * Time.deltaTime); } }
Ngoài ra chúng ta còn lưu ý đến 1 hàm quan trọng lấy hệ số gần như kiểu random nhưng có thể fix được giá trị: // In this case, result = 4
float result = Mathf.Lerp (3f, 5f, 0.5f);
Có thể áp dụng hàm này với Vector3
Vector3 from = new Vector3 (1f, 2f, 3f); Vector3 to = new Vector3 (5f, 6f, 7f); // Here result = (4, 5, 6) Vector3 result = Vector3.Lerp (from, to, 0.75f);
Với mỗi đối tượng được tạo ra khi không dùng nữa chúng ta cần remove khỏi hệ thống(destroy)
- Destroy Basic
using UnityEngine; using System.Collections; public class DestroyBasic : MonoBehaviour { void Update () { if(Input.GetKey(KeyCode.Space)) { Destroy(gameObject); } } }
- Destroy another
using UnityEngine; using System.Collections; public class DestroyOther : MonoBehaviour { public GameObject other; void Update () { if(Input.GetKey(KeyCode.Space)) { Destroy(other); } } }
- DestroyComponent
using UnityEngine; using System.Collections; public class DestroyComponent : MonoBehaviour { void Update () { if(Input.GetKey(KeyCode.Space)) { Destroy(GetComponent<MeshRenderer>()); } } }
Với mỗi 1 đối tượng ta chỉ khởi tạo 1 lần, và khi cần dùng lại thì ta cần clone lại đối tượng đó, khác hẳn với các ngôn ngữ lập trình khác.
using UnityEngine; using System.Collections; public class UsingInstantiate : MonoBehaviour { public Rigidbody rocketPrefab; public Transform barrelEnd; void Update () { if(Input.GetButtonDown("Fire1")) { Rigidbody rocketInstance; rocketInstance = Instantiate(rocketPrefab, barrelEnd.position, barrelEnd.rotation) as Rigidbody; rocketInstance.AddForce(barrelEnd.forward * 5000); } } }
Camera
Camera được sử dụng để hiển thị cảnh trong game, chúng ta có thể làm cho game của mình trở nên độc đáo hơn nhờ tùy chỉnh Camera. Tron g một cảnh, chúng ta có thể có một hoặc rất nhiều Camera. Các thuộc tính của camera: - Clear Flags: Xác định các bộ phận mà màn hình sẽ bị xóa. Thuận tiện khi sử dụng nhiều máy ảnh và để vẽ nhiều đổi tượng khác nhau. Không xóa nó sẽ hiển thị màu đen xì. - Background: Màu nền cho phần màn hình còn lại. - Culling Mask: Chỉ định các lớp đối tượng của bạn trong Inspector. Cho phép hoặc bỏ qua các đối tượng được hiển thị trong Camera. - Projection: - Perspective: Camera hiển thị các đối tượng theo phối cảnh trọn vẹn. - Orthographic: Hiển thị các đối tượng như một thể thống nhất, không có theo nghĩa của phối cảnh(Perspective). - Size: Kích thước quan sát của Camera khi chọn phép chiếu là: Orthographic. - Field of view: Chiều rộng của góc nhìn Camera. Được đo bằng độ dọc theo trục Local Y. - Clipping plane - Near: Khoảng cách gần nhất hiển thị trong Camera. - Far: Khoảng cách xa nhất hiển thị được trong tầm nhìn của Camera. - Normalized View Port Rect: - X: Bắt đầu từ vị trí ngang mà Camera hiển thị. - Y: Bắt đầu từ vị trí thẳng đứng mà Camera hiển thị. - Depth: Vị trí. Camera có một giá trị lớn hơn sẽ được hiển thị lên đầu. Tức là cái nào có giá trị lớn hơn thì nó sẽ được ưu tiên được hiển thị lên màn hình. - Rendering path: Tùy chọn cho việc xác định phương pháp vẽ những gì sẽ được hiển thị lên Camera. - Use Player Setting: Sử dụng cài đặt Player. - Vertex Lit: tất cả các đối tượng được đưa ra bởi máy ảnh sẽ được trả lại như đối tượng Vertex-Lit. - Forward: tất cả các đối tượng sẽ được trả về như một tài liệu. Giống như tiêu chuẩn Unity 2.x. - Deferred Lighting (Unity Pro only): Mất phí, không chơi. Tất cả các đối tượng sẽ được rút ra mà không có ánh sáng, sau đó tất cả ánh sáng được trả lại trong hàng đợi Render.
- Target Texture: Phiên bản free 4.0 đã có. Tham chiếu đến một texture. Cho phép dựng hình High Dynamic Range cho máy ảnh này.
Tiếp theo là phần sound - Audio Listener: Giống như một thiết bị Microphone. Nó nhận đầu vào từ bất cứ một nguồn âm thanh nào trong Scenes và các âm thanh thông qua máy tính. Đối với hầu hết các ứng dụng, nó là ý nghĩa nhất để gắn tai nghe lên Main Camera. Ranh giới/độ ảnh hưởng âm thanh nghe của Reverb Zone được áp dụng cho toàn Scene thì có thể nghe thấy âm thanh trên bất cứ địa điểm nào của Scene. - Properties: Phải thêm âm thanh vào Scene và chỉnh sửa thuộc tính của âm thanh bên Inspector View. - Audio Clip: Chọn file âm thanh cho Scene. - Mute: bật/tắt âm thanh. - Bypass Effects: Lọc nhanh hiệu ứng “by-pass” to audio source. Một cách dễ dàng nhất để bật/tắt hiệu ứng(effect). - Play on Wake: Nếu enable, âm thanh sẽ được chạy ngay khi ra mắt Scene. Nếu để Disable, khi cần chạy âm thanh chúng ta phải gọi phương thức/chức năng Play() từ Script. - Priority: Xác định độ ưu tiên của Audio Source trong số tất cả các Audio Source có trong Scene.Mặc định(default) = 128, = 0: Rất quan trọng. Sử dụng ở mức 0 cho bài nhạc để tránh bị thường xuyên trao đổi, 256: Độ quan trọng thấp nhất(Độ ưu tiên ở mức thấp nhất). - Volumn: Làm thế nào để âm thanh lớn trên một bộ phận của thế giới Scene từ Audio Source. - Pitch: Số dùng thay đổi tốc độ của âm thanh. Tốc độ bằng 1 là ở mức chạy bình thường. - 3D Source Setting: Cài đặt, cái mà được áp dụng cho Audio source nếu Audio Clip là một file âm thanh 3D. - Pan Lever: Cài đặt, làm thế nào để máy 3D có được hiệu ứng từ Audio source. - Spread: Cài đặt góc ảnh hưởng tới âm thanh 3D Stereo nếu Audio Clip là một âm thanh 3D. - Doppler Lever: Xác định bao nhiêu hiệu ứng âm thanh Dopper sẽ được áp dụng cho Audio Source(Nếu cài đặt là 0 thì sẽ không có hiệu ứng nào được áp dụng). - Min Distance: Với Min Distance, âm thanh sẽ đạt mức to nhất có thể. Ngoài Min Distance, nó sẽ bắt đầu suy yếu đi. Tăng MinDistance của âm thanh để được âm thanh lớn hơn trong thế giới 3D và giảm MinDistance để cho âm thanh nhỏ hơn. - Max Distance: Khoảng cách mà âm thanh dừng suy giảm. Sau khoảng cách này nó sẽ tạm ngừng không cho MinDistance tăng nữa. Tức là đây là giá trị Max mà MinDistance sẽ đạt tới. - Rolloff Mode: Làm thế nào nhanh chóng mất dần âm thanh. Giá trị cao hơn, gần gũi hơn Listener có được trước khi nghe âm thanh.(Điều này được xác định bởi một Graph). - Logarithmic Rolloff: Âm thanh là lớn khi bạn ở gần nguồn âm thanh. Nhưng khi chúng ta nhận được từ các đối tượng nó sẽ giảm đi nhanh chóng một cách đáng kể. - Linear Rolloff: Càng xa nguồn âm thanh, bạn nghe thấy càng ít.