2D Space Shooter (for beginners)

0
218

Giới thiệu:
Tại đây, bạn có thể xem cách thực hiện trò chơi bắn súng không gian 2D đơn giản với công cụ Unity 3D. Tôi sẽ sử dụng vật lý 2D tích hợp sẵn. Bạn sẽ cần một số hình ảnh cho hướng dẫn này. Bạn có thể tải xuống tại đây. * Và bạn nên tải xuống các tệp âm thanh đóng gói tại đây.
*Nếu trình duyệt của bạn chỉ mở hình ảnh, thì bạn nên tải xuống thủ công. Nhấp chuột phải vào hình ảnh và lưu nó. Hoặc nhấp chuột phải vào liên kết tải xuống và chọn mục tiêu lưu.
1 bước
Tạo dự án Unity 2D mới. Nhập hình ảnh không gian đã tải xuống (bạn chỉ cần kéo và thả nó vào cửa sổ Nội dung hoặc nhấp chuột phải vào cửa sổ Nội dung – chọn Nhập nội dung mới – chọn hình ảnh không gian đã tải xuống và nhấp vào Nhập). Chọn spaceImage trong cửa sổ Nội dung và đặt Chế độ Sprite thành Nhiều trong Trình kiểm tra của nó. Nhấp vào Áp dụng.import assets

Bây giờ bấm vào Sprite Editor. Nhấp vào Lát. Kiểm tra xem Loại được đặt thành Tự động và nhấp vào Nút Slice. Nhấp vào Áp dụng và đóng trình chỉnh sửa sprite.

2. Bước
Lúc đầu, chúng tôi có thể khiến người chơi giao hàng. Trong Trò chơi đuổi bắt 2D, chúng tôi đã sử dụng bàn phím để di chuyển trình phát của mình. Bây giờ chúng ta sẽ sử dụng chuột để di chuyển. Tàu của chúng tôi sẽ bay đến điểm, nơi chúng tôi đã nhấp. Đưa hình ảnh con tàu vào khung cảnh. Unity sẽ tạo GameObject mới. Đổi tên thành Player. Và đặt Thẻ của nó thành Người chơi.
tạo tàu người chơi

Chúng tôi sẽ sử dụng vật lý 2D tích hợp sẵn. Thêm vào Trình phát: Box Collider 2D và Rigidbody 2D (Thêm Thành phần – Vật lý 2D – …). Đặt Thang trọng lực thành 0 (chúng ta không cần trọng lực) và Nội suy thành Nội suy (để di chuyển mượt mà hơn). Kích hoạt Freeze Rotation Z trong Constraints (để ngăn tàu quay).
thêm các thành phần cho người chơi

3. Bước
Bây giờ chúng ta có thể tạo một tập lệnh chuyển động cho trình phát của mình. Tạo tập lệnh C# mới (nhấp chuột phải vào cửa sổ Tài sản và chọn tạo – tập lệnh C#). Đặt tên cho nó là PlayerMove. Bây giờ giải thích một chút, chúng ta sẽ làm gì:
Phép trừ vectơ:
Với phép trừ véc tơ, chúng ta có thể nhận được hướng và khoảng cách từ đối tượng trò chơi này sang đối tượng trò chơi khác. Kiểm tra Hướng dẫn thống nhất để biết thông tin. Vectơ bị trừ này có thể được sử dụng làm hướng từ tàu của người chơi đến vị trí được nhấp. Chúng ta có thể thay đổi vận tốc của tàu theo vectơ này và tàu sẽ di chuyển đến vị trí được nhấp.* Độ dài của vectơ này là khoảng cách giữa tàu và vị trí được nhấp. Bạn có thể lấy nó với Vector3.magnitude. Phép tính căn bậc hai tốn cpu. Vì vậy, hãy cẩn thận với nó. Bạn có thể sử dụng Vector3.sqrMagnitude để thay thế. Kiểm tra Hướng dẫn thống nhất để biết thông tin.
* Đôi khi lấy véc tơ bị trừ trực tiếp không phải là lựa chọn tốt nhất. Con tàu sẽ bay nhanh nếu bạn nhấp xa và chậm nếu bạn nhấp gần. Vì vậy, bạn sẽ chỉ cần hướng từ vectơ bị trừ và chiều dài của nó phải là 1. Đây là một vectơ chuẩn hóa. Bạn có thể lấy nó từ vector đã trừ bằng Vector3.Normalize. Sau đó, bạn có thể nhân nó với tốc độ cần thiết của mình. Chúng tôi không cần vectơ chuẩn hóa cho hướng dẫn của mình.
véc tơ giải thích
Chúng ta có thể lấy vị trí từ con tàu của mình bằng transform.position. Sau đó, chúng ta cần vị trí thế giới từ vị trí được nhấp. Vị trí chuột là vị trí màn hình. Chúng ta nên chuyển đổi nó sang vị trí thế giới. Bạn có thể lấy điểm thế giới này bằng: Camera.ScreenToWorldPoint.
Camera.ScreenToWorldPoint
Chức năng này có thể chuyển đổi vị trí màn hình sang vị trí thế giới. Vị trí màn hình được xác định bằng pixel. Xin lưu ý rằng Vị trí Z sẽ giống với Vị trí Z của Máy ảnh. Kiểm tra Hướng dẫn thống nhất để biết thông tin.
Trong cảnh của chúng ta, chúng ta nên có Camera chính. Vì vậy, dòng C# sẽ là: clickPos = Camera.main.ScreenToWorldPoint (Input.mousePosition);. Ít nhất chúng ta có thể tính toán vectơ chỉ hướng với clickPos – transform.position. Và sử dụng vectơ này làm vectơ vận tốc cho con tàu của chúng ta. Tạo tập lệnh C# mới và đặt tên là PlayerMove Tập lệnh C# chuyển động bây giờ sẽ là:
sử dụng UnityEngine;
sử dụng System.Collections;

