Unity - Hướng dẫn nhanh

Unity là một công cụ trò chơi đa nền tảng ban đầu được phát hành bởi Unity Technologies, vào năm 2005. Trọng tâm của Unity nằm ở việc phát triển cả trò chơi 2D và 3D và nội dung tương tác. Unity hiện hỗ trợ hơn20 các nền tảng mục tiêu khác nhau để triển khai, trong khi các nền tảng phổ biến nhất của nó là hệ thống PC, Android và iOS.

Unity có bộ công cụ hoàn chỉnh để thiết kế và xây dựng trò chơi, bao gồm giao diện cho đồ họa, âm thanh và các công cụ xây dựng cấp độ, yêu cầu sử dụng tối thiểu các chương trình bên ngoài để làm việc trong các dự án.

Trong loạt bài này, chúng ta sẽ -

  • Học cách sử dụng các nguyên tắc cơ bản khác nhau của Unity
  • Hiểu cách mọi thứ hoạt động trong động cơ
  • Hiểu các khái niệm cơ bản về thiết kế trò chơi
  • Tạo và xây dựng các trò chơi mẫu thực tế
  • Học cách triển khai dự án của bạn ra thị trường

Bây giờ chúng ta hãy bắt đầu.

Để tạo nội dung với Unity, yêu cầu chính là tải xuống công cụ Unity và môi trường phát triển. Cùng với công cụ cốt lõi, bạn cũng có thể tải xuống tùy chọnmodules để triển khai đến nhiều nền tảng khác nhau, cũng như các công cụ để tích hợp tập lệnh Unity vào Visual Studio.

Để cài đặt Unity, hãy truy cập vào phần này Khi ở đó, hãy nhấp vào -

  • Choose your Unity + Download.

Trên trang tiếp theo, nhấp vào Try Now nút phía dưới Personal. Đây là phiên bản miễn phí của Unity, chứa tất cả các tính năng cốt lõi. Khi chúng ta bắt đầu loạt bài này, tốt hơn là bạn nên tìm hiểu cách sử dụng động cơ trước khi cân nhắc muaPlus hoặc là Pro.

Trên trang tiếp theo, cuộn xuống và nhấp để xác nhận rằng bạn hoặc công ty của bạn không kiếm được hơn 100.000 USD doanh thu hàng năm. Nếu bạn làm vậy, bạn không được phép dùng thử Unity Free, mặc dù bạn có thể đăng ký bản dùng thử miễn phí 30 ngày của phiên bản Pro.

Tiếp theo, nhấp vào nền tảng mong muốn của bạn để cài đặt Unity. Trong loạt bài này, chúng ta sẽ giải quyết vấn đềWindowsphiên bản của động cơ. Cũng có thể cài đặt Unity trênUbuntuvà một số hệ thống Linux bổ sung xem tại đây để biết thêm thông tin

Nó cũng là highlykhuyên bạn nên cài đặt phiên bản mới nhất của Visual Studio , phiên bản này cung cấp nhiều công cụ hữu ích qua IDE MonoDevelop tiêu chuẩn đi kèm với Unity.

Khi trình cài đặt được tải xuống, hãy duyệt qua nó cho đến khi bạn đến menu để chọn những thành phần bạn muốn cài đặt với Unity.

Tại đây, chọn các thành phần mà bạn sẽ cần. Đối với loạt bài này, chúng tôi muốn cài đặt các thành phần mà bạn thấy trong hình ảnh. Lựa chọn này bao gồm chính động cơ, tài liệu về động cơ, một IDE; xây dựng các công cụ cho Android và một bộ sưu tập nội dung mà bạn có thể thêm vào dự án của mình sau này.

Nhấp vào tiếp theo, làm theo hướng dẫn và tùy chọn và để Unity tải xuống và cài đặt chính nó trên máy tính của bạn.

Mở Unity, và trong bài học tiếp theo, chúng ta sẽ tạo dự án đầu tiên của mình.

Tạo dự án đầu tiên của bạn

Unity phù hợp như nhau cho cả trò chơi 2D và 3D. Tất cả các trò chơi được tạo trong Unity đều bắt đầu nhưProjects từ Màn hình Khởi động.

Mở bản sao Unity mới được cài đặt của bạn; màn hình sẽ xuất hiện như hình dưới đây -

Các dự án hiện có của bạn sẽ hiển thị trong vùng mờ như trong hình trên.

Ở góc trên bên phải của cửa sổ, bạn sẽ thấy Newbiểu tượng như hình trên. Khi nhấp vào biểu tượng, bạn sẽ đến màn hình Thiết lập dự án.

Tại đây, bạn có thể đặt tên cho dự án của mình, đặt vị trí nơi nó được lưu, đặt loại dự án và thêm tài sản hiện có.

Bây giờ, hãy để chúng tôi đặt tên cho dự án đầu tiên của mình là “Hello World!” và đặt nó thành2D chế độ.

Nhấp chuột Create Projectvà để Unity thiết lập các tệp cốt lõi của dự án của bạn. Điều này có thể mất thời gian tùy thuộc vào tốc độ máy tính, nội dung được thêm trước và loại Dự án của bạn.

Biết động cơ

Khi dự án mới của bạn được tạo và Unity mở ra, màn hình sau sẽ xuất hiện:

Hãy để chúng tôi xem qua những gì hiển thị trong cửa sổ này. Hiện tại, chúng tôi quan tâm đến bốn khu vực chính -

Cửa sổ này là nơi chúng tôi sẽ xây dựng Scenes. Cảnh làlevelstrong đó mọi thứ trong trò chơi của bạn diễn ra. Nếu bạn nhấp vào nhỏGame, bạn có thể thấy cửa sổ Xem trước về cách trò chơi trông như thế nào đối với người chơi. Hiện tại, nó phải là một nền đơn giản, màu xanh lam.

Khu vực này là Inspector. Hiện tại nó đang trống, bởi vì chúng ta không có bất kỳ đối tượng nào trong cảnh của chúng ta. Chúng ta sẽ xem cách Thanh tra được sử dụng ở phần sau.

Cửa sổ này là Scene Hierarchy. Đó là nơi liệt kê tất cả các đối tượng trong cảnh đang mở của bạn, cùng với hệ thống phân cấp cha-con của chúng. Chúng tôi sẽ sớm thêm các đối tượng vào danh sách này.

Cuối cùng, khu vực này là Project Assetscửa sổ. Tất cả tài sản trong dự án hiện tại của bạn được lưu trữ và lưu giữ tại đây. Tất cả nội dung được nhập từ bên ngoài như kết cấu, phông chữ và tệp âm thanh cũng được lưu giữ ở đây trước khi chúng được sử dụng trong một cảnh.

Trong bài tiếp theo, chúng ta sẽ thảo luận về quy trình làm việc và hoạt động của một trò chơi trong Unity.

Unity hoạt động như thế nào?

Trong Unity, tất cả các trò chơi diễn ra trong scenes. Cảnh là cấp độ trong đó tất cả các khía cạnh của trò chơi của bạn như cấp độ trò chơi, màn hình tiêu đề, menu và cảnh cắt diễn ra.

Theo mặc định, một Cảnh mới trong Unity sẽ có Camera đối tượng trong cảnh được gọi là Main Camera. Có thể thêm nhiều camera vào hiện trường, nhưng hiện tại chúng ta sẽ chỉ xử lý camera chính.

Máy ảnh chính hiển thị mọi thứ mà nó nhìn thấy hoặc "chụp" trong một khu vực cụ thể được gọi là viewport. Mọi thứ đi vào khu vực này sẽ hiển thị cho người chơi.

Bạn có thể xem khung nhìn này dưới dạng hình chữ nhật màu xám bằng cách đặt chuột vào bên trong chế độ xem cảnh và cuộn xuống để thu nhỏ chế độ xem cảnh. (Bạn cũng có thể làm như vậy bằng cách giữ Alt và kéo Nhấp chuột phải).

A scene bản thân nó được tạo ra từ objects, gọi là GameObjects. GameObjects có thể là bất cứ thứ gì từ mô hình của người chơi đến GUI trên màn hình, từ các nút và kẻ thù cho đến các “trình quản lý” vô hình như nguồn âm thanh.

GameObjects có một bộ components gắn liền với chúng, mô tả cách họ cư xử trong cảnh, cũng như cách họ phản ứng với những người khác trong cảnh.

Trên thực tế, chúng ta có thể khám phá điều đó ngay bây giờ. Bấm vàoMain Camera bên trong Scene Hierarchy và nhìn vào Inspector. Nó sẽ không trống bây giờ; thay vào đó, nó sẽ có một loạt "mô-đun" trong đó.

Thành phần quan trọng nhất đối với bất kỳ GameObject nào là Transformthành phần. Bất kỳ đối tượng nào tồn tại trong một cảnh sẽ cótransform, xác định vị trí, vòng quay và quy mô của nó đối với thế giới trò chơi hoặc cha mẹ của nó nếu có.

Các thành phần bổ sung có thể được gắn vào một đối tượng bằng cách nhấp vào Add Componentvà chọn thành phần mong muốn. Trong các bài học tiếp theo, chúng tôi cũng sẽ đính kèmScripts cho GameObjects để chúng tôi có thể cung cấp cho họ hành vi được lập trình.

Bây giờ chúng ta hãy xem xét một vài ví dụ về các thành phần -

  • Renderer - Chịu trách nhiệm kết xuất và làm cho các đối tượng hiển thị.

  • Collider - Xác định ranh giới va chạm vật lý cho các đối tượng.

  • Rigidbody - Cung cấp cho một đối tượng các thuộc tính vật lý thời gian thực như trọng lượng và trọng lực.

  • Audio Source - Cung cấp các thuộc tính đối tượng để phát và lưu trữ âm thanh.

  • Audio Listener - Thành phần thực sự “nghe” âm thanh và xuất nó ra loa của người chơi. Theo mặc định, một cái tồn tại trong máy ảnh chính.

  • Animator - Cấp cho một đối tượng quyền truy cập vào hệ thống hoạt ảnh.

  • Light - Làm cho đối tượng hoạt động như một nguồn sáng, với một loạt các hiệu ứng khác nhau.

