Trong hướng dẫn trước đây của Appual có tiêu đề “Cách tạo trò chơi nền tảng thống nhất cơ bản” ( và phần 2 của nó) , chúng tôi đã sử dụng Unity và plugin WebGL tích hợp để tạo một trò chơi trình duyệt đơn giản dựa trên HTML5 - trong hướng dẫn tương tự này, chúng ta sẽ xem xét cách tạo một Android cơ bản trò chơi sử dụng Unity.
Yêu cầu:
- Thống nhất
- Một trình soạn thảo văn bản tốt như NotePad ++ (Tùy chọn nhưng được khuyến nghị)
- SDK Android
Khởi chạy Unity và tạo một dự án mới. Biến nó thành một dự án 2D.
Có một số bảng để làm quen - bảng Phân cấp sẽ chứa tất cả các yếu tố cảnh của chúng tôi (cảnh =bất kỳ “cấp độ” nào bạn hiện đang làm việc). Sau đó, có tab Trò chơi được sử dụng để chơi / thử trò chơi của bạn khi ở trong trình chỉnh sửa và ở bên phải, bạn có bảng Thanh tra, nơi bạn sẽ chỉnh sửa nhiều thứ khác nhau như ánh sáng, vật lý, v.v.
Điều đầu tiên chúng tôi muốn làm là tạo một sprite - đây sẽ là nhân vật chính của chúng tôi (mà chúng tôi điều khiển). Bạn có thể vẽ sprite của riêng mình, như chỉ vẽ hình vuông bằng mắt hoặc bạn có thể lấy sprite từ internet - chỉ cần đảm bảo đó là tệp .PNG (nền trong suốt).
Kéo và thả sprite của bạn vào cửa sổ cảnh chính (cửa sổ lớn nhất) - nó cũng sẽ xuất hiện trên bảng Hierarchy ở bên trái.
Vì vậy, bây giờ chúng tôi sẽ tạo một vài nền tảng - đây có thể là những hình vuông đơn giản, vì chúng tôi có thể dễ dàng thay đổi kích thước chúng để tạo thành các bức tường và các nền tảng khác.
Vì vậy, chỉ cần tạo một hình vuông mới “sprite” và kéo và thả nó vào cửa sổ Scene giống như bạn đã làm với nhân vật sprite của mình.
Bây giờ chúng ta cần hướng dẫn Unity cung cấp vật lý cho nhân vật chính của chúng ta - nhấp vào nhân vật chính của bạn (nó sẽ được đánh dấu bằng màu xanh lam trong cửa sổ Cảnh), sau đó trên bảng Thanh tra, hãy tìm “GameObjects”.
Nhấp vào “Thêm thành phần> Vật lý 2D> RigidBody2D”. Điều này sẽ tự động thêm vật lý vào sprite của bạn, mà nếu không, bạn sẽ phải tự viết script trong SDK khác.
Chúng tôi muốn ngăn nhân vật chính quay vòng ngoài tầm kiểm soát - vì vậy hãy tìm tab Ràng buộc trong bảng Thanh tra (với hình chính vẫn được đánh dấu trong cửa sổ Cảnh) và chọn hộp “Freeze Rotation Z”.
Nếu bạn nhấn nút "Phát", nhân vật chính của bạn sẽ rơi từ trên trời xuống và rơi không ngừng - chúng tôi sẽ giải quyết vấn đề đó sau, nhưng chỉ cần lưu ý cách chúng tôi có thể dễ dàng áp dụng vật lý. Vật lý mà chúng tôi áp dụng phụ thuộc vào hình dạng mà chúng đang được áp dụng - vì vậy, nếu bạn áp dụng cùng một vật lý cho một hình cầu, chẳng hạn, nó sẽ xoay xung quanh.
Chúng tôi cũng muốn sửa hướng của mình để ngăn nhân vật quay và quay tự do xung quanh. Tìm "ràng buộc" trong trình kiểm tra với người chơi được chọn và đánh dấu vào hộp để đóng băng vòng quay Z. Bây giờ hãy nhấp vào phát lại và bạn sẽ thấy người chơi của mình hiện đang rơi từ trên trời xuống với sự diệt vong vô hạn của anh ta.
Để ngăn nhân vật chính của chúng ta rơi không ngừng, chúng ta sẽ cần thêm một máy va chạm. Về cơ bản, đây chỉ là đường viền chắc chắn của một hình dạng mà chúng tôi sẽ thêm vào nhân vật chính. Đánh dấu nhân vật chính của bạn, nhấp vào “Thêm thành phần> Vật lý 2D> BoxCollider2D.
Bây giờ, hãy làm điều tương tự với nền tảng bạn đã tạo trước đó. Nhân vật chính của bạn bây giờ sẽ "va chạm" với nền tảng và ở lại đó.
Vì vậy, bây giờ chúng tôi muốn đảm bảo rằng máy ảnh sẽ đi theo nhân vật chính của bạn - bên trong cảnh, nên có một đối tượng máy ảnh. Bạn muốn kéo cái này lên trên nhân vật chính.
Điều này đặc biệt quan trọng nếu bạn đang tạo trình chạy dựa trên 3D , một cái gì đó như Slope, nơi bạn cần máy ảnh liên tục ở phía sau đối tượng trò chơi chính (nhân vật chính của bạn).
Bây giờ, hãy chuyển đến bảng Phân cấp và trong danh sách GameObject, bạn muốn kéo máy ảnh bên dưới nhân vật chính (Player GameObject). Điều này sẽ làm cho ký tự sprite chính trở thành ‘ cha mẹ’ của máy ảnh. Vì vậy, bất cứ khi nào Người chơi GameObject di chuyển xung quanh màn hình, máy ảnh sẽ quay theo.
Vì vậy, đối với hướng dẫn trò chơi này, chúng tôi sẽ chỉ tạo một trò chơi cơ bản kiểu người chạy vô tận, giống như Chạy 3, trong đó nhân vật chính của bạn sẽ chạy trên màn hình và né tránh chướng ngại vật (hoặc "trò chơi kết thúc" nếu bạn gặp chướng ngại vật ". Quá trình này sẽ cần một vài tập lệnh, hầu hết trong số đó sẽ được cung cấp trong hướng dẫn này.
Nhấp chuột phải vào thư mục “Nội dung” và tạo một thư mục mới - đặt tên là Tập lệnh . Bây giờ hãy nhấp chuột phải vào thư mục mới này và nhấn “Create> C # Script” và đặt tên cho nó là PlayerControls . Tập lệnh này sẽ xác định hành vi của nhân vật chính của chúng ta.
Khi bạn nhấp đúp vào tập lệnh mới này, nó nên mở trong Visual Studio - ngoài ra (và tùy chọn cá nhân của tôi), bạn có thể chỉnh sửa nó trong một cái gì đó như NotePad ++.
Tệp script nên đã có một chút mã “boiler plate” bên trong nó - về cơ bản đây là script cần được để riêng hoặc chỉ được điều chỉnh theo nhu cầu của bạn và sẽ giúp chúng tôi tiết kiệm rất nhiều thời gian. Vì vậy, chúng tôi sẽ thêm một đối tượng mới.
Phía trên dòng void Start ():
công khai Rigidbody2D rb;
Đoạn mã tiếp theo mà chúng tôi cần thêm sẽ đi trong Start () và được sử dụng để tìm phần cứng - về cơ bản, chúng tôi đang hướng dẫn Unity xác định vị trí vật lý mà chúng tôi đã gắn vào GameObjects (nhân vật chính của chúng tôi) và Bắt đầu () sẽ được thực thi khi một đối tượng hoặc tập lệnh mới được tạo.
Vì vậy, tiếp theo, xác định vị trí đối tượng vật lý.
rb = GetComponent<Rigidbody2D>();
Và bạn sẽ thêm dòng này vào bên trong Cập nhật ()
rb.velocity = new Vector2(3, rb.velocity.y);
Những gì Update () làm là làm mới liên tục, vì vậy bất kỳ mã nào được thêm vào đó sẽ chạy liên tục (trừ khi đối tượng bị phá hủy). Vì vậy, những gì chúng tôi đã làm là hướng dẫn tập lệnh rằng chúng tôi muốn thân cứng có một vectơ mới sử dụng cùng tốc độ trên trục Y (rb.velocity.y), nhưng với tốc độ 3 trên trục hoành. Trong tương lai, bạn cũng có thể sử dụng ‘ FixedUpdate ()’ tương tự nhưng khác nhau, vì ở đó bạn có thể kiểm soát lượng cập nhật / làm mới của tập lệnh.
Lưu tập lệnh và quay lại Unity, sau đó nhấp vào nhân vật viết chính của bạn để đánh dấu nó. Trong bảng Thanh tra, đi tới Thêm thành phần> Tập lệnh và thêm tập lệnh mà chúng tôi vừa lưu. Bây giờ khi bạn nhấp vào nút Phát, nhân vật chính sẽ liên tục di chuyển về phía cạnh nền tảng.
Tạo điều khiển đầu vào của trình phát
Vì vậy, vì đây là một trò chơi theo phong cách người chạy vô tận với các chướng ngại vật, chúng tôi cần thêm các điều khiển cho người chơi, chẳng hạn như nút 'nhảy'.
Mở lại tập lệnh từ trước đó và chúng tôi sẽ thêm mã bổ sung này:
if (Input.GetMouseButtonDown(0)) { rb.velocity = new Vector2(rb.velocity.x, 5); }
Bạn sẽ đặt nó vào bên trong phương thức Update () và những gì nó làm về cơ bản là nói với Unity rằng khi người chơi nhấp vào nút chuột của họ (sẽ được dịch là một lần chạm vào màn hình trên Android), nhân vật chính sẽ “nhảy " trong không khí. Điều này là do chúng tôi đã thêm vận tốc trên trục Y với giá trị là 5 (tất nhiên, giá trị cao hơn sẽ có nghĩa là bước nhảy cao hơn).
Nếu bạn không quá quen thuộc với việc viết mã, chúng tôi đã sử dụng Nếu câu lệnh bởi vì Nếu về cơ bản là một loại hướng dẫn "làm hoặc không" - nghĩa đen của nó là NẾU điều này xảy ra, hãy thực hiện lệnh này . Vì vậy, nếu người chơi không nhấp chuột (hoặc nhấn vào màn hình Android của họ) thì rõ ràng là tập lệnh sẽ không chạy.
Hãy tiếp tục và nhấp vào nút “Phát” và đảm bảo nút hoạt động chính xác trước khi tiếp tục.
Tiếp theo, chúng tôi sẽ thêm các chướng ngại vật của mình (có thể “tiêu diệt” nhân vật chính), điểm số trò chơi và menu “trò chơi kết thúc”.
Nếu bạn đã thử nghiệm trò chơi cho đến nay, vấn đề duy nhất mà chúng tôi gặp phải cho đến nay là việc nhấn nút "nhảy" mà chúng tôi đã tạo sẽ nhảy nhân vật bất kể chúng có tiếp đất hay không - về cơ bản đây là Flappy Birds, và không phải là một người chạy như chúng tôi muốn. Nhưng chúng tôi sẽ khắc phục điều đó.
Trong tập lệnh, hãy thêm đoạn mã này ở trên phương thức Update ():
public Transform groundCheck; public Transform startPosition; public float groundCheckRadius; public LayerMask whatIsGround; private bool onGround; And then add this next line to the Update method above the if statement: onGround = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, whatIsGround); And next you will change this following line to include “&& onGround” if (Input.GetMouseButtonDown(0) && onGround) { So our entire script should basically look like this: public class PlayerControls : MonoBehaviour { public Rigidbody2D rb; public Transform groundCheck; public Transform startPosition; public float groundCheckRadius; public LayerMask whatIsGround; private bool onGround; void Start() { rb = GetComponent<Rigidbody2D>(); } void Update() { rb.velocity = new Vector2(3, rb.velocity.y); onGround = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, whatIsGround); if (Input.GetMouseButtonDown(0) && onGround) { rb.velocity = new Vector2(rb.velocity.x, 5); } } }
Để giải thích những gì chúng tôi đã làm, chúng tôi đã tạo một "chuyển đổi" mới, có nghĩa là một vị trí trong không gian của thế giới trò chơi. Chúng tôi đã thiết lập bán kính của nó và chúng tôi đang hướng dẫn Unity kiểm tra xem bán kính có trùng với lớp "mặt đất" của chúng tôi hay không - và vì vậy nếu bán kính của chúng tôi được đồng bộ hóa với "mặt đất", nhân vật của chúng tôi sẽ có thể nhảy và nếu chúng tôi 'đã ở trong không trung từ một cú nhảy, chúng ta sẽ không thể nhảy thêm một lần nữa. Về cơ bản, onGround sẽ đúng nếu biến đổi có tên groundCheck đang chồng lên nhau với lớp mặt đất. Hy vọng rằng điều đó có ý nghĩa.
Vì vậy, hãy lưu tập lệnh và quay lại Unity, và bạn sẽ nhận thấy rằng nhiều tùy chọn hơn đã được thêm vào Trình kiểm tra sau khi đánh dấu trình phát. Đây là các biến công khai và chúng tôi có thể điều chỉnh chúng theo ý thích của mình.
Bây giờ hãy nhấp chuột phải vào Cấu trúc phân cấp và tạo một đối tượng trống mới, và kéo nó sao cho bên dưới nhân vật chính trong cửa sổ Cảnh chính - định vị đối tượng trống này ở nơi chúng ta muốn tầng được phát hiện. Đổi tên đối tượng thành “Kiểm tra đất”, sau đó kéo nó bên dưới đối tượng trò chơi của người chơi như chúng ta đã làm trước đó với máy ảnh (để tạo mối quan hệ cha - con giữa các đối tượng). Bây giờ đối tượng trống sẽ theo dõi nhân vật chính, giống như máy ảnh và nó sẽ liên tục kiểm tra khoảng cách sàn .cam
Bây giờ chọn nhân vật chính và chuyển đến bảng Thanh tra - kéo đối tượng Kiểm tra Mặt đất vào không gian có tên là “groundCheck”. Vị trí "biến đổi" phải bằng với vị trí của đối tượng mới này và khi nó cho biết "Bán kính", hãy đặt nó là 0,1.
Chúng ta cần xác định lớp nền. Chỉ cần chọn địa hình mặt đất và trong Trình kiểm tra, tìm nút cho “Lớp:Mặc định” (đó là hộp thả xuống) và chọn “Thêm lớp”.
Bây giờ chọn “mặt đất” làm lớp cho nền tảng của chúng tôi và lặp lại điều này cho bất kỳ nền tảng nào khác trong cửa sổ trò chơi. Khi nó cho biết “Ground là gì” trên đối tượng sprite nhân vật chính của chúng ta, hãy chọn lớp mặt đất.
Những gì chúng tôi đã làm là hướng dẫn tập lệnh trình phát thực hiện kiểm tra - nếu điểm nhỏ trên màn hình chồng lên bất kỳ thứ gì khớp với lớp, nhân vật sẽ chỉ nhảy nếu điều này là đúng.
Trò chơi kết thúc trên menu va chạm và trò chơi
Vì vậy, để kết thúc tất cả, điều cuối cùng chúng tôi muốn làm là A:Va chạm với chướng ngại vật dẫn đến kết thúc trò chơi và B:Tạo màn hình menu “trò chơi kết thúc” với nút chơi lại.
Về cơ bản những gì bạn muốn làm là:
- Thêm Trình phát đối tượng và chỉ định một phần cứng và máy va chạm tùy theo lựa chọn của bạn.
- Thêm Kẻ thù đối tượng và chỉ định một phần cứng và máy va chạm sự lựa chọn của bạn với nó. (và tùy chọn, thêm thẻ “Kẻ thù” với nó)
- Tạo C # script mới và thêm nó làm thành phần vào Trình phát (hoặc sử dụng bất kỳ tập lệnh nào được đính kèm với trình phát, không cần tạo tập lệnh mới nếu bạn đã có)
- Thêm điều này vào tập lệnh của bạn:
void OnCollisionEnter(Collision coll){ Debug.Log("Collision"); //Check to see if it even registers a collision, if it works you can remove this line if(coll.gameobject.tag == "Enemy"){ //sees if the object your player collided with has a tag called "Enemy", this can be replaced with if(coll.gameobject.name == ... but using a tag is an easy way to do it. //Add your code here, like: Application.LoadLevel("GameOver"); Debug.Log("Working"); //if working, you can remove this line. }
Hãy thử với tập lệnh ví dụ đó - với một số thử nghiệm và sai sót, bạn sẽ giúp nó thực hiện chính xác những gì chúng ta cần.
Bây giờ để biết chính xác cách tạo “cấp độ” GameOver bằng nút Phát, hãy xem phần cuối cùng trong hướng dẫn của Appual “Cách tạo trò chơi nền tảng thống nhất cơ bản Pt. 2 ”.