lớp công khai PlayerMove : MonoBehaviour {

// biến cho vị trí được nhấp
Vector3 clickPos;
// chúng tôi sẽ sử dụng vectơ này làm vận tốc cho Rigidbody2D (hướng và tốc độ)
Vector3 di chuyển;
// biến cho tốc độ người chơi
tốc độ phao công = 1;
// chúng tôi sẽ cần tham chiếu đến Người chơi Rigidbody2D
Thân cứng2D rb;

// sẽ được thực thi một lần khi bắt đầu tập lệnh
khoảng trống Bắt đầu () {
// tham chiếu đến Người chơi Rigidbody2D
rb = GetComponent < Rigidbody2D > ();
//người chơi nên giữ nguyên vị trí của nó khi bắt đầu trò chơi (hoặc nó sẽ chuyển sang clickPos (0,0,0) làm Vector3 mặc định)
clickPos = biến đổi. vị trí;
}

// sẽ được thực thi mọi khung hình
void Cập nhật () {
// kiểm tra chuột trái có được nhấn không
nếu (Input.GetMouseButton (0)) {
// chuyển đổi vị trí màn hình chuột sang vị trí thế giới
clickPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
}
// tính vectơ hướng từ tàu đến điểm được nhấp
di chuyển = clickPos – biến đổi.vị trí;
}

// sẽ được thực thi tại các bước thời gian cố định (mặc định 0,02). Sử dụng cái này cho vật lý Unity
void FixedUpdate() {
// thay đổi vận tốc thành vector chuyển động được tính toán
// z sẽ giữ nguyên số không. Tàu của chúng ta không nên di chuyển trên Z-Axe
rb.velocity = new Vector2 (move.x, move.y) * tốc độ;
}
}
Thêm tập lệnh này vào Player. Đặt tốc độ thành 1. Bắt đầu cảnh và kiểm tra xem tất cả có hoạt động không.
thêm tập lệnh
4. Bước
Tàu của chúng tôi sẽ bắn laze. Đặt hình ảnh laser vào cảnh. Unity sẽ tạo đối tượng trò chơi mới. Đổi tên nó thành Laser. Đặt Thứ tự trong Lớp thành -10. Tia laser sẽ được hiển thị dưới con tàu (chúng ta có thể đặt nó thành -1, có thể sau này chúng ta sẽ cần giá trị này cho các GameObject khác). Làm cho nó nhỏ hơn một chút (tỷ lệ 0,5 sẽ ổn). Thêm Box Collider 2D vào nó. Kích hoạt hộp kiểm Is Trigger (chúng tôi sẽ cần nó chỉ để kiểm tra va chạm). Thêm Rigidbody2D. Đặt Gravity thành 0 và Nội suy thành Nội suy.
tạo tia laze

5. Bước
Tia laser sẽ bay lên trên Y-axe. Chúng tôi cần một kịch bản kiểm soát cho họ. Tạo tập lệnh C# mới. Đặt tên cho nó là LaserShot. Lần này chúng ta sẽ di chuyển tia laser bằng AddForce. Chúng ta sẽ lấy tham chiếu đến Rigidbody2D và sau đó sử dụng lực đẩy theo hướng Y trên đó. Chúng ta nên phá hủy tia laser của mình nếu nó nằm ngoài màn hình. Chúng tôi không cần chúng bay mọi lúc (vì Unity sẽ tính toán các phát bắn vô hình và sẽ chậm hơn). Chúng ta có thể sử dụng thông báo OnBecameInvisible để gọi hàm hủy của mình. Kịch bản nên là:
sử dụng UnityEngine;
sử dụng System.Collections;

lớp công khai LaserShot : MonoBehaviour {

//biến tham chiếu cho Rigidbody2D
Thân cứng2D rb;
// biến cho công suất lực
lực lượng phao công cộng;

// sẽ được thực hiện một lần
khoảng trống Bắt đầu () {
// tham chiếu đến Rigidbody2D
rb = GetComponent < Rigidbody2D > ();
// khai báo Vector3 với giá trị lực trên trục Y
Vector3 directon = new Vector3(0, force, 0);
// thêm lực đẩy vào Hardbody2D để di chuyển trên Y-axe
rb.AddForce (directon, ForceMode2D.Impulse);
}
// sẽ được thực thi, nếu gameobject không hiển thị nữa trên màn hình
void OnBecameInvisible () {
// xóa gameobject này khỏi hiện trường
Tiêu diệt (gameObject);
}
}

Thêm tập lệnh này vào đối tượng trò chơi Laser. Và đặt lực lượng thành một cái gì đó như 5 (đó là sức mạnh lực lượng).
Chúng tôi sẽ sinh ra nhiều tia laser. Vì vậy, chúng tôi cần một nhà lắp ghép (như bản thiết kế) của chúng. Chỉ cần kéo và thả đối tượng trò chơi Laser vào cửa sổ Asstes. Unity sẽ tự động tạo prefab. Bạn có thể xóa Laser khỏi cửa sổ Hierarchy, nếu bạn đã tạo laser prefab.
tạo laser tiền chế
6. Bước
Bắn laze bây giờ có thể bay. Nếu chúng ta bắn, chúng ta chỉ nên sinh ra Laser trên vị trí của tàu. Chúng ta có thể sử dụng chức năng Khởi tạo để sinh sản. Là nút lửa, chúng tôi sẽ sử dụng nút chuột phải. Kịch bản của chúng tôi sẽ kiểm tra xem nút bắn có được nhấn hay không và đặt tia laser trong trường hợp này. Việc kiểm tra này sẽ được thực hiện trên mọi khung hình và để tránh chụp nhiều ảnh, chúng ta nên tạo độ trễ khi chụp. Chúng ta có thể sử dụng coroutine, có thể tạm dừng. Kiểm tra hướng dẫn thống nhất. Tạo tập lệnh C# mới và đặt tên là PlayerShoot. Kịch bản sẽ là:
sử dụng UnityEngine;
sử dụng System.Collections;