Trong biểu đồ này, chúng ta có thể thấy cách Unity composes chính nó thông qua GameObjects vào các cảnh.

Trong bài học tiếp theo, chúng ta sẽ tạo GameObject đầu tiên của mình và đi sâu vào viết kịch bản.

Sprites là các đối tượng 2D đơn giản có hình ảnh đồ họa (được gọi là textures) về họ. Unity sử dụng sprites theo mặc định khi engine ở chế độ 2D. Khi được xem trong không gian 3D, các sprite sẽ có vẻ mỏng như tờ giấy, vì chúng không có chiều rộng Z.

Sprites luôn hướng về máy ảnh ở một góc vuông góc trừ khi được quay trong không gian 3D.

Bất cứ khi nào Unity tạo ra một sprite mới, nó sẽ sử dụng một kết cấu. Kết cấu này sau đó được áp dụng trên GameObject mới vàSprite Rendererthành phần được gắn vào nó. Điều này làm cho gameObject của chúng tôi hiển thị với kết cấu của chúng tôi, cũng như cung cấp cho nó các thuộc tính liên quan đến cách nó trông trên màn hình.

Để tạo một sprite trong Unity, chúng ta phải cung cấp cho engine một texture.

Hãy để chúng tôi tạo kết cấu của chúng tôi trước. Lấy một tệp hình ảnh tiêu chuẩn như PNG hoặc JPG mà bạn muốn sử dụng, lưu nó, sau đó kéo hình ảnh vàoAssets vùng Unity.

Tiếp theo, kéo hình ảnh từ Assets vào Scene Hierarchy. Bạn sẽ nhận thấy rằng ngay sau khi bạn buông nút chuột, một GameObject mới với tên kết cấu của bạn sẽ xuất hiện trong danh sách. Bạn cũng sẽ thấy hình ảnh bây giờ ở giữa màn hình trongScene View.

Chúng ta hãy xem xét các điểm sau trong khi tạo một sprite:

  • Bằng cách kéo từ một nguồn bên ngoài vào Unity, chúng tôi đang thêm một Asset.

  • Nội dung này là một hình ảnh, vì vậy nó trở thành texture.

  • Bằng cách kéo kết cấu này vào hệ thống phân cấp cảnh, chúng tôi đang tạo một GameObject mới có cùng tên với kết cấu của chúng tôi, với một Trình kết xuất Sprite được đính kèm.

  • Trình kết xuất hình ảnh này sử dụng kết cấu đó để vẽ hình ảnh trong trò chơi.

Bây giờ chúng tôi đã tạo ra một sprite trong cảnh của chúng tôi.

Trong bài học tiếp theo, chúng ta sẽ xem xét một số modifiers cho các sprite chúng tôi có.

Sprite mà chúng tôi vừa nhập cũng có thể được thao tác theo nhiều cách khác nhau để thay đổi giao diện của nó.

Nếu bạn nhìn vào góc trên cùng bên trái của giao diện của engine, bạn sẽ thấy một thanh công cụ như hình dưới đây:

Hãy để chúng tôi thảo luận về chức năng của các nút này.

  • Các Hand công cụ được sử dụng để di chuyển xung quanh cảnh mà không ảnh hưởng đến bất kỳ đối tượng nào.

  • Tiếp theo, chúng tôi có Movedụng cụ. Điều này được sử dụng để di chuyển các đối tượng trong thế giới trò chơi xung quanh.

  • Ở trung tâm, chúng tôi có Rotate để xoay các đối tượng dọc theo trục Z của thế giới trò chơi (hoặc đối tượng mẹ).

  • Các Scalingcông cụ được đặt lên trên. Công cụ này cho phép bạn sửa đổi kích thước (tỷ lệ) của các đối tượng dọc theo các trục nhất định.

  • Cuối cùng, chúng tôi có Rectdụng cụ. Công cụ này hoạt động giống như sự kết hợp củaMoveScalingcông cụ, nhưng dễ bị mất độ chính xác. Nó hữu ích hơn trong việc sắp xếp các phần tử giao diện người dùng.

Những công cụ này tỏ ra xứng đáng khi mức độ phức tạp của dự án tăng lên.

Khi chúng ta vừa mới bắt đầu, chúng ta đã thảo luận về cách biến đổi của gameObject được cho là thành phần quan trọng nhất của nó. Hãy để chúng tôi thảo luận chi tiết về thành phần trong chương này. Ngoài ra, chúng ta cũng sẽ tìm hiểu về khái niệmObject Parenting.

Biến đổi có ba thuộc tính có thể nhìn thấy - position, các rotation, và scale. Mỗi trong số này có ba giá trị cho ba trục. Các trò chơi 2D thường không tập trung vào trục Z khi nói đến vị trí. Việc sử dụng trục Z phổ biến nhất trong các trò chơi 2D là trong việc tạo thị sai .

Các thuộc tính xoay xác định số lượng xoay (theo độ) mà một đối tượng được quay quanh trục đó đối với thế giới trò chơi hoặc đối tượng chính.

Quy mô của một đối tượng xác định cách thức largenó là khi so sánh với kích thước ban đầu hoặc gốc của nó. Ví dụ, chúng ta hãy lấy một hình vuông có kích thước 2x2. Nếu hình vuông này được chia tỷ lệ với trục X bằng 3 và trục Y bằng 2, chúng ta sẽ có một hình vuông có kích thước 6x4.

Trong phần tiếp theo, chúng ta sẽ thảo luận về những gì Object Parenting Là.

Nuôi dạy con theo đối tượng là gì?

Trong Unity, các đối tượng tuân theo một Hierarchyhệ thống. Sử dụng hệ thống này, GameObjects có thể trở thành “cha mẹ” của các GameObject khác.

Khi một GameObject có cha mẹ, nó sẽ thực hiện tất cả các thay đổi biến đổi của nó đối với một GameObject khác thay vì thế giới trò chơi.

Ví dụ: một đối tượng không có cha mẹ được đặt tại (10, 0 và 0) sẽ cách tâm thế giới trò chơi 10 đơn vị.

Tuy nhiên, một gameObject with a parent placed tại (10, 0, 0) sẽ xem xét parent’s vị trí hiện tại để trở thành trung tâm.

GameObjects có thể được tạo cha mẹ đơn giản bằng cách kéo và thả chúng vào cha mẹ mong muốn. Đối tượng “con” được mô tả trong danh sách đối tượng với một vết lõm nhỏ cùng với mũi tên bên cạnh đối tượng chính.

Parenting GameObjects có một số cách sử dụng. Ví dụ: tất cả các bộ phận khác nhau của xe tăng có thể là GameObject riêng biệt, được đặt dưới một GameObject duy nhất có tên là “xe tăng”. Bằng cách đó, khi GameObject mẹ “xe tăng” này di chuyển, tất cả các bộ phận sẽ di chuyển cùng với nó vì vị trí của chúng được cập nhật liên tục theo cha mẹ của chúng.

Trong bài học tiếp theo của chúng ta, chúng ta sẽ thảo luận về các tài sản nội bộ. Chúng tôi cũng sẽ học cách tạo và quản lý các tài sản trong dự án của mình.

Cùng với các nội dung bên ngoài mà bạn nhập từ các chương trình khác như tệp âm thanh, hình ảnh, mô hình 3D, v.v., Unity cũng cung cấp việc tạo Internaltài sản. Những nội dung này được tạo trong chính Unity và như vậy không cần bất kỳ chương trình bên ngoài nào để tạo hoặc sửa đổi.

Một vài ví dụ quan trọng về internal nội dung như được hiển thị bên dưới -

  • Scenes - Những thứ này hoạt động như "cấp độ".

  • Animations - Những thứ này chứa dữ liệu cho các hoạt ảnh của gameObject.

  • Materials - Những điều này xác định cách ánh sáng ảnh hưởng đến sự xuất hiện của một đối tượng.

  • Scripts - Mã sẽ được viết cho gameObjects.

  • Prefabs - Chúng hoạt động như "bản thiết kế" cho GameObjects để chúng có thể được tạo trong thời gian chạy.

Một số nội dung quan trọng khác là Trình giữ chỗ, Hình vẽ và Mô hình. Chúng được sử dụng khi bạn cần trình giữ chỗ nhanh chóng để chúng có thể được thay thế bằng đồ họa và mô hình thích hợp sau này.

Để tạo nội dung nội bộ, hãy nhấp chuột phải vào thư mục Nội dung và chuyển đến Create.

Trong ví dụ này, chúng tôi sẽ tạo Triangle và một Square.

Cuộn qua Sprites lựa chọn và nhấp vào Triangle.

Lặp lại quy trình cho Squarevà bạn sẽ có hai nội dung đồ họa mới.

Khi chúng ta tiếp tục, chúng ta sẽ khám phá thêm các nội dung này, vì chúng rất quan trọng để xây dựng một trò chơi phù hợp.

Vào cuối ngày, khi bạn đã hoàn thành một lượng công việc tương đối, bạn muốn lưu lại tiến độ của mình. Trong Unity, nhấn Ctrl + S sẽ không trực tiếp lưu dự án của bạn.

Mọi thứ trong Unity đều xảy ra theo từng cảnh. Lưu và tải cũng vậy; bạn phải lưu công việc hiện tại của mình dưới dạng một cảnh (phần mở rộng .unity) trong nội dung của mình.

Hãy để chúng tôi thử nó. Nếu chúng ta nhấn Ctrl + S và đặt tên cho cảnh của mình, chúng ta sẽ thấy một nội dung mới trong vùng Nội dung của chúng ta. Đây là tệp cảnh.

Bây giờ, chúng ta hãy thử tạo một cảnh mới. Để làm như vậy, hãy nhấp chuột phải vào Nội dung và chuyển đến Tạo → Cảnh. Đặt tên cho cảnh mới của bạn và nhấn enter.