lớp công khai PlayerShoot : MonoBehaviour {

// biến cho nhà lắp ghép bằng laser
laser GameObject công cộng;
// độ trễ giữa các lần bắn laser
thời gian trễ thả nổi công khai;
//boolean, nếu laser có thể được sinh ra
bool canShoot = true;

// sẽ được thực thi mọi khung hình
void Cập nhật () {
// kiểm tra xem tia laser có thể được sinh ra không và nhấn nút chuột phải
nếu (canShoot && Input.GetMouseButton(1)) {
// vô hiệu hóa kiểm tra chụp cho khung hình tiếp theo
canShoot = sai;
//đặt laze prefab trong cảnh ở vị trí tàu (xoay như tàu)
Khởi tạo (laser, biến đổi.vị trí, biến đổi.xoay);
// bắt đầu chức năng (sẽ cho phép chụp) dưới dạng coroutine
StartCoroutine (NoFire());
}
}

// chức năng coroutine, chúng ta có thể tạm dừng nó
IEnumerator NoFire () {
// tạm dừng hàm và quay lại sau trong “delayTime” giây
năng suất trả về WaitForSeconds mới (thời gian trễ);
// cho phép chụp để kiểm tra tiếp theo
canShoot = true;
}
}

Thêm tập lệnh này vào tàu của người chơi. Đặt nhà lắp ghép Laser trong trường Laser. Đặt Thời gian trễ thành 0,5. Bắt đầu cảnh và kiểm tra nó.
thêm tiền chế laser vào trình phát
7. Bước
Bây giờ chúng ta có thể tạo ra các tiểu hành tinh. Kéo và thả hình ảnh tiểu hành tinh vào cảnh. Đổi tên gameobject đã tạo thành Asteroid. Đặt Thứ tự trong Lớp trong Trình kết xuất Sprite của nó thành -5 (dưới tàu và trên laser). Thêm vào đó Máy va chạm vòng tròn 2D. Thêm Rigidbody2D. Đặt Thang trọng lực thành 0 và Nội suy thành Nội suy. Thêm thẻ mới Kẻ thù và đặt thẻ Tiểu hành tinh thành Kẻ thù.
tạo tiểu hành tinh
8. Bước
Tiểu hành tinh cần một kịch bản chuyển động. Tạo tập lệnh C# mới và đặt tên là AsteroidMove. Chúng tôi sẽ thay đổi vận tốc của tiểu hành tinh trên Y-axe. Và chúng ta nên tiêu diệt các tiểu hành tinh nếu chúng nằm ngoài màn hình. Sau đó, chúng tôi sẽ kiểm tra xem có tiểu hành tinh nào va vào người chơi không. Chúng tôi có thể sử dụng OnCollisionEnter2D. Thông báo này sẽ được gọi nếu các đối tượng trò chơi với Collider2D bị va chạm. Sau đó, chúng tôi có thể kiểm tra Thẻ của đối tượng trò chơi bị va chạm và hủy chúng nếu đó là Người chơi. Nếu người chơi bị phá hủy, chúng ta nên tải lại cảnh. Chúng ta nên sử dụng SceneManager để tải lại cảnh.
Tạo tập lệnh C# mới và đặt tên là AsteroidMove.
sử dụng UnityEngine;
sử dụng System.Collections;
// không gian tên với các điều khiển cảnh khác nhau
sử dụng UnityEngine.SceneManagement;

lớp công khai AsteroidMove : MonoBehaviour {

//biến cho tốc độ bay
tốc độ phao công cộng;
// tham chiếu cho Rigidbody2D
Thân cứng2D rb;

// sẽ được thực thi một lần khi bắt đầu tập lệnh
khoảng trống Bắt đầu () {
// tham chiếu đến Rigidbody2D
rb = GetComponent < Rigidbody2D > ();
//khai báo véc tơ chỉ phương di chuyển (cái này sẽ nằm dọc theo trục Y)
Vector3 di chuyển = new Vector3(0, -1, 0);
// thay đổi vận tốc (tốc độ và hướng di chuyển)
rb.velocity = di chuyển * tốc độ;
}

// sẽ được thực thi nếu gameobject không được hiển thị nữa trên màn hình
void OnBecameInvisible () {
//xóa gameobject khỏi cảnh
Tiêu diệt (gameObject);
}

// sẽ được thực thi nếu các Collider2D khác nhau chạm vào nhau
void OnCollisionEnter2D (Collision2D gì đó) {
// kiểm tra Thẻ của đối tượng trò chơi đã chạm
if (something.gameObject.tag == “Người chơi”) {
//xóa gameobject khỏi cảnh
Tiêu diệt (gameObject);

// tải lại cùng một cảnh (tải lại)
SceneManager.LoadScene (SceneManager.GetActiveScene().name);
}
}
}

Thêm tập lệnh này vào Tiểu hành tinh. Đặt Tốc độ thành 1. Tạo tiểu hành tinh lắp sẵn (kéo và thả Tiểu hành tinh từ cửa sổ Phân cấp đến Tài sản). Xóa Tiểu hành tinh khỏi Hệ thống phân cấp.
tạo tiền chế tiểu hành tinh
9. Bước
Chúng tôi cần spawner, thứ có thể sinh ra các tiểu hành tinh một cách ngẫu nhiên. Bấm vào GameObject – Tạo trống. GameObject trống sẽ được tạo trong cảnh. Đổi tên nó thành AsteroidSpawner. Chọn một Biểu tượng để xem tốt hơn (kiểm tra ảnh chụp màn hình). Di chuyển nó sang bên trái trên Camera View (bạn có thể sử dụng công cụ di chuyển). Và đặt Z-Position thành 0 (nếu khác 0).
tạo vị trí bên trái cho spawner
Chọn AsteroidSpawner trong cửa sổ Hierarchy. Nhấp chuột phải vào nó và nhân đôi nó. Đổi tên đối tượng trò chơi mới đã tạo thành RightPosition. Biến RightPosition thành con của AsteroidSpawner (chỉ cần kéo và thả RightPosition trên AsteroidSpawner trong Hệ thống phân cấp). Di chuyển RightPosition sang bên phải và đặt Z-Position thành 0 (nếu khác).
tạo đúng vị trí cho spawner
Bây giờ hãy tạo tập lệnh C# mới và đặt tên là ObjectSpawner. Chúng tôi sẽ liên tục gọi một chức năng sinh sản. InvokeRepeating sẽ thực hiện công việc này. Kịch bản sẽ là:
sử dụng UnityEngine;
sử dụng System.Collections;

lớp công khai ObjectSpawner : MonoBehaviour {

//biến cho vị trí, sẽ được sử dụng để tính toán vị trí ngẫu nhiên giữa hai điểm
chuyển đổi công khai RightPosition;
// độ trễ giữa các lần sinh sản
công cộng float spawnDelay;
// biến cho prefab, sẽ được sinh ra
Mục GameObject công khai;

// sẽ được thực hiện một lần khi bắt đầu
khoảng trống Bắt đầu () {
// Hàm “Spawn” sẽ được gọi lặp lại
InvokeRepeating(“Spawn”, spawnDelay, spawnDelay);
}

//chức năng sinh sản
khoảng trống đẻ trứng () {
// tính toán vị trí ngẫu nhiên giữa AsteroidSpawner và RighPosition
Vector3 spawnPos = new Vector3 (Random.Range (transform.poseition.x, RightPosition.position.x), biến đổi.poseition.y, 0);
//đặt prefab tại vị trí tính toán
Khởi tạo (Item, spawnPos, transform.rotation);
}
}

Chọn AsteroidSpawner trong Hệ thống phân cấp. Thêm tập lệnh này vào nó. Nhấp vào điểm chọn gần trường Vị trí bên phải và chọn Vị trí bên phải. Đặt Độ trễ đẻ trứng thành 5. Nhấp vào điểm chọn gần trường Vật phẩm và chọn nhà lắp ghép Tiểu hành tinh. Bắt đầu cảnh và kiểm tra nó.
10. Bước
Các tia laser có thể bay qua tất cả các tiểu hành tinh. Chúng tôi cần tập lệnh để kiểm tra va chạm và gây ra thiệt hại. Các đối tượng phải có điểm sức khỏe và chúng ta cần tập lệnh kiểm soát điểm sức khỏe. Là điểm sức khỏe, chúng ta có thể định nghĩa biến int hp. Đối với sát thương, chúng ta có thể viết phương thức, trừ biến sát thương khỏi điểm sức khỏe. Tạo tập lệnh C# mới và đặt tên là HpController.
sử dụng UnityEngine;
sử dụng System.Collections;

lớp công khai HpController : MonoBehaviour {

// biến cho điểm sức khỏe
công khai int hp;

//funkton để tính toán thiệt hại (chúng tôi sẽ nhận được thiệt hại từ các chức năng khác)
void MakeDamage (thiệt hại int) {
//giảm biến hp
hp = hp – thiệt hại;
//kiểm tra xem hp âm hay không
nếu (hp <= 0) {
//xóa gameobject
Tiêu diệt (gameObject);
}
}
}

Chọn Asteroid prefab trong cửa sổ Assets và thêm tập lệnh HpController vào đó. Đặt biến HP thành 3.
thêm prefab tiểu hành tinh vào spawner
Bây giờ hãy mở tập lệnh LaserShot. Chúng tôi sẽ thêm kiểm tra va chạm vào nó. Laser có Collider2D làm Trình kích hoạt. Chúng tôi có thể sử dụng vật lý Unitys để kiểm tra va chạm: OnTriggerEnter2D. Nếu đối tượng trò chơi được chọn có thẻ Kẻ thù, chúng tôi sẽ sử dụng SendMessage. Phương thức này kiểm tra xem có bất kỳ thành phần nào trên đối tượng trò chơi khác có phương thức với tên được xác định hay không và gọi nó. Kiểm tra hướng dẫn thống nhất.

sử dụng UnityEngine;
sử dụng System.Collections;

lớp công khai LaserShot : MonoBehaviour {

//biến tham chiếu cho Rigidbody2D
Thân cứng2D rb;
//biến cho thiệt hại
thiệt hại int công khai;
// biến cho công suất lực
lực lượng phao công cộng;

// sẽ được thực hiện một lần
khoảng trống Bắt đầu () {
// tham chiếu đến Rigidbody2D
rb = GetComponent < Rigidbody2D > ();
// khai báo Vector3 với giá trị lực trên trục Y
Vector3 directon = new Vector3(0, force, 0);
// thêm lực đẩy vào Hardbody2D để di chuyển trên Y-axe
rb.AddForce (directon, ForceMode2D.Impulse);
}
// sẽ được thực thi, nếu gameobject không hiển thị nữa trên màn hình
void OnBecameInvisible () {
// xóa gameobject này khỏi hiện trường
Tiêu diệt (gameObject);
}
// sẽ được thực thi nếu một Collider2D khác đi vào Trigger
void OnTriggerEnter2D (Collider2D khác) {
// kiểm tra xem gameobject khác có tag Enemy không
if (other.gameObject.tag == “Kẻ thù”) {
// thử gọi MakeDamage trên gameobject khác, gửi damage làm tham số cho nó
other.gameObject.SendMessage(“MakeDamage”, dam, SendMessageOptions.DontRequireReceiver);
//xóa gameobject khỏi cảnh
Tiêu diệt (gameObject);
}
}
}

Chọn Laser prefab trong cửa sổ Tài sản. Tập lệnh LaserShot hiện có sát thương thay đổi mới. Thay đổi nó thành 1.
thay đổi giá trị thiệt hại trong tập lệnh laser
Bạn có thể bắt đầu cảnh. Bây giờ các tiểu hành tinh sẽ bị phá hủy với 3 phát bắn.
11. Bước
Chúng ta nên tạo ra tàu địch ngay bây giờ. Tôi hơi lười biếng, vì vậy chúng tôi chỉ có thể sử dụng lại nhà lắp ghép Tiểu hành tinh. Đặt prefab Tiểu hành tinh vào cảnh (kéo và thả nó từ cửa sổ Nội dung vào Chế độ xem cảnh). Chọn nó trong Hierarchy và đổi tên thành Enemy. Thay đổi biến HP thành 1. Thay đổi nhân vật tiểu hành tinh thành nhân vật địch. Xóa Circle Collider 2D (nhấp chuột phải vào Circle Collider 2D và chọn Remove Component). Thêm Box Collider 2D mới. Tạo một prefab từ Kẻ thù (kéo và thả Kẻ thù từ Hệ thống phân cấp vào cửa sổ Tài sản). Xóa Kẻ thù khỏi Hệ thống cấp bậc sau khi nhà lắp ghép sẵn được tạo.
tạo kẻ thù
12. Bước
Tàu địch cần kịch bản bắn. Kẻ thù sẽ tìm thấy tàu của người chơi sau khi nó được sinh ra và sau đó bắn vào chúng. Chúng ta có thể tìm kiếm một gameobject với GameObject.FindWithTag(“Tag”);. Sau đó, kẻ thù sẽ sinh ra một viên đạn, viên đạn này sẽ tính toán vectơ hướng từ viên đạn đến người chơi rồi bay đến người chơi. Lúc đầu, chúng tôi sẽ tạo đối tượng trò chơi đạn. Kéo và thả hình ảnh viên đạn vào cảnh. Chọn đối tượng trò chơi đã tạo trong Hệ thống phân cấp. Đổi tên nó thành Bullet. Thay đổi Thứ tự của nó trong Lớp thành -6. Thêm Rigidbody2D. Đặt Gravity thành 0 và Nội suy thành Nội suy. Thêm Box Collider 2D và bật Is Trigger. Bây giờ chúng ta cần tập lệnh để điều khiển các viên đạn. Tạo tập lệnh C# mới và đặt tên là EnemyBullet.