Trong chế độ Trình chỉnh sửa (khi trò chơi không chơi), các cảnh có thể được tải vào trình chỉnh sửa bằng cách nhấp đúp vào chúng. Tải một cảnh có các thay đổi chưa được lưu trên cảnh hiện tại của bạn sẽ nhắc bạn lưu hoặc hủy các thay đổi của mình.

Tập lệnh đầu tiên của bạn

Nhập hình ảnh và để chúng ở yên trong trò chơi của bạn sẽ không thực sự đưa bạn đến đâu. Có lẽ nó sẽ tạo nên một khung ảnh đẹp nhưng không phải là một trò chơi.

Scriptingbắt buộc phải tạo trò chơi trong Unity. Viết kịch bản là quá trình viếtblocksmã được đính kèm giống như các thành phần với GameObjects trong cảnh. Kịch bản là một trong những công cụ mạnh mẽ nhất theo ý bạn và nó có thể tạo ra hoặc phá vỡ một trò chơi hay.

Tập lệnh trong Unity được thực hiện thông qua việc triển khai JavaScript của C # hoặc Unity, được gọi là UnityScript (tuy nhiên, với chu kỳ 2018, UnityScript hiện đang bắt đầu giai đoạn không dùng nữa, vì vậy bạn không nên sử dụng nó). Với mục đích của loạt bài này, chúng tôi sẽ sử dụng C #.

Để tạo tập lệnh mới, hãy nhấp chuột phải vào Nội dung của bạn và chuyển đến Create → C# Script. Bạn cũng có thể sử dụngAssets ở thanh trên cùng của động cơ.

Khi bạn tạo một tập lệnh mới, một nội dung mới sẽ hiển thị. Trong lúc này, hãy giữ nguyên tên và nhấp đúp vào nó. IDE mặc định của bạn sẽ mở ra cùng với tập lệnh. Hãy để chúng tôi xem nó thực sự là gì.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour {
   // Use this for initialization
   void Start() { 
   }
   // Update is called once per frame
   void Update() {

   }
}

Bạn sẽ thấy tên tập lệnh của mình dưới dạng class Bắt nguồn từ MonoBehaviour. MonoBehaviour là gì? Nó là một thư viện rộng lớn của các lớp và phương thức. Nó giúp tất cả các script trong Unity bắt nguồn từ cách này hay cách khác. Bạn càng viết nhiều script trong Unity, bạn sẽ càng nhận ra MonoBehaviour thực sự hữu ích như thế nào.

Khi tiếp tục, chúng tôi có hai tập lệnh riêng tư không có bất kỳ kiểu trả về nào, đó là StartUpdatecác phương pháp. CácStart chạy phương pháp once đối với khung hình đầu tiên mà gameObject này được sử dụng đang hoạt động trong cảnh.

Các Updatephương thức chạy mọi khung hình của trò chơi sau phương thức Bắt đầu. Thông thường, các trò chơi trong Unity chạy ở 60 FPS hoặc khung hình / giây, có nghĩa làUpdate phương thức được gọi 60 lần mỗi giây trong khi đối tượng đang hoạt động.

Tập lệnh Unity cho phép bạn tận dụng toàn bộ lớp MonoBehaviour, cũng như các tính năng cốt lõi của C # như tập hợp chung, biểu thức lambda và phân tích cú pháp XML, để đặt tên cho một số. Trong bài học tiếp theo, chúng ta sẽ viết đoạn mã đầu tiên của mình!

Trong bài học này, chúng ta sẽ viết mã làm cho một gameObject di chuyển lên, xuống, trái và phải dựa trên đầu vào của người dùng. Điều này sẽ giúp chúng tôi hiểu quy trình làm việc của Unity script dễ dàng hơn.

Hãy nhớ rằng mọi GameObject đều có ít nhất một thành phần - Transform. Điều đặc biệt là Transform của một gameObject cũng hiển thị dưới dạng các biến trong phần script của Unity để chúng ta có thể sửa đổi nó thông qua mã. Điều này cũng không bị hạn chế đối với Transform; tất cả các thành phần trong Unity đều có các thuộc tính, có thể truy cập được thông qua các biến trong script.

Hãy để chúng tôi bắt đầu với kịch bản chuyển động của chúng tôi. Tạo một tập lệnh mới và đặt tên là “Movement”.

Bây giờ, mở script và bạn sẽ thấy những thứ tương tự như bạn đã thấy trong bài học trước.

Hãy để chúng tôi tạo một biến float công khai có tên speed. Tạo một biếnpublic trong Unity có một lợi thế lớn -

  • Biến hiển thị dưới dạng trường có thể sửa đổi bên trong trình chỉnh sửa, vì vậy bạn không phải điều chỉnh thủ công các giá trị trong mã.

public class Movement : MonoBehaviour {
   public float speed;
}

Nếu chúng ta lưu tập lệnh này mà không chạm vào các phương thức khác, thì nó sẽ được biên dịch trong Unity.

(Bạn có thể thấy khi nó đang biên dịch bằng

biểu tượng ở góc dưới cùng bên phải.)

Kế tiếp, drag and droptập lệnh từ Nội dung vào GameObject. Nếu bạn làm đúng, đây là những gì bạn sẽ thấy trong các thuộc tính của GameObject -

Vì giá trị tốc độ có thể điều chỉnh được và không cần phải thay đổi mã mọi lúc, chúng ta có thể sử dụng phương thức update () thay vì start ().

Bây giờ chúng ta hãy xem xét các mục tiêu cho phương pháp Cập nhật -

  • Kiểm tra đầu vào của người dùng.

  • Nếu có đầu vào của người dùng, hãy đọc hướng dẫn của đầu vào.

  • Thay đổi các giá trị vị trí của chuyển đổi của đối tượng dựa trên tốc độ và hướng của nó. Để làm như vậy, chúng tôi sẽ thêm mã sau:

void Update() {
   float h = Input.GetAxisRaw(“Horizontal”);
   float v = Input.GetAxisRaw(“Vertical”);
   
   gameObject.transform.position = new Vector2 (transform.position.x + (h * speed), 
      transform.position.y + (v * speed));

Bây giờ chúng ta hãy thảo luận về mã trong breif.

Trước hết, chúng tôi tạo một biến dấu chấm động có tên h (đối với chiều ngang) và giá trị của nó được cho bởi Input.GetAxisRawphương pháp. Phương thức này trả về -1, 0 hoặc 1 tùy thuộc vào phím người chơi đã nhấn trên mũi tên lên / xuống / trái / phải.

Lớp Đầu vào chịu trách nhiệm nhận đầu vào từ người dùng dưới dạng nhấn phím, nhập chuột, nhập bộ điều khiển, v.v. Phương thức GetAxisRaw hơi khó hiểu, vì vậy chúng ta sẽ quay lại vấn đề đó sau.

Tiếp theo, chúng tôi updating vị trí của trò chơi của chúng tôi Đối tượng đến một vị trí mới được xác định bằng cách tạo Vector2. Vector2 nhận 2 tham số, đó làx and ycác giá trị tương ứng. Đối với giá trị x, chúng tôi cung cấp tổng giá trị của đối tượngcurrent vị trí và nó speed, thêm một cách hiệu quả mỗi khung hình mà phím được nhấn vào vị trí của nó.

Lưu tập lệnh này và quay lại Unity. Unity sẽ tự động cập nhật tất cả các tập lệnh khi nó biên dịch thành công, vì vậy bạn không phải đính kèm lại tập lệnh nhiều lần.

Bây giờ bạn đã hoàn tất, hãy thay đổi giá trị của speedtrong thuộc tính của GameObject để nói 0,8. Điều này rất quan trọng vì giá trị cao hơn sẽ khiến người chơi di chuyển quá nhanh.

Bây giờ, hãy nhấp vào Play và xem trò chơi nhỏ đầu tiên của bạn đang hoạt động!

Thử nhấn các phím mũi tên và di chuyển xung quanh. Để dừng trò chơi, chỉ cần nhấn Play lại. Bạn thậm chí có thể điều chỉnh tốc độ trong thời gian thực để không phải dừng và khởi động nó mọi lúc.

Trong bài học tiếp theo, chúng ta sẽ tìm hiểu về các vật cứng và va chạm.

Các va chạm trong Unity được tách ra khỏi chính Sprite thực tế, được gắn như các thành phần riêng biệt và được tính toán riêng. Bây giờ chúng ta hãy tìm hiểu nguyên nhân đằng sau điều này.

Everythingtrong trò chơi của bạn là một GameObject. Ngay cả các ô riêng lẻ tạo nên cấp độ của bạn cũng là GameObjects của chính chúng.

Khi chúng tôi coi mọi thành phần là một GameObject, chúng tôi nhận ra rằng có thể có thousandscủa GameObjects trong một cảnh, tương tác với nhau theo một cách nào đó. Bạn có thể tưởng tượng rằng nếu Unity thêm các va chạm vào từng GameObject, thì công cụ này sẽ không thực tế khi tính toán các va chạm cho mỗi một trong số chúng.

Chúng tôi sẽ tiếp tục và thêm một “bức tường” đơn giản mà nhân vật người chơi của chúng tôi có thể va vào. Để làm như vậy, hãy tạo một sprite khác và mở rộng quy mô nó bằng công cụ Rect. Chúng tôi cũng sẽ cung cấp cho nó một màu đỏ thông quaColor trong thành phần Sprite Renderer.

Bây giờ, đi tới Add Componenttrong Thanh tra và nhập “Box Collider 2D”. Bấm vào thành phần đầu tiên hiển thị và một thành phần mới sẽ xuất hiện.

Bạn sẽ thấy một đường màu xanh lục sáng trên chu vi của GameObject của bạn. Đây làcollision boundary. Nó là những gì xác định thực tếshape của các vật thể va chạm.

Lặp lại tương tự với GameObject di động của chúng tôi.

Tất nhiên, va chạm trong Unity không chỉ giới hạn ở các hộp. Chúng có thể có nhiều hình dạng và kích thước khác nhau và không nhất thiết phải là bản sao của các tham số của đối tượng.

Chúng cũng có thể có hình dạng đa giác.

Không có gì lạ khi thấy các nhà phát triển và nhà thiết kế sử dụng approximatehình dạng trong ranh giới va chạm của chúng để đơn giản hóa các máy va chạm của chúng và tránh các tính toán không cần thiết cho động cơ. Chúng ta sẽ sớm học cách tạo ra các hình dạng và kích thước khác nhau bằng máy va chạm.

Bây giờ chúng ta đã có ranh giới va chạm, hãy chơi và xem nó hoạt động.

Bạn sẽ nhận thấy rằng đối tượng di chuyển của chúng ta không hoạt động bình thường. Chúng ta sẽ thảo luận về hành vi của đối tượng trong chương tiếp theo của chúng ta.

Vấn đề chính với các va chạm trong chương trước là với mã. We will now modify the values of the GameObject’s position directly. Chúng tôi chỉ đơn giản là thêm một giá trị vào vị trí, nếu người chơi đang nhấn một phím. Chúng tôi cần một cách để làm cho người chơi di chuyển theo cách mà nó phản ứng đúng với các ranh giới và các GameObject khác.

Để làm như vậy, chúng ta cần hiểu những gì rigidbodiesChúng tôi. Rigidbodies là các thành phần cho phép GameObject phản ứng vớireal-time physics. Điều này bao gồm các phản ứng với lực và trọng lực, khối lượng, lực cản và động lượng.

Bạn có thể gắn Rigidbody vào GameObject của mình bằng cách chỉ cần nhấp vào Add Component và nhập Rigidbody2D vào trường tìm kiếm.

Nhấp vào Rigidbody2D sẽ gắn thành phần vào GameObject của bạn. Bây giờ nó đã được đính kèm, bạn sẽ nhận thấy rằng nhiều trường mới đã mở ra.

Với cài đặt mặc định, GameObject sẽ rơi thẳng đứng downdo trọng lực. Để tránh điều này, hãy đặtGravity Scale đến 0.

Bây giờ, chơi trò chơi sẽ không cho thấy bất kỳ sự khác biệt rõ ràng nào, bởi vì GameObject chưa liên quan gì đến thành phần vật lý của nó.

Để giải quyết vấn đề của chúng tôi, hãy mở lại mã của chúng tôi và viết lại nó.

public class Movement : MonoBehaviour {
   public float speed;
   public Rigidbody2D body;
   // Update is called once per frame
   void Update() {
      float h = Input.GetAxisRaw(“Horizontal”);
      float v = Input.GetAxisRaw(“Vertical”);
      body.velocity = new Vector2(h * speed, v * speed);
   }
}

Chúng tôi có thể thấy rằng chúng tôi tạo ra một referenceđến Rigidbody2D trong khai báo và mã cập nhật của chúng tôi hoạt động trên tham chiếu đó thay vì biến đổi của Đối tượng. Điều này có nghĩa là Rigidbody đã được giao trách nhiệm di chuyển.

Bạn có thể mong đợi bodytham chiếu để ném NullReferenceException, vì chúng tôi chưa gán bất kỳ thứ gì cho nó. Nếu bạn biên dịch và chạy trò chơi như hiện tại, bạn sẽ gặp lỗi sau ở phía dưới bên trái của trình chỉnh sửa

Để khắc phục điều này, chúng ta hãy xem xét thành phần được tạo bởi script. Hãy nhớ rằng các thuộc tính public tạo các trường riêng của chúng trong Unity, như chúng ta đã làm với biến tốc độ.

Điều chỉnh tốc độ đến giá trị cao hơn, khoảng 5 và chơi trò chơi.

Các va chạm của bạn bây giờ sẽ hoạt động chính xác!

Trong chương này, chúng ta hãy tìm hiểu về ranh giới xung đột tùy chỉnh. Chúng ta cũng sẽ học cách điều chỉnh kích thước và hình dạng của máy va chạm.

Hãy để chúng tôi bắt đầu với Box Collider. Box Collider (2D) có 4 cạnh có thể điều chỉnh được và có hình dạng giống như một hình chữ nhật. Trong thành phần của Collider, nhấp vào hộp này -

Bạn sẽ thấy 4 “tay cầm” hiển thị trên máy va chạm. Bạn có thể kéo các tay cầm này xung quanh để điều chỉnh kích thước của chúng.

Đối với các hình dạng đơn giản, Unity cũng phát hiện sự phù hợp nhất có thể cho hình dạng của máy va chạm, miễn là bạn chọn đúng. Ví dụ: chọn máy va chạm hình tròn trên hình tròn sẽ khớp với bán kính của nó.

Đối với các hình dạng phức tạp hơn, Unity sẽ cố gắng tạo ra hình dạng máy va chạm đơn giản nhất nhưng phức tạp nhất. Để làm được điều đó, bạn cần sử dụngPolygon Collider 2D.

Hãy thử nhấp vào nút Chỉnh sửa máy va chạm và thử nghiệm cách điều chỉnh các máy va chạm.

Lập tức và phá hủy các đối tượng được coi là rất quan trọng trong quá trình chơi. Instantiating chỉ đơn giản là mang lại sự tồn tại. Các vật phẩm xuất hiện hoặc "xuất hiện" trong trò chơi, kẻ thù chết, các yếu tố GUI biến mất và các cảnh được tải mọi lúc trong trò chơi. Biết cách loại bỏ đúng cách những đồ vật không cần thiết và làm thế nào để mang những đồ vật bạn làm sau đó càng trở nên cần thiết hơn.

Trước tiên hãy để chúng tôi hiểu những gì prefabsChúng tôi. Prefabs được coi là quan trọng để hiểu cách Instantiation hoạt động trong Unity.

Prefabs giống như blueprintscủa một GameObject. Theo một cách nào đó, Prefabs là mộtcopycủa một GameObject có thể được sao chép và đưa vào một cảnh, ngay cả khi nó không tồn tại khi cảnh đó đang được tạo; nói cách khác, prefabs có thể được sử dụng đểdynamically generate GameObjects.

Để tạo nhà lắp ghép, bạn chỉ cần kéo GameObject mong muốn từ hệ thống phân cấp cảnh của bạn vào dự án Assets.

Bây giờ, để khởi tạo GameObject, chúng tôi gọi Instantiate()trong tập lệnh của chúng tôi. Phương pháp này, được định nghĩa trongMonoBehaviour, lấy GameObject làm tham số, vì vậy nó biết GameObject nào cần tạo / sao chép. Nó cũng có nhiều ghi đè khác nhau để thay đổi chuyển đổi của đối tượng mới khởi tạo, cũng như cách nuôi dạy con cái.

Hãy để chúng tôi thử tạo mới hexagon bất cứ khi nào Space phím được nhấn.

Tạo một tập lệnh mới có tên Instantiatorvà mở nó ra. bên trongUpdate , hãy nhập mã dưới đây.

Ở đây, chúng tôi đang sử dụng GetKeyDown phương pháp của Inputlớp để kiểm tra xem người chơi có nhấn một nút cụ thể trong khung hình cuối cùng hay không. Vì chúng tôi muốn nó tiếp tục kiểm tra, chúng tôi đưa nó vàoUpdate, chạy 60 lần mỗi giây. Phương thức GetKeyDown trả vềtrue nếu khóa được chỉ định bởi KeyCode enum (liệt kê tất cả các phím có thể có trên bàn phím tiêu chuẩn) được nhấn trong khung đó.

public class Instantiator : MonoBehaviour {
   public GameObject Hexagon;
   // Update is called once per frame
   void Update () {
      if (Input.GetKeyDown(KeyCode.Space)) {
         Instantiate(Hexagon);
      }
   }
}

Khai báo GameObject công khai ở trên cùng tạo ra một khe tương tự như chúng tôi đã tạo cho Rigidbody2D trong các bài học trước của chúng tôi. Vị trí này chỉ chấp nhậnprefabs (trong thời gian biên tập) và gameObjects (trong thời gian chạy), tuy nhiên.

Lưu tập lệnh và để nó biên dịch. Sau khi hoàn tất, hãy tạo mới,empty GameObject bằng cách chuyển đến menu chuột phải phân cấp đối tượng của bạn và chọn Create Empty.

Đặt tên cho Đối tượng này một cái gì đó dễ nhận biết chẳng hạn như Instatiator Objectvà đính kèm tập lệnh mới tạo của chúng tôi vào đó. Trong vị trí hiển thị cho GameObject, kéo vào nhà lắp ghép mà chúng tôi đã tạo.

Nếu chúng ta chạy trò chơi ngay bây giờ, nhấn phím cách sẽ tạo ra một đối tượng Hình lục giác mới giống với đối tượng chúng ta đã sử dụng để tạo nhà lắp ghép. Bạn có thể thấy từng hình lục giác được tạo trong hệ thống phân cấp đối tượng. Lý do bạn không thể thấy chúng hiển thị trong trò chơi là vì hiện tại, chúng đều đang được tạoexactly cái này hơn cái kia.

Trong bài học tiếp theo của chúng ta, chúng ta sẽ hiểu về khái niệm hủy đối tượng.

Việc phá hủy GameObjects cũng quan trọng như việc khởi tạo. Trong chương này, chúng ta sẽ học cách tiêu diệt GameObjects.

May mắn thay, việc tiêu diệt GameObjects cũng dễ dàng như việc tạo ra chúng. Bạn chỉ cần một tham chiếu đến đối tượng sẽ bị phá hủy và gọiDestroy() phương thức với tham chiếu này làm tham số.

Bây giờ, chúng ta hãy thử tạo ra 5 hình lục giác sẽ tự phá hủy khi nhấn một phím được chỉ định.

Hãy để chúng tôi tạo một tập lệnh mới có tên HexagonDestroyervà mở nó trong Visual Studio. Chúng tôi sẽ bắt đầu bằng cách công khaiKeyCodeBiến đổi. Mã khóa được sử dụng để chỉ định một phím trên bàn phím tiêu chuẩn và lớp Đầu vào trong các phương thức của nó sử dụng nó. Bằng cách đặt biến này ở chế độ công khai, như chúng ta đã làm với Rigidbody và Prefabs trước đây, chúng ta có thể làm cho nó có thể truy cập được thông qua trình chỉnh sửa. Khi biến được đặt ở chế độ công khai, chúng ta không cầnhardcodechẳng hạn như “KeyCode.A” vào mã. Mã có thể được thực hiện linh hoạt với nhiều đối tượng như chúng ta muốn.

public class HexagonDestroyer : MonoBehaviour {
   
   public KeyCode keyToDestroy;

   // Update is called once per frame
   void Update () {
      
      if (Input.GetKeyDown(keyToDestroy)) {
         Destroy (gameObject);
      }
   }
}

Quan sát cách chúng tôi sử dụng biến có tên “gameObject” (g nhỏ, viết hoa O) trong phương pháp. Điều này mớigameObject biến (thuộc loại GameObject) được sử dụng để tham chiếu đến gameObject mà tập lệnh này được đính kèm. Nếu bạn đính kèm tập lệnh này trên nhiều đối tượng, tất cả chúng sẽ phản ứng theo cùng một cách bất cứ khi nào biến này có liên quan.

Tuy nhiên, đừng nhầm lẫn giữa hai điều này.

  • GameObject với G viết hoa và O là class bao gồm tất cả các GameObject và cung cấp các phương thức tiêu chuẩn như Instantiate, Destroy và các phương thức để tìm nạp các thành phần.

  • gameObject với một small g và viết hoa O là cụ thể instance của một GameObject, được sử dụng để tham chiếu đến gameObject mà tập lệnh này hiện được đính kèm.

Bây giờ chúng ta hãy biên dịch mã của chúng ta và quay lại Unity.

Bây giờ, chúng ta sẽ tạo một hình lục giác mới và đính kèm tập lệnh của chúng ta vào nó. Tiếp theo, nhấp chuột phải vào gameObject trong hệ thống phân cấp và chọnDuplicate. Một sprite mới được tạo trong hệ thống phân cấp; bạn nên sử dụngMovecông cụ để định vị lại nó. Lặp lại các bước để tạo các hình lục giác tương tự.

Nhấp vào từng hình lục giác và xem các thành phần tập lệnh của chúng. Bây giờ bạn có thể đặt các phím riêng lẻ để GameObject tự hủy khi phím đó được nhấn. Ví dụ: chúng ta hãy tạo 5 hình lục giác và đặt chúng để phá hủy khi nhấn các phím A, S, D, F và G.

Bạn có thể đặt cùng một phím trên nhiều hình lục giác và tất cả chúng sẽ tự hủy đồng thời khi phím được nhấn; đây là một ví dụ về việc sử dụnggameObject tham chiếu, mà bạn có thể sử dụng để tham chiếu đến các đối tượng riêng lẻ bằng cách sử dụng tập lệnh mà không cần phải đặt chúng riêng lẻ.

Cùng một phím có thể được đặt trên nhiều hình lục giác và tất cả chúng sẽ tự hủy đồng thời khi phím được nhấn; đây là một ví dụ về việc sử dụnggameObject tham chiếu, mà bạn có thể sử dụng để tham chiếu đến các đối tượng riêng lẻ bằng cách sử dụng tập lệnh mà không cần phải đặt chúng riêng lẻ.

Điều quan trọng là phải hiểu rằng phá hủy một GameObject không có nghĩa là một đối tượng sẽ vỡ tan hoặc phát nổ. Việc phá hủy một đối tượng sẽ đơn giản (và ngay lập tức) chấm dứt sự tồn tại của nó cho đến khi trò chơi (và mã của nó) có liên quan. Các liên kết đến đối tượng này và các tham chiếu của nó hiện đã bị hỏng và việc cố gắng truy cập hoặc sử dụng một trong hai đối tượng này thường sẽ dẫn đến lỗi và sự cố.

Coroutines là công cụ hữu ích nhất khi tạo trò chơi trong Unity. Chúng ta hãy xem xét dòng mã được hiển thị bên dưới để hiểu về coroutines là gì.

IEnumerator MyCoroutineMethod() {
   // Your code here…
   
   yield return null;
}

Nói chung, nếu bạn gọi một hàm trong Unity (hoặc C #, thực sự), hàm sẽ chạy từ đầu đến cuối. Đây là những gì bạn sẽ coi là hành vi “bình thường” khi có liên quan đến mã của bạn. Tuy nhiên, đôi khi chúng tôi muốn cố tình làm chậm một chức năng hoặc làm cho nó chờ lâu hơn khoảng thời gian tích tắc mà nó chạy. Một quy trình đăng quang có khả năng chính xác là: một quy trình đăng ký là một chức năng có khả năngwaitingtiming quy trình của nó, cũng như tạm dừng nó hoàn toàn.

Chúng ta hãy xem xét một ví dụ để hiểu cách thức hoạt động của quy trình đăng ký. Giả sử chúng ta muốn tạo một hình vuông thay đổi màu của nó giữa đỏ và xanh lam trong khoảng thời gian 1 giây.

Để bắt đầu, chúng tôi tạo một sprite. Tiếp theo, tạo một tập lệnh mới và đặt tên cho nóColorChanger. Trong tập lệnh này, chúng tôi nhận được một tham chiếu đếnSprite Renderercủa sprite. Tuy nhiên, chúng tôi sẽ sử dụng một cách khác để lấy thành phần. Thay vì kéo và thả thành phần vào một khe như chúng ta đã làm cho đến nay, chúng ta sẽ yêu cầu mã phát hiện chính thành phần đó.

Điều này được thực hiện thông qua GetComponent, phương thức này trả về thành phần phù hợp đầu tiên mà nó phát hiện. Vì chúng tôi chỉ sử dụng một Sprite Renderer cho mỗi đối tượng, chúng tôi có thể sử dụng phương pháp này để tự động phát hiện và nhận tham chiếu đến trình kết xuất của chúng tôi mỗi lần.

Hãy nhớ rằng trình kết xuất có trách nhiệm làm cho hình vẽ thực sự hiển thị trên màn hình. Trình kết xuất có mộtcolorthuộc tính ảnh hưởng đến màu toàn cầu của sprite; đây là giá trị sẽ được sửa đổi. Làm choColor giá trị công khai sẽ cho phép chúng tôi chọn chúng thông qua trình chỉnh sửa trong chương trình chọn màu mặc định của hệ điều hành của bạn.

private SpriteRenderer sr;

public Color color1;
public Color color2;

void Start () {
   sr = GetComponent<SpriteRenderer>();
   StartCoroutine(ChangeColor());
}

IEnumerator ChangeColor() {
   
   while (true) {
      
      if (sr.color == color1)
         sr.color = color2;
      
      else
         sr.color = color1;
      
      yield return new WaitForSeconds(3);
   }
}

Bây giờ, chúng ta sẽ bẫy hàm coroutine của chúng ta trong một vòng lặp while.

Để tạo một quy trình đăng quang trong C #, chúng ta chỉ cần tạo một phương thức trả về IEnumerator. Nó cũng cần mộtyield returntuyên bố. Câu lệnh trả về lợi nhuận là đặc biệt; nó thực sự ra lệnh cho Unity tạm dừng tập lệnh và tiếp tục ở khung tiếp theo.

Có một số cách có thể được sử dụng để mang lại lợi nhuận; một trong số đó là tạo một phiên bản củaWaitForSecondslớp học. Điều này khiến quy trình đăng quang phải đợi một khoảng thời gian nhất định trong thế giới thực trước khi tiếp tục.

Hãy để chúng tôi biên dịch mã của chúng tôi và quay trở lại Unity. Chúng tôi chỉ cần chọn các màu xen kẽ của chúng tôi và nhấn chơi. Đối tượng của chúng ta bây giờ sẽ chuyển đổi giữa hai màu trong khoảng thời gian 3 giây. Bạn có thể biến khoảng thời gian thành một biến công khai và điều chỉnh tần suất thay đổi màu sắc.

Coroutines được sử dụng rộng rãi cho timednhư phương pháp chúng tôi vừa làm. Sự đa dạng củaWaitForXcác phương pháp có công dụng riêng. Coroutines cũng được sử dụng để chạy các quy trình “bên lề” tự chạy trong khi trò chơi chạy đồng thời. Điều này rất hữu ích, chẳng hạn, để tải các phần ngoài màn hình ở cấp độ lớn trong khi trình phát bắt đầu tại một điểm.

Bảng điều khiển là nơi chúng ta sẽ đọc Developerkết quả đầu ra. Các đầu ra này có thể được sử dụng để kiểm tra nhanh các bit mã mà không cần phải cung cấp thêm chức năng để kiểm tra.

Có ba loại thông báo xuất hiện trong bảng điều khiển mặc định. Những thông báo này có thể liên quan đến hầu hết các tiêu chuẩn của trình biên dịch -

  • Errors
  • Warnings
  • Messages

Lỗi

Lỗi là các vấn đề hoặc ngoại lệ sẽ ngăn mã chạy at all.

Cảnh báo

Cảnh báo là những vấn đề sẽ không ngăn mã của bạn chạy, nhưng có thể gây ra sự cố trong thời gian chạy.

Tin nhắn

Tin nhắn là kết quả đầu ra truyền tải điều gì đó đến người dùng; chúng thường không làm nổi bật các vấn đề.

Chúng tôi thậm chí có thể yêu cầu Bảng điều khiển xuất ra các thông báo, cảnh báo và lỗi của riêng chúng tôi. Để làm như vậy, chúng ta sẽ sử dụng lớp Gỡ lỗi. CácDebug class là một phần của MonoBehaviour, cung cấp cho chúng ta các phương thức để viết thông báo vào Console, khá giống với cách bạn tạo thông báo đầu ra bình thường trong các chương trình khởi động của mình.

Bạn có thể tìm thấy Bảng điều khiển trong tab được gắn nhãn phía trên vùng Nội dung.

Đầu ra của bảng điều khiển hữu ích hơn cho programmer, không phải người dùng cuối hoặc người chơi.

Hãy để chúng tôi thử viết một tin nhắn đơn giản tới Bảng điều khiển. Điều này sẽ thông báo cho chúng tôi khi phím Space được nhấn. Đối với điều này, chúng tôi sẽ sử dụngLog phương pháp, trong đó có một Object dưới dạng một tham số, mà chúng tôi sẽ sử dụng một chuỗi trong đó.

Bạn có thể bắt đầu với một tập lệnh mới hoặc sửa đổi một tập lệnh hiện có.

void Update() {
   if (Input.GetKeyDown(KeyCode.Space))
      Debug.Log(“Space key was pressed!”);
}

Lưu, biên dịch và chạy mã này (tất nhiên bằng cách đính kèm nó vào GameObject), hãy thử nhấn phím cách.

Note - Quan sát thấy thông báo hiển thị ở cuối trình chỉnh sửa.

Nếu bạn nhấp vào tab Bảng điều khiển, bạn sẽ thấy thông báo của mình được in ra.

Tương tự, bạn cũng có thể xuất cảnh báo bằng cách sử dụng LogWarning phương pháp và lỗi với LogErrophương pháp r. Những điều này sẽ tỏ ra hữu ích để kiểm tra các đoạn mã nhỏ mà không thực sự phải triển khai chúng, như bạn sẽ thấy ở phần sau.

Có một lý do khiến trò chơi chú trọng vào âm thanh; nó khá quan trọng để tăng giá trị thẩm mỹ cho trò chơi. Ngay từ lần đầu tiênPong, người ta có thể nghe thấy tiếng bíp và tiếng kêu từ quả bóng chạm vào mái chèo xen kẽ. Đó là một mẫu sóng vuông ngắn thực sự đơn giản vào thời điểm đó, nhưng bạn còn muốn gì hơn nữa từ ông tổ của tất cả các trò chơi điện tử?

Trong cuộc sống thực, nhiều thứ ảnh hưởng đến cách bạn cảm nhận âm thanh; tốc độ của đối tượng, loại kịch bản và nó đến từ hướng nào.

Có một số yếu tố có thể tạo ra tải không cần thiết trên động cơ của chúng tôi. Thay vào đó, chúng tôi cố gắng tạo ra ý tưởng về cách âm thanh của chúng tôi sẽ hoạt động trong trò chơi của chúng tôi và xây dựng xung quanh điều đó. Điều này trở nên đặc biệt nổi bật trong các trò chơi 3D, nơi có 3 trục để giải quyết.

Trong Unity, chúng tôi có các thành phần chuyên dụng để cảm nhận và phát lại âm thanh. Các thành phần này kết hợp với nhau để tạo ra một hệ thống âm thanh đáng tin cậy, mang lại cảm giác tự nhiên cho trò chơi.

Unity cung cấp cho chúng ta một loạt các công cụ và hiệu ứng hữu ích như reverb, hiệu ứng Doppler, hiệu ứng và trộn thời gian thực, v.v. Chúng ta sẽ tìm hiểu về những công cụ này trong các chương tiếp theo.

Các thành phần âm thanh

Trong phần này, chúng ta sẽ tìm hiểu về 3 thành phần chính liên quan đến âm thanh trong Unity.

Nguồn âm thanh

Thành phần Nguồn âm thanh là thành phần chính mà bạn sẽ gắn vào GameObject để làm cho nó phát âm thanh. Nó sẽ phát lại mộtAudioClip khi được kích hoạt thông qua bộ trộn, thông qua mã hoặc theo mặc định, khi nó hoạt động.

AudioClip chỉ đơn giản là một tệp âm thanh được tải vào Nguồn âm thanh. Nó có thể là bất kỳ tệp âm thanh tiêu chuẩn nào, chẳng hạn như .mp3, .wav, v.v. AudioClip cũng là một thành phần trong chính nó.

AudioListener

AudioListener là thành phần listenssang tất cả âm thanh đang phát trong cảnh và chuyển nó đến loa của máy tính. Nó hoạt động giống nhưearscủa trò chơi. Tất cả âm thanh bạn nghe được đều dựa trên vị trí của AudioListener này. Chỉ nên có một AudioListener để nó hoạt động bình thường. Theo mặc định, camera chính có Listener được gắn vào. Listener không có bất kỳ thuộc tính lộ diện nào mà nhà thiết kế muốn quan tâm.

Bộ lọc âm thanh

Đầu ra của Nguồn âm thanh hoặc đầu vào của Trình nghe âm thanh có thể được sửa đổi với sự trợ giúp của Bộ lọc âm thanh. Đây là những thành phần cụ thể có thể thay đổi hồi âm, điệp khúc, lọc, v.v. Mỗi bộ lọc cụ thể đi kèm như một thành phần riêng của nó với các giá trị hiển thị để điều chỉnh âm thanh của nó.

Phát âm thanh

Chúng ta hãy thử tạo một nút phát âm thanh khi nó được nhấp vào. Để bắt đầu, chúng tôi sẽCreate a Hình tròn, và làm cho nó có màu đỏ.

Bây giờ, hãy để chúng tôi đính kèm Audio Source cho sprite này.

Để đối tượng phát âm thanh, chúng ta phải cung cấp cho nó một âm thanh. Hãy để chúng tôi sử dụng hiệu ứng âm thanh này cho mục đích của chúng tôi.

http://www.orangefreesounds.com/ding-sfx/

Tải xuống hiệu ứng âm thanh và kéo nó vào Nội dung.

Khi Unity nhập nội dung này dưới dạng tệp âm thanh, nội dung đó sẽ tự động được chuyển đổi thành AudioClip. Do đó, bạn có thể kéo đoạn âm thanh này từ Nội dung trực tiếp vào khe Đoạn âm thanh trong Nguồn âm thanh của sprite của chúng tôi.

Sau khi bạn kéo đoạn âm thanh từ Nội dung trực tiếp vào khe Đoạn âm thanh trong Nguồn âm thanh của sprite, hãy nhớ bỏ chọn “Phát khi thức tỉnh” trong thuộc tính Nguồn âm thanh; không làm như vậy sẽ làm cho âm thanh phát ngay khi trò chơi bắt đầu.

Bây giờ, chúng ta hãy xem mã của chúng ta. Tạo một tập lệnh mới có tên “BellSound” và mở nó lên.

Vì Nguồn âm thanh của chúng tôi được kiểm soát thông qua mã, nên trước tiên chúng tôi muốn tham chiếu đến nó. Chúng ta sẽ sử dụng phương thức GetComponent như trước đây.

public class BellSound : MonoBehaviour {
   AudioSource mySource;
   // Use this for initialization
   void Start () {
      mySource = GetComponent<AudioSource>();
}

Bây giờ, chúng ta hãy thiết lập phương thức để phát hiện đối tượng đang được nhấp. MonoBehaviour chỉ cung cấp cho chúng tôi phương pháp chúng tôi cần cho nó, có tên là OnMouseDown. Phương thức được gọi bất cứ khi nào con chuột nhấp vào trong phạm vicollider của gameObject đó.

Vì chúng tôi chưa gắn máy va chạm vào nút của mình, hãy để chúng tôi làm như vậy ngay bây giờ.

Chúng tôi sẽ không cần một Rigidbody cho cái này; chúng ta cũng không cần phải truy cập máy va chạm này bằng mã. Nó chỉ phải ở đó để phương pháp hoạt động.

Hãy để chúng tôi kiểm tra phương pháp và xem nó có hoạt động không. Viết đoạn mã sau vào tập lệnh của bạn và đính kèm nó vào nút.

void OnMouseDown() {
   Debug.Log(“Clicked!”);
}

Sau khi bạn lưu tập lệnh và đính kèm, hãy chơi trò chơi. Nhấp vào nút sẽ xuất hiện một thông báo trong Bảng điều khiển.

Bây giờ bạn chỉ còn một bước nữa để phát âm thanh. Tất cả những gì bạn phải làm bây giờ là gọiPlay trong phiên bản Nguồn âm thanh.

void OnMouseDown() {
   mySource.Play();
}

Lưu tập lệnh của bạn và chạy nó trong trò chơi. Nhấp vào nút và bạn sẽ nghe thấy âm thanh phát ra!

Note- Cân nhắc tạo một nút tăng cao độ mỗi khi bạn nhấp vào nó. Sử dụngmySource.pitch và một bộ đếm và xem liệu bạn có thể tìm ra nó hay không.)

Trong phần này, chúng ta sẽ tìm hiểu về quy trình thiết kế Giao diện người dùng hoặc các phần tử UI trong Unity. Điều này bao gồm thiết lập cơ sở, cũng như tổng quan về các yếu tố chung đi kèm với Unity.

Quy trình thiết kế giao diện người dùng trong Unity đi theo một con đường hơi khác so với con đường mà chúng tôi đã trải qua cho đến nay. Đối với người mới bắt đầu, các phần tử giao diện người dùng không phải là GameObject tiêu chuẩn và không thể được sử dụng như vậy. Các phần tử giao diện người dùng được thiết kế khác nhau; nút menu trông đúng ở độ phân giải 4: 3 có thể bị kéo giãn hoặc bị méo ở độ phân giải 16: 9 nếu không được thiết lập đúng cách.

Các phần tử giao diện người dùng trong Unity không được đặt trực tiếp vào hiện trường. Chúng luôn được coi là con của một GameObject đặc biệt được gọi làCanvas. Canvas giống như một "bản vẽ" cho giao diện người dùng trên hiện trường, nơi tất cả các phần tử giao diện người dùng sẽ hiển thị. Tạo một phần tử giao diện người dùng từCreate menu ngữ cảnh không có Canvas hiện có sẽ tự động tạo ra một.

Bây giờ chúng ta hãy xem Canvas GameObject để biết về các thành phần mới bổ sung -

Các Rect Transform ở trên cùng dường như có nhiều thuộc tính mới mà Biến đổi của GameObject tiêu chuẩn không có.

Điều này là do trong khi Biến đổi của GameObject bình thường mô tả một point trong không gian 3D, một RectTransform định nghĩa một tưởng tượng rectangle. Điều này có nghĩa là chúng ta cần các thuộc tính bổ sung để xác định chính xác vị trí của hình chữ nhật, kích thước của nó và cách nó được định hướng.

Chúng ta có thể thấy một số thuộc tính tiêu chuẩn của hình chữ nhật như Chiều cao và Chiều rộng, cũng như hai thuộc tính mới được gọi là Anchors. Neo là các điểm mà các thực thể khác có thể "khóa" trong Canvas. Điều này có nghĩa là nếu một phần tử giao diện người dùng (giả sử, một nút) được cố định vào Canvas ở bên phải, việc thay đổi kích thước Canvas sẽ đảm bảo rằng Nút luôn ở trênright của Canvas.

Theo mặc định, bạn sẽ không thể sửa đổi hình dạng của vùng canvas và nó sẽ là một gigantic hình chữ nhật xung quanh cảnh của bạn.

Tiếp theo là CanvasThành phần. Đây là thành phần chính chứa một số tùy chọn phổ biến về cách giao diện người dùng được vẽ.

Tùy chọn đầu tiên chúng tôi thấy là Render Mode. Thuộc tính này xác định phương pháp được sử dụng để vẽ Canvas lên khung nhìn của trò chơi.

Chúng tôi có ba tùy chọn trong danh sách thả xuống. Hãy để chúng tôi tìm hiểu về các tùy chọn trong các phần tiếp theo của chúng tôi.

Không gian màn hình - Lớp phủ

Chế độ này là tiêu chuẩn nhất cho menu, HUD, v.v. Nó hiển thị giao diện người dùng trên tất cả mọi thứ khác trong cảnh, chính xác cách nó được sắp xếp và không có ngoại lệ. Nó cũng mở rộng giao diện người dùng một cách độc đáo khi kích thước màn hình hoặc cửa sổ trò chơi thay đổi. Đây là Chế độ kết xuất mặc định trong Canvas.

Không gian màn hình - Máy ảnh

Không gian màn hình - Máy ảnh tạo một mặt phẳng chiếu tưởng tượng, một khoảng cách nhất định từ máy ảnh và chiếu tất cả giao diện người dùng lên đó. Điều này có nghĩa là sự xuất hiện của giao diện người dùng trong cảnh phụ thuộc nhiều vào cài đặt được sử dụng bởi máy ảnh; điều này bao gồm phối cảnh, trường nhìn, v.v.

Không gian thế giới

Trong chế độ World Space, các phần tử giao diện người dùng hoạt động như thể chúng là các GameObject thông thường được đưa vào thế giới. Tuy nhiên, chúng tương tự như sprite, vì vậy chúng thường được sử dụng như một phần của thế giới trò chơi thay vì cho người chơi, như màn hình và màn hình trong trò chơi. Do tính chất này, bạn có thể sửa đổi trực tiếp các giá trị của Canvas RectTransform trong chế độ này.

Các Canvas Scalerlà một tập hợp các tùy chọn cho phép bạn điều chỉnh tỷ lệ và diện mạo của các phần tử giao diện người dùng theo cách rõ ràng hơn; nó cho phép bạn xác định cách các phần tử giao diện người dùngresizekhi kích thước của màn hình thay đổi. Ví dụ: các phần tử giao diện người dùng có thể giữ nguyên kích thước bất kể cũng như tỷ lệ với kích thước màn hình hoặc chúng có thể chia tỷ lệ theoReference Resolution.

Graphics Raycaster chủ yếu giải quyết việc raycasting (liên kết đến Unity Documentation cho Raycasting) các phần tử UI và đảm bảo các sự kiện do người dùng khởi tạo như nhấp chuột và kéo hoạt động chính xác.

Trong chương này, chúng ta sẽ tìm hiểu cách chèn các phần tử giao diện người dùng vào cảnh của chúng ta và bắt đầu làm việc với chúng.

Hãy để chúng tôi bắt đầu với một Button. Để chèn một nút, hãy nhấp chuột phải vào Hệ thống phân cấp cảnh và đi tớiCreate → UI → Button. Nếu bạn không có Canvas và EventSystem hiện có, Unity sẽ tự động tạo một Canvas cho bạn, đồng thời đặt nút bên trong Canvas.

Hãy nhớ rằng trong Overlaychế độ kết xuất, là chế độ mặc định, kích thước của Canvas độc lập với kích thước của máy ảnh. Bạn có thể kiểm tra điều này bằng cách nhấp vàoGame chuyển hướng.

Nếu bạn chơi cảnh, bạn sẽ nhận thấy nút đã có một số chức năng tiêu chuẩn như phát hiện khi con chuột đang di chuột qua nó và thay đổi màu sắc khi nhấn.

Nút yêu cầu chức năng thực sự hữu ích trong giao diện người dùng. Chức năng này có thể được thêm vào thông qua các thuộc tính của nó.

Hãy để chúng tôi tạo một tập lệnh mới và gọi nó là ButtonBehaviour.

public class ButtonBehaviour : MonoBehaviour {
   int n;
   public void OnButtonPress(){
      n++;
      Debug.Log("Button clicked " + n + " times.");
   }
}

Chúng tôi đã thực hiện một phương pháp đơn giản ghi lại số lần chúng tôi đã nhấn nút.

Note- Phương pháp này phải được công khai; nó sẽ không được nhận thấy bởi chức năng của Nút nếu không.

Hãy để chúng tôi tạo một GameObject trống và đính kèm tập lệnh này vào nó. Chúng tôi làm điều này bởi vì một nút sẽ không tự làm bất cứ điều gì; nó chỉ gọi phương thức được chỉ định trong tập lệnh của nó.

Bây giờ, hãy đi vào thuộc tính của Nút và tìm OnClick() bất động sản.

Nhấn vào biểu tượng + trên tab dưới cùng và một mục mới sẽ hiển thị trong danh sách.

Mục nhập này xác định đối tượng mà nút bấm hoạt động trên đó và chức năng nào của tập lệnh của đối tượng đó được gọi. Do hệ thống sự kiện được sử dụng trong thao tác nhấn nút, bạn có thể kích hoạt nhiều chức năng chỉ bằng cách thêm chúng vào danh sách.

Kéo và thả GameObject trống, chứa ButtonManager tập lệnh chúng tôi đã tạo, trên None (Object) chỗ.

Điều hướng No Function danh sách thả xuống và tìm kiếm OnButtonPressphương pháp. (Hãy nhớ rằng nó có thể được đặt tên bất cứ thứ gì bạn muốn, OnButtonPress chỉ đơn giản là một quy ước đặt tên được tiêu chuẩn hóa.) Bạn nên tìm thấy nó trongButtonBehaviour phần.

Nếu bạn chơi trò chơi ngay bây giờ, bạn có thể kiểm tra nút và chắc chắn, bảng điều khiển sẽ in ra bạn đã nhấn nút bao nhiêu lần.

Giao diện người dùng văn bản có sẵn của Unity là một điểm khởi đầu tuyệt vời để người học bắt đầu thiết kế giao diện người dùng, ngay cả khi nó có xu hướng bị lu mờ bởi các nội dung do cộng đồng xây dựng mạnh mẽ và hiệu quả hơn.

Đối với mục đích của chúng tôi, phần tử Văn bản vani là quá đủ để bắt đầu.

Văn bản là một phần tử giao diện người dùng riêng biệt của nó chủ yếu là do dynamismcủa phần tử đó. Ví dụ: in điểm số hiện tại của người chơi ra màn hình yêu cầu giá trị số của điểm số được chuyển đổi thành một chuỗi, thường thông qua.toString() trước khi nó được hiển thị.

Để chèn một phần tử giao diện người dùng văn bản, hãy chuyển đến Hệ thống phân cấp cảnh, Create → UI → Text.

Phần tử Văn bản mới sẽ hiển thị trong vùng Canvas của bạn. Nếu chúng ta xem xét các thuộc tính của nó, chúng ta sẽ thấy một số tùy chọn rất hữu ích.

Tuy nhiên, điều quan trọng nhất là Text field. Bạn có thể nhập những gì bạn muốn hộp văn bản nói trong trường đó, nhưng chúng tôi muốn tiến xa hơn thế.

Để thay đổi phông chữ của văn bản, trước tiên bạn phải nhập font filetừ máy tính của bạn vào Unity, dưới dạng Nội dung. Phông chữ không cần phải được gắn vào bất kỳ thứ gì trong cảnh và nó có thể được tham chiếu trực tiếp từ Nội dung.

Phần tử Text cũng có thể được truy cập thông qua script; đây là nơi mà tầm quan trọng củadynamic Giao diện người dùng đi kèm.

Thay vì bảng điều khiển, xuất ra số lần nút đã được nhấn, như trong chương trước; để chúng tôi thực sự in nó ra trên màn hình trò chơi. Để làm như vậy, chúng ta sẽ mở tập lệnh ButtonBehaviour từ bài học trước và thực hiện một vài thay đổi đối với nó.

using UnityEngine;
using UnityEngine.UI;
public class ButtonBehaviour : MonoBehaviour {
   int n;
   public Text myText;
   public void OnButtonPress(){
      n++;
      myText.text = "Button clicked " + n + " times.";
   }
}

Thay đổi đầu tiên chúng tôi đã làm là thêm một tham chiếu không gian tên mới. Tham chiếu này được sử dụng để làm việc với các thành phần giao diện người dùng của Unity và do đó chúng tôi thêmUnityEngine.UI hàng.

Tiếp theo, chúng tôi tạo một biến Văn bản công khai, nơi chúng tôi có thể kéo và thả phần tử Giao diện người dùng Văn bản của mình vào.

Cuối cùng, chúng tôi truy cập văn bản thực tế mà phần tử giao diện người dùng này chứa bằng cách sử dụng myText.text.

Nếu chúng ta lưu tập lệnh của mình, bây giờ chúng ta sẽ thấy một vị trí mới cho phần tử Text UI trong ButtonManager của chúng ta. Chỉ cần kéo và thả gameObject chứa phần tử Văn bản đó vào vị trí và nhấn nút Phát.

Trong chương này, chúng ta sẽ tìm hiểu về phần tử UI cuối cùng trong loạt bài này. Thanh trượt thường được sử dụng trong đó một giá trị nhất định phải được đặt giữa một cặp giá trị lớn nhất và nhỏ nhất. Một trong những cách sử dụng phổ biến nhất là cho âm lượng hoặc độ sáng màn hình.

Để tạo thanh trượt, hãy chuyển đến Tạo → Giao diện người dùng → Thanh trượt. Một mớiSlider phần tử sẽ hiển thị trên cảnh của bạn.

Nếu bạn đi đến các thuộc tính của Slider này, bạn sẽ nhận thấy một loạt các tùy chọn để tùy chỉnh nó.

Hãy để chúng tôi cố gắng tạo ra một volumetrượt ra khỏi thanh trượt này. Đối với điều này, hãy mở tập lệnh ButtonBehaviour (bạn có thể đổi tên ButtonManager GameObject vì nó chắc chắn làm được nhiều việc hơn là chỉ quản lý một nút bây giờ) và thêm một tham chiếu vào Slider. Chúng tôi cũng sẽ thay đổi mã xung quanh một lần nữa.

public class ButtonBehaviour : MonoBehaviour {
   int n;
   public Text myText;
   public Slider mySlider;
   void Update() {
      myText.text = "Current Volume: " + mySlider.value;
   }
}

Hiểu cách chúng tôi đang sử dụng phương pháp Cập nhật để cập nhật liên tục giá trị của myText.text.

Trong thuộc tính thanh trượt, chúng ta hãy chọn hộp "Số nguyên" và đặt giá trị lớn nhất thành 100.

Chúng tôi sẽ đặt màu của văn bản thông qua các thuộc tính của nó để có màu dễ nhìn hơn.

Chúng ta hãy làm theo cùng một quy trình kéo Slider GameObject vào vị trí mới và chơi.

Bạn cũng nên khám phá và thử nghiệm với các điều khiển giao diện người dùng khác để xem cái nào hoạt động theo cách nào.

Trong phần tiếp theo, chúng ta sẽ tìm hiểu về ánh sáng, vật liệu và bộ đổ bóng.

Trong chương này, chúng ta sẽ tìm hiểu sơ lược về vật liệu và bộ tạo bóng. Để hiểu rõ hơn, chúng tôi sẽ tạo một3D Projectthay vì 2D hiện tại của chúng tôi. Điều này sẽ giúp chúng tôi thấy những thay đổi khác nhau.

Khi bạn đã tạo dự án mới, hãy chuyển đến Cấu trúc phân cấp và nhấp chuột phải, và 3D Object → Cube. Điều này sẽ tạo ra một khối mới ở giữa cảnh. Bạn có thể nhìn xung quanh khối lập phương bằng cách giữ chuột phải và kéo chuột trong Chế độ xem cảnh. Bạn cũng có thể phóng to và thu nhỏ bằng con lăn.

Bây giờ, nhấp vào khối lập phương và xem các thuộc tính của nó.

Thuộc tính dưới cùng dường như có vật liệu Mặc định và Standard bóng râm.

Vật liệu là gì?

Trong Unity (và trong nhiều khía cạnh mô hình 3D), Materiallà một tệp chứa thông tin về sự chiếu sáng của một vật thể bằng vật liệu đó. Lưu ý cách một quả cầu màu xám biểu thị vật liệu, với một số ánh sáng chiếu vào từ phía trên.

Bây giờ, đừng nhầm lẫn với tên; Vật chất không liên quan gì đến khối lượng, va chạm, hoặc thậm chí vật lý nói chung. Vật liệu được sử dụng để xác định cách ánh sáng ảnh hưởng đến vật thể bằng vật liệu đó.

Hãy để chúng tôi cố gắng tạo ra tài liệu của riêng mình. Nhấp chuột phải vào vùng Nội dung, chuyển đếnCreate → Material và đặt tên cho nó, chẳng hạn như “Vật liệu của tôi”.

Những đặc tính này không giống bất cứ thứ gì chúng ta đã nghiên cứu cho đến nay. Đó là bởi vì đây là những thuộc tính được lập trình trongshader, không phải vật liệu.

Vật liệu là thứ giúp các đối tượng của bạn có thể nhìn thấy ngay từ đầu. Trên thực tế, ngay cả ở chế độ 2D, chúng tôi cũng sử dụng một vật liệu đặc biệt không cần ánh sáng. Tất nhiên, Unity tạo ra và áp dụng nó cho mọi thứ cho chúng tôi, vì vậy chúng tôi thậm chí không nhận thấy nó ở đó.

Shader là gì?

Trình đổ bóng là một chương trình xác định cách every single pixelđược vẽ trên màn hình. Shader không được lập trình bằng C # hoặc thậm chí bằng ngôn ngữ OOPS. Chúng được lập trình trong mộtC-like ngôn ngữ được gọi là GLSL, có thể đưa ra hướng dẫn trực tiếp cho GPU để xử lý nhanh chóng.

Hệ thống Hạt giúp tạo ra một số lượng lớn các hạt có tuổi thọ nhỏ một cách hiệu quả. Các hệ thống này trải qua một quá trình kết xuất riêng biệt; chúng có thể tạo ra các hạt ngay cả khi có hàng trăm hoặc hàng nghìn đối tượng.

Hiện nay, particleslà một thuật ngữ không rõ ràng trong Hệ thống hạt; aparticlelà bất kỳ kết cấu, thể vật chất hoặc thực thể riêng lẻ nào được tạo ra bởi hệ thống hạt. Chúng không nhất thiết phải là những chấm lơ lửng trong không gian (mặc dù chúng có thể có!), Và chúng có thể được sử dụng cho rất nhiều tình huống khác nhau.

GameObject quản lý một Hệ thống hạt có gắn thành phần Hệ thống hạt; hệ thống hạt không yêu cầu bất kỳ Tài sản nào để thiết lập, mặc dù chúng có thể yêu cầu các vật liệu khác nhau tùy thuộc vào hiệu ứng bạn muốn.

Để tạo một hệ thống hạt, hãy thêm thành phần Particle System thông qua cài đặt Thêm thành phần hoặc đi tới Cấu trúc phân cấp và chọn Create → Effects → Particle System. Điều này sẽ tạo ra một GameObject mới với hệ thống hạt được đính kèm.

Nếu bạn nhìn vào các thuộc tính của Hệ thống hạt, bạn sẽ thấy nó bao gồm nhiều modules. Theo mặc định, chỉ có ba mô-đun đang hoạt động; cácEmission, ShapeRenderer. Các mô-đun khác có thể được kích hoạt bằng cách nhấp vào vòng tròn nhỏ bên cạnh tên của chúng.

Ở bên phải của một số giá trị, bạn có thể nhận thấy một mũi tên nhỏ màu đen. Điều này cho phép bạn kiểm soát nhiều hơn các giá trị của từng hạt riêng lẻ. Ví dụ: bạn có thể đặtStart Size đến Random between Two Constants để yêu cầu Hệ thống hạt kết xuất các hạt ngẫu nhiên, có kích thước khác nhau giống như một vòi nước.

Asset Store là một trong những điểm mạnh nhất của Unity trên thị trường game engine; nó bao gồm một số lượng lớn nội dung, công cụ, tập lệnh và thậm chí toàn bộ các dự án làm sẵn để bạn tải xuống.

Để sử dụng Cửa hàng tài sản, bạn cần có Unity ID. Nếu chưa có, bạn có thể tạo tại trang web Unity.

Sau khi bạn tạo một ID Unity, hãy nhấp vào Asset Store trong cùng một hàng với Scene View.

Sau khi đăng nhập, bạn sẽ có thể thấy tên người dùng của mình ở trên cùng bên phải.

Trong ví dụ này, chúng tôi sẽ nhập Survival Shooter Tutorialdự án. Để làm như vậy, chúng tôi sẽ tìm kiếm nó trong tab và nhấp vào nội dung do Unity xuất bản.

Chúng tôi sẽ nhấn Tải xuống và để nó hoàn tất. Khi nó kết thúc,Download nút sẽ thay đổi thành Import; nhấp vào nó một lần nữa để nhập Nội dung mới của bạn vào dự án hiện đang mở.

(Lưu ý - trong trường hợp cụ thể này, chúng tôi đang nhập một dự án đầy đủ; trong trường hợp Unity cảnh báo bạn về điều này, hãy tạo một dự án mới hoặc ghi đè lên dự án hiện có nếu bạn muốn. Cách nào cũng được.)

Một cửa sổ mới sẽ bật lên, liệt kê tất cả nội dung của Nội dung mới mà bạn vừa nhập. Tùy thuộc vào những gì bạn đã tải xuống, đây có thể là một tệp duy nhất, hoặc một loạt tệp hoặc toàn bộ cây với phân cấp các thư mục và tệp. Theo mặc định, Unity sẽ nhập tất cả các thành phần nội dung khi bạn nhấnImport, đó là những gì chúng tôi muốn. Bây giờ, chúng ta hãy nhấp vàoImport để Unity thực hiện công việc của nó.

Cố gắng tải xuống nội dung mà không trả tiền là bất hợp pháp và luôn có khả năng nhiễm vi-rút, lỗi hoặc thiếu bản cập nhật.