sử dụng UnityEngine;
sử dụng System.Collections;

lớp công khai EnemyBullet : MonoBehaviour {

// biến tham chiếu cho đối tượng Người chơi game
Trình phát GameObject;
//biến tham chiếu cho Rigidbody2D
Thân cứng2D rb;
// biến cho công suất lực
lực lượng phao công cộng;
//biến cho giá trị thiệt hại
thiệt hại int công khai;

// sẽ được thực hiện một lần khi bắt đầu
khoảng trống Bắt đầu () {
// tham chiếu đến Rigidbody2D
rb = GetComponent < Rigidbody2D > ();
//tìm kiếm đối tượng game bằng thẻ Player và tham khảo chúng
người chơi = GameObject.FindWithTag(“Người chơi”);
//kiểm tra xem Người chơi có ở trong cảnh không
nếu (người chơi != null) {
// tính véc tơ chỉ phương cho Player
Vector3 dir = player.transform.position – transform.position;
// tính góc giữa trục X và vectơ chỉ phương
góc float = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
// xoay viên đạn gameobject
biến đổi.Rotate(0, 0, angle);
// đẩy viên đạn vào rìu X ngôn ngữ của nó (nó sẽ chuyển tiếp cho hình ảnh này)
rb.AddRelativeForce(Vector2.right*force, ForceMode2D.Impulse);
// nếu Người chơi không có trong cảnh
} khác
//xóa dấu đầu dòng khỏi cảnh
Tiêu diệt (gameObject);
}

// sẽ được thực thi nếu Collider2D đi vào Trigger
void OnTriggerEnter2D (Collider2D khác) {
// kiểm tra xem gameobject bị va chạm có thẻ Player không
if (other.gameObject.tag == “Người chơi”) {
// cố gắng thực thi chức năng “MakeDamage” với tham số “thiệt hại” trong tập lệnh được kết nối với đối tượng trò chơi bị va chạm
other.gameObject.SendMessage(“MakeDamage”, dam, SendMessageOptions.DontRequireReceiver);
//xóa dấu đầu dòng
Tiêu diệt (gameObject);
}
}

//sẽ được thực thi nếu dấu đầu dòng không được hiển thị nữa (ngoài màn hình)
void OnBecameInvisible () {
//xóa dấu đầu dòng
Tiêu diệt (gameObject);
}
}

Thêm tập lệnh này vào Bullet. Đặt Force thành 3 và Damage thành 1. Bây giờ hãy tạo prefab từ Bullet (kéo và thả Bullet từ Hierarchy sang Assets). Nếu nhà lắp ghép đã được tạo, hãy xóa Dấu đầu dòng khỏi Hệ thống phân cấp.
tạo đạn kẻ thù
12. Bước
Bây giờ chúng ta có thể tạo kịch bản bắn kẻ thù. Kẻ thù sẽ kiểm tra vị trí của Người chơi và định kỳ sinh ra một Viên đạn (sẽ tính toán hướng cho Người chơi và bay đến chỗ họ). Tạo tập lệnh C# mới và đặt tên là EnemyShoot.

sử dụng UnityEngine;
sử dụng System.Collections;

lớp công khai EnemyShoot : MonoBehaviour {

// biến cho Bullet prefab
viên đạn GameObject công khai;
// độ trễ giữa các lần chụp
phao công cộng fireDelay;
// biến cho Player gameobject
Trình phát GameObject;
//boolean để kiểm tra xem Kẻ thù có thể bắn không
bool canShoot = true;

// sẽ được thực hiện một lần
khoảng trống Bắt đầu () {
//tìm kiếm đối tượng trò chơi với thẻ “Người chơi” và tham chiếu nó tới người chơi
người chơi = GameObject.FindWithTag(“Người chơi”);
}

// sẽ được thực thi mọi khung hình
void Cập nhật () {
// kiểm tra xem Người chơi có ở trong cảnh không và Kẻ thù có thể bắn
if (canShoot && player != null) {
// Kẻ thù không thể bắn trong lần kiểm tra tiếp theo
canShoot = sai;
//đặt Bullet prefab trong cảnh ở vị trí Kẻ thù (xoay mặc định)
Khởi tạo (dấu đầu dòng, biến đổi.vị trí, Quaternion.identity);
//bắt đầu chức năng firePause dưới dạng coroutine, có thể tạm dừng
StartCoroutine(firePause());
}
}

//chức năng quy trình
IEnumerator firePause() {
// tạm dừng chức năng cho fireDelay giây
năng suất trả về WaitForSeconds mới (fireDelay);
// Kẻ thù có thể bắn trong lần kiểm tra tiếp theo
canShoot = true;
}
}

Chọn Enemy prefab trong cửa sổ Nội dung và thêm tập lệnh EnemyShoot này vào đó. Thêm Bullet prefab vào trường Bullet (bạn có thể kéo và thả Bullet từ Nội dung vào trường này hoặc nhấp vào điểm chọn gần trường và chọn Bullet). Đặt Độ trễ lửa thành 2.

14. Bước
Người chơi hiện không có điểm sức khỏe. Chúng ta nên làm bộ điều khiển hp cho họ. Và chúng ta có thể thêm một giao diện người dùng đơn giản để hiển thị nó trên màn hình. Chúng tôi có thể thực hiện thanh sức khỏe với Giao diện Unity. Nhấp vào GameObject -> Giao diện người dùng -> và chọn Hình ảnh. Canvas có Hình ảnh sẽ được tạo. Đổi tên hình ảnh thành HealthBar. Chọn Canvas và đặt Chế độ tỷ lệ giao diện người dùng thành Tỷ lệ với Kích thước màn hình.
thêm hình ảnh giao diện người dùng
Nhấp đúp chuột vào Canvas. Chế độ xem cảnh sẽ thu nhỏ và bạn có thể thấy viền trắng. Nó đang hiển thị Kích thước giao diện người dùng trên màn hình. Bạn nên đặt các phần ui trong đó, nếu chúng sẽ được hiển thị. Chúng tôi đã có hộp màu trắng trong đó (HealthBar (Hình ảnh)). Chọn Công cụ hình chữ nhật (nếu không được chọn) và kéo dài HealthBar dưới dạng thanh hp.
điều chỉnh hình ảnh hp
Chọn HelathBar trong Hệ thống phân cấp. Thay đổi Hình ảnh nguồn thành UISprite (chúng tôi chỉ cần một sprite cho thanh hp của chúng tôi). Bạn có thể thay đổi màu sắc của nó. Đặt Image Typ thành Filled. Phương pháp điền vào ngang. Tô gốc sang trái (bạn có thể thử một cái gì đó khác với FillMethod và Fill gốc, nhưng Image Typ phải được tô). Bạn có thể thay đổi Fill Amount để xem thanh hp sẽ hoạt động như thế nào.
thay đổi hình ảnh hp sprite

15. Bước
Bây giờ chúng ta có thể tạo tập lệnh C# để điều khiển HP của người chơi. Tạo tập lệnh C# mới và đặt tên là PlayerHP.
sử dụng UnityEngine;
sử dụng System.Collections;
// chúng tôi cần không gian tên để truy cập trên Unity UI
sử dụng UnityEngine.UI;
sử dụng UnityEngine.SceneManagement;

lớp công khai PlayerHP : MonoBehaviour {

// tham chiếu đến đối tượng trò chơi HealthBar
GameObject HealthBar công khai;
// biến tham chiếu đến thành phần Hình ảnh trong HealthBar
Hình ảnh img;
//HP hiện tại
công khai int hp;
// giá trị HP tối đa, sẽ được sử dụng cho % đếm
nổi maxHp;

// sẽ được thực hiện một lần
khoảng trống Bắt đầu () {
// tham chiếu đến thành phần Hình ảnh trong PlayerHP
img = HealthBar.GetComponent < Hình ảnh > ();
// đặt HP tối đa thành HP hiện tại
maxHp = hp;
// thay đổi lượng lấp đầy giữa 0 và 1 (ở đây sẽ là 1 hoặc 100%)
img.fillAmount = hp/maxHp;
}

// sẽ được gọi từ tập lệnh trên các đối tượng trò chơi khác (như Bullet)
void MakeDamage (thiệt hại int) {
//giảm giá trị hp
hp = hp – thiệt hại;
//kiểm tra xem hp bằng 0 hay âm
nếu (hp <= 0) {
// tải cảnh hiện tại (tải lại)
SceneManager.LoadScene (SceneManager.GetActiveScene().name);
}
// thay đổi lượng lấp đầy giữa 0 và 1
img.fillAmount = hp/maxHp;
}
}

Nhấp đúp chuột vào Camera chính trong Hệ thống phân cấp để quay lại chế độ xem camera. Chọn máy nghe nhạc. Thêm tập lệnh PlayerHP vào Trình phát. Đặt HealthBar vào trường Health Bar (bạn có thể kéo và thả nó từ Hệ thống phân cấp (mở rộng Canvas nếu không nhìn thấy) hoặc nhấp vào điểm chọn gần trường Health Bar và chọn HealthBar). Đặt biến HP thành 10.
điều chỉnh tập lệnh hp
Ok, cảnh trò chơi nên được thực hiện ngay bây giờ. Chúng ta có thể tinh chỉnh nó một chút.
16. Bước
Chọn Máy ảnh chính. Nhấp vào Nền trong Trình kiểm tra và thay đổi nó thành màu đen.
chọn màu nền
17. Bước
Chúng ta nên thêm các ngôi sao chuyển động. Các hạt thống nhất là tốt cho việc này. Nhấp vào GameObject và chọn Hệ thống hạt. Chọn nó trong Hierarchy và đổi tên thành Stars. Đặt Z-Position thành 10. Và X-Rotation thành 90. Di chuyển nó lên trên Camera View. Bật Làm ấm trước. Điều chỉnh Thời gian bắt đầu (hạt sẽ bay qua chế độ xem camera). Điều chỉnh tốc độ bắt đầu theo ý muốn. Đặt Kích thước bắt đầu thành 0,2 (thành thứ bạn thích). Nhấp vào menu Shape và đặt Shape thành Box. Thay đổi giá trị X thành 15 (hộp hạt phải lớn hơn khi xem camera trên X-Axe). Nhấp vào trình đơn Renderer và đặt Order in Layer thành -100.
thêm sao
18. Bước
Entpack hiện đã tải xuống kho lưu trữ SpaceSound ( SpaceSound ). Nhập 3 tệp âm thanh vào Unity (Bạn có thể kéo và thả chúng vào cửa sổ Nội dung hoặc nhấp chuột phải vào cửa sổ Nội dung -> Nhập nội dung mới … chọn các tệp âm thanh trong trình tự của bạn và nhấp vào Nhập). Bây giờ chúng ta có thể tạo nhạc nền. Chọn Máy ảnh chính. Thêm Space Music vào nó. Unity sẽ tạo thành phần mới Audio Sorce (hoặc Thêm thành phần này theo cách thủ công và đặt Audio Clip thành SpaceMusic). Kích hoạt Vòng lặp.
thêm nhạc
18. Bước
Chúng ta nên tạo ra âm thanh bắn súng. Chúng tôi có thể phát đoạn âm thanh nếu Bullet xuất hiện. Mở tập lệnh EnemyBullet. AudioClip nên được khai báo. Và chúng ta có thể phát âm thanh này bằng AudioSource.PlayClipAtPoint.

sử dụng UnityEngine;
sử dụng System.Collections;

lớp công khai EnemyBullet : MonoBehaviour {

// biến tham chiếu cho đối tượng Người chơi game
Trình phát GameObject;
//biến tham chiếu cho Rigidbody2D
Thân cứng2D rb;
// biến cho công suất lực
lực lượng phao công cộng;
//biến cho giá trị thiệt hại
thiệt hại int công khai;
//biến cho clip âm thanh
công AudioClip BulletSound;

// sẽ được thực hiện một lần khi bắt đầu
khoảng trống Bắt đầu () {
// tham chiếu đến Rigidbody2D
rb = GetComponent < Rigidbody2D > ();
//tìm kiếm đối tượng game bằng thẻ Player và tham khảo chúng
người chơi = GameObject.FindWithTag(“Người chơi”);
//kiểm tra xem Người chơi có ở trong cảnh không
nếu (người chơi != null) {
// tính véc tơ chỉ phương cho Player
Vector3 dir = player.transform.position – transform.position;
// tính góc giữa trục X và vectơ chỉ phương
góc float = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
// xoay viên đạn gameobject
biến đổi.Rotate(0, 0, angle);
// đẩy viên đạn vào rìu X ngôn ngữ của nó (nó sẽ chuyển tiếp cho hình ảnh này)
rb.AddRelativeForce(Vector2.right*force, ForceMode2D.Impulse);
//phát âm thanh (gameobject sẽ được tạo tại vị trí phát âm thanh rồi tự hủy)
AudioSource.PlayClipAtPoint (BulletSound, biến đổi.vị trí);
// nếu Người chơi không có trong cảnh
} khác
//xóa dấu đầu dòng khỏi cảnh
Tiêu diệt (gameObject);
}

// sẽ được thực thi nếu Collider2D đi vào Trigger
void OnTriggerEnter2D (Collider2D khác) {
// kiểm tra xem gameobject bị va chạm có thẻ Player không
if (other.gameObject.tag == “Người chơi”) {
// cố gắng thực thi chức năng “MakeDamage” với tham số “thiệt hại” trong tập lệnh được kết nối với đối tượng trò chơi bị va chạm
other.gameObject.SendMessage(“MakeDamage”, dam, SendMessageOptions.DontRequireReceiver);
//xóa dấu đầu dòng
Tiêu diệt (gameObject);
}
}

//sẽ được thực thi nếu dấu đầu dòng không được hiển thị nữa (ngoài màn hình)
void OnBecameInvisible () {
//xóa dấu đầu dòng
Tiêu diệt (gameObject);
}
}

Chọn Bullet prefab trong cửa sổ Assets. Tập lệnh EnemyBullet của nó hiện có trường mới cho âm thanh Bullet Sound. Đặt LaserSound trong đó.
thêm âm thanh cho dấu đầu dòng
Chúng ta có thể làm tương tự với laser của người chơi. Mở tập lệnh “LaserShot”.

sử dụng UnityEngine;
sử dụng System.Collections;

lớp công khai LaserShot : MonoBehaviour {

//biến tham chiếu cho Rigidbody2D
Thân cứng2D rb;
//biến cho thiệt hại
thiệt hại int công khai;
// biến cho công suất lực
lực lượng phao công cộng;
//biến cho clip âm thanh
công AudioClip BulletSound;

// sẽ được thực hiện một lần
khoảng trống Bắt đầu () {
// tham chiếu đến Rigidbody2D
rb = GetComponent < Rigidbody2D > ();
// khai báo Vector3 với giá trị lực trên trục Y
Vector3 directon = new Vector3(0, force, 0);
// thêm lực đẩy vào Hardbody2D để di chuyển trên Y-axe
rb.AddForce (directon, ForceMode2D.Impulse);
//phát âm thanh (gameobject sẽ được tạo tại vị trí phát âm thanh rồi tự hủy)
AudioSource.PlayClipAtPoint (BulletSound, biến đổi.vị trí);
}
// sẽ được thực thi, nếu gameobject không hiển thị nữa trên màn hình
void OnBecameInvisible () {
// xóa gameobject này khỏi hiện trường
Tiêu diệt (gameObject);
}
// sẽ được thực thi nếu một Collider2D khác đi vào Trigger
void OnTriggerEnter2D (Collider2D khác) {
// kiểm tra xem gameobject khác có tag Enemy không
if (other.gameObject.tag == “Kẻ thù”) {
// thử gọi MakeDamage trên gameobject khác, gửi damage làm tham số cho nó
other.gameObject.SendMessage(“MakeDamage”, dam, SendMessageOptions.DontRequireReceiver);
//xóa gameobject khỏi cảnh
Tiêu diệt (gameObject);
}
}
}

Chọn nhà lắp ghép Laser. Và đặt LaserSound trong trường Bullet Sound.
thêm âm thanh cho laser

19. Bước
Ít nhất chúng ta cần âm thanh vụ nổ. Mở tập lệnh “HpController”.
sử dụng UnityEngine;
sử dụng System.Collections;

lớp công khai HpController : MonoBehaviour {

// biến cho điểm sức khỏe
công khai int hp;
//biến cho clip âm thanh
công khai AudioClip ExplosionsSound;

//funkton để tính toán thiệt hại (chúng tôi sẽ nhận được thiệt hại từ các chức năng khác)
void MakeDamage (thiệt hại int) {
//giảm biến hp
hp = hp – thiệt hại;
//kiểm tra xem hp âm hay không
nếu (hp <= 0) {
//phát âm thanh (gameobject sẽ được tạo tại vị trí phát âm thanh rồi tự hủy)
AudioSource.PlayClipAtPoint (Tiếng nổ, biến đổi.vị trí);
//xóa gameobject
Tiêu diệt (gameObject);
}
}
}

Chọn prefab Asteroid và đặt ExplosionsSound vào trường Explosions Sound mới. Chọn Enemy prefab và đặt ExplosionsSound vào trường Explosions Sound mới (giống với Asteroid).
thêm tiếng nổ
20. Bước
Một điều nữa. Chúng ta nên tạo ra vụ nổ nếu Kẻ thù (hoặc Tiểu hành tinh) bị phá hủy. Một lần nữa Hiệu ứng hạt rất tốt cho việc này. Click vào GameObject -> chọn Particle System. Đổi tên Hệ thống hạt đã tạo thành Explosion. Đặt tất cả Xoay thành không. Thời lượng đến 1. Vô hiệu hóa Vòng lặp. Bắt đầu Tuổi thọ lên 1. Bắt đầu Tốc độ lên 2. Kích thước bắt đầu lên 2. Số hạt tối đa lên 30. Nhấp vào Phát xạ và nhấp vào +. Đặt Độ bùng nổ tối thiểu và tối đa tại Thời điểm 0,0 thành 30. Nhấp vào Hình dạng và đặt Hình dạng thành Hình tròn với Bán kính 0,1.
thêm hệ thống hạt
Kích hoạt màu theo thời gian. Nhấn vào nó. Nhấp vào trường Màu. Bạn sẽ thấy dòng thời gian màu bây giờ. Trên là alfa controll (visiblity), dưới là color. Thay đổi điểm alfa cuối cùng thành 0. Thay đổi điểm màu đầu tiên và cuối cùng thành thứ gì đó bạn thích. Nhấp vào Trình kết xuất và đặt Thứ tự trong Lớp thành 10.

Nó chỉ là ví dụ cho vụ nổ. Hãy thử cài đặt của riêng bạn. Trong Unity 5.5 Hệ thống hạt đã được làm lại. Vì vậy, bây giờ bạn có thể làm hiệu ứng tốt hơn nhiều.
màu cho hạt
Chúng ta nên lập một kịch bản để tiêu diệt Explosion “đã chơi” khỏi hiện trường. Tạo tập lệnh C# mới và đặt tên là TimeDestroyer.

sử dụng UnityEngine;
sử dụng System.Collections;

lớp công khai TimeDestroyer: MonoBehaviour {

// biến thời gian trước gameobject sẽ bị hủy
thời gian nổi công khaiToDestroy;

// sẽ được thực hiện một lần khi bắt đầu
khoảng trống Bắt đầu () {
//xóa gameobject khỏi hiện trường
Tiêu diệt (gameObject, timeToDestroy);
}
}

Chọn Explosion trong cấu trúc phân cấp và thêm tập lệnh “TimeDestroyer” vào đó. Đặt Thời gian để Tiêu diệt thành 2. Tạo prefab Explosion (kéo và thả Explosion từ hệ thống phân cấp vào Nội dung). Xóa Explosion khỏi hệ thống phân cấp.
tạo vụ nổ nhà lắp ghép
21. Bước
Bây giờ chúng tôi có nhà lắp ghép Explosion. Chúng ta nên sinh ra chúng nếu một Kẻ thù hoặc Tiểu hành tinh bị phá hủy. Mở tập lệnh HpController.
sử dụng UnityEngine;
sử dụng System.Collections;

lớp công khai HpController : MonoBehaviour {

// biến cho điểm sức khỏe
công khai int hp;
//biến cho clip âm thanh
công khai AudioClip ExplosionsSound;
// biến cho nhà lắp ghép nổ
Vụ nổ GameObject công khai;

//funkton để tính toán thiệt hại (chúng tôi sẽ nhận được thiệt hại từ các chức năng khác)
void MakeDamage (thiệt hại int) {
//giảm biến hp
hp = hp – thiệt hại;
//kiểm tra xem hp âm hay không
nếu (hp <= 0) {
//phát âm thanh (gameobject sẽ được tạo tại vị trí phát âm thanh rồi tự hủy)
AudioSource.PlayClipAtPoint (Tiếng nổ, biến đổi.vị trí);
//đặt vụ nổ vào vị trí gameobject
Khởi tạo (Bùng nổ, biến đổi.vị trí, Quaternion.identity);
//xóa gameobject
Tiêu diệt (gameObject);
}
}
}

Chọn Nhà lắp ghép tiểu hành tinh. Tập lệnh HpController hiện có trường Explosion mới. Đặt Explosion prefab trong lĩnh vực này. Làm điều này một lần nữa với Enemy prefab. Chọn Enemy prefab và chọn Explosion cho trường Explosion.
thêm nhà lắp ghép vụ nổ

22. Bước
Chúng tôi có thể thêm lửa động cơ cho Trình phát của chúng tôi. Bấm vào GameObject và chọn Hệ thống hạt. Đổi tên nó thành EngineFire. Di chuyển nó trên tàu. Và biến nó thành con của Trình phát (kéo và thả EngineFire trên Trình phát trong Hệ thống phân cấp). Đặt Z_Position thành 0. X_Rotation thành 90. Duration thành 1. Bật Prewarm. Bắt đầu Lifetime đến 0,5. Bắt đầu Kích thước thành 0,5. Không gian mô phỏng đến thế giới. Max Particles thành 50. Nhấp vào Emission và đặt Rate thành 50. Thay đổi Shape thành Box với kích thước bằng không.
cháy động cơ bên trái
Bật màu trong suốt thời gian sử dụng. Nhấp vào trường màu và đặt màu theo ý muốn. Kích hoạt kích thước trong suốt thời gian tồn tại. Đặt đường cong kích thước từ 1 thành 0. Bấm vào Renderer. Đặt Thứ tự trong Lớp thành -1. One EngineFire sẽ sẵn sàng ngay bây giờ. Chọn nó, nhấp chuột phải và nhấp vào Duplicate. Di chuyển ngọn lửa trùng lặp sang phía tàu khác.
thêm lửa động cơ bên phải
23. Bước
Ok, tôi nghĩ nó là đủ cho trò chơi đơn giản. Bạn có thể xây dựng nó cho một nền tảng. Nhấp vào Tệp -> Cài đặt bản dựng. Chọn Nền tảng (thử windows) và nhấp vào Xây dựng.

tải xuống gói thống nhất tải xuống gói thống nhất của hướng dẫn này.
Việc nhập gói có thể bị lỗi. Các thẻ gameobjects có thể được đặt lại thành không xác định. Vì vậy, bạn nên thêm thẻ Enemy. Và sau đó thay đổi các thẻ từ Tiểu hành tinh và Kẻ thù thành Kẻ thù.
More about this source textSource text required for additional translation information
Send feedback
Side panels

 

LEAVE A REPLY

Please enter your comment!
Please enter your name here