Tập lệnh với các phương pháp vật lý 2d thống nhất. Cổng thông tin bảo mật. Có ba cấp độ kiểm soát cơ thể cứng nhắc

* Unity * là một động cơ rất mạnh mẽ, tiến bộ với nhiều tiềm năng. Nó có nhiều chức năng tích hợp (bao gồm cả công cụ vật lý * NvidiaPhysX *) mà chúng tôi, những người sử dụng, không phải kê đơn theo cách thủ công. :)
Trong bài viết ngắn này, tôi muốn thảo luận về các khả năng vật lý của động cơ. Vì vậy, hãy bắt đầu:

Cơ thể cứng nhắc
=
= Cái gì thế này? =
Đằng sau hàm * Rigidbody * là một phần cứng rắn tuyệt đối (* ATT *). Để giải thích một cách đại khái và rõ ràng, * ATT * trong vật lý và cơ học là một vật thể cứng lý tưởng, dưới tác dụng của lực, không thể thay đổi tính chất của nó, nhưng có thể (dưới tác động của nó) di chuyển theo 3 chiều (xuống, lên, về phía trước, v.v. .). v.v., tức là trong các trục XYZ của chúng tôi), cũng như xoay theo 3 chiều (một lần nữa, dọc theo các trục XYZ).

Trong * Unity *, cũng như trong các công cụ trò chơi khác (một lần nữa, tôi gọi chúng là công cụ "trò chơi"), * Rigidbody * được sử dụng cho các đối tượng khác nhau mà chúng ta có thể tương tác bằng cách đẩy, đá, v.v. Những vật thể như vậy dưới tác động của chúng ta sẽ tiếp tục lăn, chuyển động và va chạm với các vật thể khác dưới tác động của lực hấp dẫn.

Ứng dụng nào chúng ta có thể tìm thấy cho chức năng này? =
Ví dụ: để tạo một chiếc ô tô, ngoài * Thân xe cứng cáp *, chúng ta cần Máy va chạm 4 bánh"a và * mã * (* script *) tác dụng lực lên bánh xe, tùy thuộc vào các phím được nhấn.

  • * Khối lượng * - Khối lượng của vật thể của chúng ta tính bằng kg. Không nên đặt giá trị khối lượng lớn hơn hoặc nhỏ hơn 100 lần so với khối lượng của các * ATT * khác.
  • * Lực kéo * - Vật thể chịu lực cản của không khí bằng bao nhiêu khi chuyển động dưới tác dụng của lực. Với giá trị * 0 * không có kháng cự và giá trị vô hạn sẽ ngay lập tức dừng đối tượng của chúng ta.
  • Kéo góc- Vật thể chịu lực cản của không khí bằng bao nhiêu khi nó quay dưới tác dụng của các lực. Với giá trị * 0 * không có kháng cự và giá trị vô hạn sẽ ngay lập tức dừng chuyển động quay của đối tượng của chúng ta.
  • Trọng lực- Khi bật, vật trở nên chịu tác dụng của trọng lực.
  • Là động học- Khi được kích hoạt, đối tượng sẽ không bị ảnh hưởng bởi công cụ vật lý và chỉ có thể được sửa đổi bằng chức năng * Transform * của nó. Ví dụ, điều này có thể hữu ích cho việc tạo các nền tảng di chuyển.
  • * Nội suy * - Chỉ áp dụng nếu các chuyển động ATT của bạn có vẻ lạ hoặc vụng về đối với bạn, v.v.:
  1. Không có: Nội suy không được áp dụng
  2. nội suy: So với chuyển đổi của khung trước (* khung *), khung tiếp theo sẽ được làm mịn.
  3. ngoại suy: Sự chuyển đổi của khung hiện tại được làm mịn so với phép biến đổi ước tính (gần đúng) của khung tiếp theo.
  • Quay đông lạnh- Vô hiệu hóa bất kỳ vòng quay nào, cả theo kịch bản và xung đột. Tuy nhiên, việc xoay có thể được thực hiện bởi hàm // biến đổi.Rotate ()
  • Phát hiện va chạm- Được sử dụng để ngăn các đối tượng chuyển động nhanh đi qua các đối tượng khác mà không tìm thấy va chạm"ov" (một "lưới" đặc biệt trên các vật thể mà chúng va chạm với nhau và với người chơi).
  1. rời rạc: Giá trị mặc định cho đối tượng của chúng ta để "thông báo" tất cả các đối tượng khác mà nó có thể va chạm.
  2. Tiếp diễn: Sử dụng Va chạm rời rạc với các đối tượng va chạm động (có * ATT *) và Va chạm liên tục cho tĩnh MeshCollider"s (không có * ATT *). Chế độ Động liên tục sử dụng Va chạm liên tục cho một * ATT * cụ thể. Phần còn lại * ATT * sẽ sử dụng chế độ _Discrete_. (Điều này sẽ ảnh hưởng rất nhiều đến tải của động cơ vật lý, chỉ cần để _Discrete_ nếu không có vấn đề gì với sự va chạm của các vật thể nhanh)
  3. Động liên tục:Được sử dụng cho các đối tượng ở chế độ _Continuous_ hoặc Va chạm động liên tục. Va chạm liên tục cũng sẽ được sử dụng cho tĩnh MeshCollider"s (không có * ATT *). Đối với tất cả các chế độ khác, chế độ _Discrete_ được sử dụng. Được sử dụng cho các đối tượng chuyển động nhanh.

Làm thế nào chúng ta có thể sử dụng tính năng này? =
= Kiến thức cơ bản.
Để sử dụng * ATT *, chúng tôi cần một đối tượng trò chơi đã được tạo (* GameObject *), bằng cách nhấp vào nó, chúng tôi đi đến menu theo đường dẫn sau: Linh kiện - Vật lý - Thân cứng . Vậy là xong, * ATT * thêm vào! :)
Bây giờ đối tượng chịu tác dụng của trọng lực, bạn có thể tác dụng lực lên nó bằng cách sử dụng script, nhưng để đối tượng hoạt động chính xác như bạn cần, bạn nên thêm * Collider * hoặc * Joint *.

Code điều khiển thế giới.
Trong script, bây giờ chúng ta sẽ thao tác đối tượng của mình bằng các hàm AddForce ()AddTorque () .
Vì tôi sử dụng * JavaScript * trong * Unity *, nên các ví dụ của tôi sẽ đi kèm với nó, các liên kết đến các ví dụ tập lệnh khác (trên C# hoặc * Boo *) bạn sẽ tìm thấy bên dưới, trong đoạn văn Thông tin bổ sung về ATT.

Rigidbody.AddForce

// Rigidbody.AddForce sử dụng 2 loại công thức, giống như nhiều hàm khác liên quan đến chuyển động trong không gian. // 1 type: function AddForce (force: Vector3, mode: ForceMode = ForceMode.Force): void // Lực đẩy đối tượng lên, so với hệ tọa độ tổng thể. function FixedUpdate () (Hardbody.AddForce (Vector3.up * 10);) // Sử dụng Vector3, một hàm Unity được tích hợp sẵn về cơ bản giống với hệ tọa độ chuẩn. // Kiểu thứ 2: function AddForce (x: float, y: float, z: float, mode: ForceMode = ForceMode.Force): void // Tương tự, nhưng nó sử dụng hệ tọa độ X-Y-Z. function FixedUpdate () (Hardbody.AddForce (0, 10, 0);)

Rigidbody.AddTorque

// Hàm quay đối tượng quanh trục đã cho. // 1 kiểu: hàm AddTorque (mô-men xoắn: Vector3, chế độ: ForceMode = ForceMode.Force): void // Quay ATT quanh trục Y toàn cục. Function FixedUpdate () (Hardbody.AddTorque (Vector3.up * 10);) // kiểu 2: function AddTorque (x: float, y: float, z: float, mode: ForceMode = ForceMode.Force): void // Thực hiện điều tương tự, nhưng lại ở một hệ thống đo lường khác. function FixedUpdate () (precisionbody.AddTorque (0, 10, 0);)

ATT tương tác với các đối tượng.
Để vận hành chính xác * ATT * của chúng tôi, chúng cần được cung cấp Máy va chạm"ami (hoặc va chạm"ami, tùy ý bạn ^. ^).
Đọc thêm về máy va chạm bên dưới.


Vấn đề kích cỡ!
Quan sát các kích thước của vật thể của bạn, bởi vì chúng quan trọng hơn nhiều so với khối lượng * ATT * chẵn. Nếu đối tượng của bạn đang di chuyển không chính xác, lơ lửng trong không trung hoặc không va chạm, hãy thử điều chỉnh độ lớn của nó (không phải * ATT *, mà là chính đối tượng). Khi nhập mô hình từ trình chỉnh sửa 3D, kích thước của nó được giữ nguyên, vì vậy hãy cẩn thận trong giai đoạn tạo mô hình và tôn trọng kích thước của tất cả các mô hình.

Thông tin bổ sung về ATT =
Về điều này, mô tả * ATT * hoặc * Rigidbody *, tôi, có lẽ, sẽ kết thúc. Tuy nhiên, có một số mẹo, đặc biệt là đối với những người đã đọc đến đây :)

  1. Kích thước khối tiêu chuẩn trong * Unity * là 1 mét, do đó, rất thuận tiện để kiểm tra kích thước của các mô hình của bạn bằng cách sử dụng nó. Để tạo một khối lập phương, hãy chọn từ menu GameObject - Tạo khác - Khối lập phương
  2. Số mũ tương đối * Mass * xác định cách hai đối tượng sẽ tương tác với nhau.
  3. * Khối lượng * không ảnh hưởng đến tốc độ rơi từ độ cao, hãy sử dụng * Kéo * cho mục đích này.
  4. Các giá trị * Kéo * càng cao, vật phẩm càng nặng. giá trị tiêu chuẩn khác nhau từ 0,001(mảnh kim loại rắn) đến 10(lông vũ).
  5. Nếu bạn cần thay đổi một đối tượng vừa sử dụng script vừa sử dụng vật lý, hãy thêm * ATT * vào đối tượng đó bằng tham số * Kinematic *.

Bạn có thể xem các ví dụ theo kịch bản về tác động của ngoại lực lên một đối tượng có chức năng * ATT * tại các liên kết sau:
* Thêm lực lượng *
* AddTorque *

Để thay đổi ví dụ về tập lệnh, hãy nhấp vào văn bản có tên của ngôn ngữ lập trình!

Va chạm
=
= Cái gì thế này? =
Trong phần trước, chúng ta đã xem xét cách hoạt động của * Rigidbody * và đề cập đến cái gọi là * va chạm *. * Collider * đối với chúng tôi là một vật thể phụ ở dạng lưới của một vật thể nguyên thủy đơn giản hoặc ngược lại, một hình dạng phức tạp, nằm xung quanh mô hình của chúng ta hoặc một phần của mô hình và tương tác với các vật thể khác nếu chúng cũng được bao quanh bởi các vật thể va chạm .
Để giải thích rõ ràng cho các chuyên gia của trình chỉnh sửa thế giới * Warcraft 3 *, hãy tưởng tượng mô hình mà chúng tôi đã nhập, mà chúng tôi không chỉ định kết cấu đường dẫn trong trình chỉnh sửa dudad - đây sẽ là đối tượng của chúng tôi; và vai trò của các máy va chạm ở đây sẽ được thực hiện bởi các bộ chặn đường dẫn xung quanh mô hình. Đương nhiên, đây là một so sánh khá thô, vì trong * Unity * chúng có nhiều chức năng hơn. Vâng, chúng ta hãy xem xét kỹ hơn.

Các loại máy va chạm. =
Các máy va chạm được thêm vào qua menu Thành phần - Vật lý . Có một số loại:

  • Hộp va chạm- dưới dạng một khối lập phương.
  • Sphere Collider- ở dạng hình cầu.
  • Capsule Collider- ở dạng viên nang.
  • Máy va chạm lưới- Tự động tạo máy va chạm theo hình dạng của lưới đối tượng, không thể va chạm với các máy va chạm khác cùng loại. Chủ yếu được sử dụng cho các đối tượng tĩnh, chẳng hạn như môi trường của đường đua.
  • Máy va chạm bánh xe- dùng cho bánh xe, một thứ rất hữu ích.
  • Compound Collider- sự kết hợp của các nguyên thủy cùng hoạt động như một. Để tạo một máy va chạm phức tạp như vậy, bạn cần thêm các đối tượng con vào máy va chạm cơ sở của chúng tôi và đã liên kết với chúng bằng nguyên thủy. Vì vậy, ví dụ, các máy va chạm đơn giản cho ô tô được chế tạo rất tiện lợi.


Thông số kỹ thuật tùy chỉnh =
Về nguyên tắc, tất cả các máy va chạm đều tương tự nhau, chúng chỉ được sử dụng cho các đối tượng có hình dạng khác nhau, tuy nhiên, chúng có một số tham số khác nhau.

  • * Khối lập phương *

* * Vật liệu * - Cho biết cách máy va chạm tương tác với các vật thể khác, trong khi chỉ định vật liệu vật lý, chẳng hạn như kim loại, băng, v.v.
* Là kích hoạt- Nếu tham số được kích hoạt, thì đối tượng bị ảnh hưởng bởi script, không phải vật lý.
* * Kích thước * - Kích thước của máy va chạm dọc theo trục X-Y-Z.
* * Trung tâm * - Vị trí của máy va chạm, so với tọa độ địa phương của đối tượng.

  • *Quả cầu*

* * Radius * - Bán kính của hình cầu, thay thế cho tham số * Size *.
* Các thông số khác không thay đổi.

  • * Capsule * (thông số thay thế kích thước)

* * Bán kính * - Độ dày của viên nang.
* * Chiều cao * - Chiều cao của phần hình trụ của máy va chạm (không có đế tròn).
* * Hướng * - Hướng của máy va chạm, so với tọa độ địa phương của đối tượng.


  • Máy va chạm lưới(thông số thay thế kích thước)

* * Mesh * - Chọn lưới mong muốn để tạo máy va chạm.
* Va chạm Sphere mượt mà - Kích hoạt chức năng này làm mịn bề mặt của máy va chạm. Nó nên được sử dụng trên bề mặt nhẵn, ví dụ, địa hình dốc mà không có quá nhiều góc cạnh, trên đó các quả cầu sẽ lăn.
* * Convex * - Khi được bật, cho phép máy va chạm của chúng ta va chạm với các máy va chạm khác. Máy va chạm lưới lồi"được giới hạn ở 255 hình tam giác.

  • Máy va chạm bánh xe(thông số thay thế kích thước)

* * Radius * - Bán kính bánh xe.
* Khoảng cách tạm dừng- Khoảng cách tối đa để tăng hệ thống treo bánh xe. Hệ thống treo luôn tăng xuống trục * Y * cục bộ.
* Cuộn lò xo- Hệ thống treo cố gắng đạt đến điểm xác định bằng cách sử dụng các lực khác nhau.

  1. Spring: Cố gắng đạt đến điểm (vị trí) được chỉ định. Cài đặt càng cao, nó đạt được càng nhanh.
  2. Bộ giảm chấn: Làm mềm, làm chậm tốc độ của hệ thống treo. Giá trị càng cao, van điều tiết di chuyển càng chậm.
  3. Vị trí mục tiêu: Tổng "đường dẫn" mà hệ thống treo có thể "đi". * 0 * có nghĩa là được mở rộng hoàn toàn và * 1 * được nén hoàn toàn. Giá trị mặc định là 0, tương ứng với hệ thống treo xe thông thường.

* * Mass * - Khối lượng của bánh xe.
* Chuyển tiếp / ma sát sang đường - Các thông số ma sát để lăn bánh đơn giản và lăn ngang (điều này xảy ra trong trượt hoặc trôi).

Chúng tôi viết arkanoid trên Unity. Cơ học bóng và nền tảng

Vậy là chúng ta tiếp tục loạt bài viết về cách viết một game đơn giản trên Unity - một arkanoid cổ điển. Chúng tôi sẽ chỉ sử dụng các công cụ 2D do engine cung cấp cho chúng tôi. Trong mỗi bài viết, chúng tôi sẽ đề cập đến một trong những khía cạnh của việc viết một trò chơi, và trong bài viết này, chúng tôi sẽ thiết lập chuyển động của quả bóng và nền tảng dưới sự điều khiển của người chơi.

Đây là danh sách tất cả các bài báo:

  1. Cơ học bóng và nền tảng.

Chúng ta đang ở đâu?

Trong bài học trước, chúng ta đã thiết lập dự án, chuyển tài nguyên cho nó và tạo cảnh đơn giản đầu tiên. Nếu bạn chưa đọc, chúng tôi đặc biệt khuyên bạn nên sửa lỗi này.

xem trước kết quả

Chuyển động nền tảng

Bản thân chúng tôi đã có nền tảng - chúng tôi đã tạo nó trong bài học trước. Nó vẫn là để dạy cô ấy di chuyển, và chỉ sang trái hoặc phải, tức là dọc theo trục X. Để thực hiện việc này, chúng ta cần viết một tập lệnh ( Script).

Kịch bản là các đoạn mã chương trình chịu trách nhiệm cho một nhiệm vụ cụ thể. Unity có thể hoạt động với các tập lệnh được viết bằng ba ngôn ngữ lập trình: Boo, JavaScript và C #. Chúng tôi sẽ sử dụng ngôn ngữ thứ hai, nhưng bạn cũng có thể thử các ngôn ngữ khác.

Vì vậy, để tạo một tập lệnh, hãy chuyển đến tab dự định, tìm thư mục cùng tên ở đó Tập lệnh và nhấp chuột phải vào nó. Cùng lựa chọn nào Tạo -> Tập lệnh C #. Một tệp mới sẽ xuất hiện có tên là NewBehaviourScript. Đổi tên nó thành PlayerScript để thuận tiện. Trên tab Thanh tra bạn có thể xem nội dung của script.

Nhấp đúp để mở tập lệnh. Môi trường phát triển MonoDevelop sẽ bắt đầu, sau này bạn có thể thay đổi thành bất kỳ trình soạn thảo nào thuận tiện cho mình. Đây là những gì bạn sẽ thấy:

Sử dụng UnityEngine; sử dụng System.Collections; public class NewBehaviourScript: MonoBehaviour (// sử dụng phương thức này để khởi tạo void Start () () // Cập nhật được gọi mỗi khi trò chơi được kết xuất void Update () ())

Tất cả các tập lệnh Unity có hai phương thức theo mặc định:

  • Start (): dùng để khởi tạo các biến hoặc tham số mà chúng ta cần trong đoạn mã.
  • Update (): Được gọi là mọi khung trò chơi, cần thiết để cập nhật trạng thái của trò chơi.

Để di chuyển nền tảng, chúng ta cần hai loại thông tin: vị trí và tốc độ.

Do đó, cần tạo hai biến để lưu trữ thông tin này:

public float playerVelocity;
người chơi Vector3 riêng tư;

Lưu ý rằng một biến được khai báo là công khai và biến còn lại là riêng tư. Nó dùng để làm gì? Thực tế là Unity cho phép bạn chỉnh sửa giá trị của các biến công khai mà không cần đến trình soạn thảo MonoDevelop mà không cần phải thay đổi mã. Tính năng này rất hữu ích trong những trường hợp đó. khi cần thiết để sửa một số giá trị đang bay. Tốc độ nền tảng là một trong những giá trị như vậy, đó là lý do tại sao chúng tôi công bố nó một cách công khai.

Lưu tập lệnh trong trình chỉnh sửa MonoDevelop và chuyển sang trình chỉnh sửa Unity. Bây giờ chúng ta có một tập lệnh và chúng ta cần gán nó cho một số đối tượng, trong trường hợp của chúng ta là một nền tảng. Chọn nền tảng của chúng tôi trong tab Hệ thống cấp bậc và trong cửa sổ Thanh tra thêm một thành phần bằng cách nhấp vào nút Thêm thành phần.

Việc thêm tập lệnh của chúng tôi vào thành phần có thể được thực hiện theo cách khác. Kéo tập lệnh của chúng tôi vào khu vực nút Thêm thành phần. Trong tab Thanh tra bạn sẽ thấy một cái gì đó như thế này:

Lưu ý rằng thành phần tập lệnh bây giờ có một trường Vận tốc người chơi, có thể được thay đổi ngay lập tức. Điều này có thể thực hiện được nhờ khai báo công khai của biến. Đặt tham số thành 0,3 và chuyển sang trình soạn thảo MonoDevelop.

Bây giờ chúng ta cần biết vị trí của nền tảng: playerPosition. Để khởi tạo một biến, hãy tham khảo đối tượng script trong phương thức Start ():

// sử dụng phương thức này để khởi tạo void Start () (// lấy vị trí bắt đầu của platform playerPosition = gameObject.transform.position;)

Tuyệt vời, chúng tôi đã xác định được vị trí ban đầu của nền tảng và bây giờ chúng tôi có thể di chuyển nó. Vì chúng ta muốn nền tảng chỉ di chuyển dọc theo trục X, chúng ta có thể sử dụng phương thức GetAxis của lớp Đầu vào. Chúng tôi sẽ chuyển chuỗi Horizontal cho hàm này và nó sẽ trả về 1 nếu phím phải được nhấn và -1 nếu phím trái được nhấn. Nhân số kết quả với tốc độ và cộng giá trị này với vị trí hiện tại của người chơi, chúng ta sẽ có được chuyển động.

Chúng tôi cũng sẽ thêm dấu kiểm để thoát ứng dụng bằng cách nhấn phím Esc.

Đây là những gì chúng ta nên kết thúc với:

Sử dụng UnityEngine; sử dụng System.Collections; public class PlayerScript: MonoBehaviour (public float playerVelocity; private Vector3 playerPosition; // sử dụng phương thức này để khởi tạo void Start () (// lấy vị trí bắt đầu của platform playerPosition = gameObject.transform.position;) // Cập nhật được gọi là mọi thời gian trò chơi được hiển thị void Update () (// người chơi chuyển động ngangPosition.x + = Input.GetAxis ("Horizontal") * playerVelocity; // thoát trò chơi nếu (Input.GetKeyDown (KeyCode.Escape)) (Application.Quit ();) / / cập nhật vị trí nền tảng chuyển đổi.position = playerPosition;))

Lưu tập lệnh và quay lại trình soạn thảo Unity. Nhấn vào nút chơi và cố gắng di chuyển nền tảng bằng cách sử dụng các nút bên trái và bên phải.

Định nghĩa khu vực trò chơi

Bạn rất có thể nhận thấy rằng nền tảng cũng có thể di chuyển ra ngoài sân chơi. Thực tế là chúng tôi không có bất kỳ kiểm tra nào để vượt ra khỏi một số ranh giới.

Hãy thêm một biến công khai khác vào tập lệnh hiện có của chúng tôi và gọi nó là ranh giới.

Biến này sẽ lưu trữ tọa độ x tối đa của nền tảng. Vì chúng ta sẽ xây dựng các cấp ở dạng đối xứng xung quanh điểm có tọa độ (0, 0, 0) nên giá trị tuyệt đối của biến biên sẽ giống nhau đối với phần dương của trục x và cho phần âm.

Bây giờ chúng ta hãy thêm một vài điều kiện. Hãy làm điều đó khá đơn giản: nếu vị trí chúng tôi tính toán lớn hơn biên hoặc nhỏ hơn -boundary, thì chúng tôi chỉ cần đặt một vị trí mới dọc theo trục X bằng giá trị của biên biến. Do đó, chúng tôi đảm bảo rằng nền tảng sẽ không vượt ra ngoài biên giới của chúng tôi và sẽ không bao giờ rời khỏi khu vực chơi. Đây là mã:

Sử dụng UnityEngine; sử dụng System.Collections; public class PlayerScript: MonoBehaviour (public float playerVelocity; private Vector3 playerPosition; // sử dụng phương thức này để khởi tạo void Start () (// lấy vị trí bắt đầu của platform playerPosition = gameObject.transform.position;) // Cập nhật được gọi là mọi thời gian trò chơi được hiển thị void Update () (// người chơi chuyển động ngangPosition.x + = Input.GetAxis ("Horizontal") * playerVelocity; // thoát trò chơi nếu (Input.GetKeyDown (KeyCode.Escape)) (Application.Quit ();) / / cập nhật vị trí nền tảng biến đổi.position = playerPosition; // kiểm tra xem có nằm ngoài giới hạn không nếu (playerPosition.x< -boundary) { transform.position = new Vector3 (-boundary, playerPosition.y, playerPosition.z); } if (playerPosition.x >ranh giới) (biến đổi.position = Vector3 mới (ranh giới, playerPosition.y, playerPosition.z);)))

Bây giờ quay lại trình chỉnh sửa và chuyển sang trò chơi, tìm giá trị tối ưu cho biên biến. Trong trường hợp của chúng tôi, số 5,46 xuất hiện. Mở Thanh tra và đặt lại vị trí X của nền tảng thành 0 và tham số Ranh giớiđặt theo giá trị bạn tìm thấy.

Nhấn vào nút chơi và đảm bảo rằng bạn đã làm đúng mọi thứ. Nền tảng chỉ được di chuyển trong sân chơi.

Bao gồm vật lý

Để làm cho các vụ va chạm trở nên thực tế hơn, chúng tôi sẽ sử dụng mô phỏng vật lý. Trong bài viết này, chúng tôi sẽ thêm các đặc tính vật lý cho bóng, nền và đường biên sân. Vì chúng tôi đang viết một trò chơi 2D nên chúng tôi sẽ sử dụng máy va chạm 2D. Va chạm là một loại thành phần riêng biệt cho phép một đối tượng phản hồi lại các tác động va chạm của các đối tượng khác.

Trong cửa sổ Hệ thống cấp bậc chọn nền tảng của chúng tôi, đi tới Thanh tra và nhấn nút Thêm thành phần. Trong cửa sổ xuất hiện, nhập máy va chạm. Như bạn có thể thấy, có rất nhiều lựa chọn. Mỗi máy va chạm có các thuộc tính cụ thể tương ứng với các đối tượng liên quan - hình chữ nhật, hình tròn, v.v.

Vì nền tảng của chúng tôi có hình chữ nhật, chúng tôi sẽ sử dụng Box Collider 2D. Chọn nó và thành phần sẽ tự động xác định kích thước của nền tảng: bạn không cần thiết lập chúng theo cách thủ công, Unity sẽ làm điều đó cho bạn.

Làm tương tự cho 3 đường viền ( Cấu trúc phân cấp -> Thanh tra -> Thêm thành phần -> Box Collider 2D).

Với quả bóng hơi khác một chút: nó có hình tròn. Chọn quả bóng và thêm một thành phần cho nó Circle Collider 2D.

Trên thực tế, các trình va chạm hình tròn và hình chữ nhật rất giống nhau, ngoại trừ việc thay vì tham số kích cỡ, xác định chiều rộng và chiều dài, trong một vòng tròn được sử dụng Bán kính. Chúng tôi nghĩ rằng giải thích ở đây là thừa.

Va chạm đàn hồi

Để quả bóng của chúng ta bật ra khỏi khối, tường và nền, chúng ta cần đặt bề mặt (vật tư) cho thành phần vật lý được thêm vào trước đó. Trong Unity, mọi thứ đều đã có, chúng ta chỉ cần bổ sung các nguyên liệu cần thiết.

Mở cửa sổ dự định và bên trong thư mục tài sản tạo một thư mục mới có tên là Vật lý. Nhấp chuột phải vào thư mục mới tạo và chọn Tạo -> Vật liệu Physics2D. Đặt tên nó là BallPhysicsMaterial.

Mọi bề mặt trong Unity đều có hai tham số: ma sát (ma sát) và độ đàn hồi (độ nảy). Bạn có thể đọc thêm về động cơ vật lý và một số thông số vật lý. Nếu bạn cần một vật đàn hồi hoàn hảo, thì bạn nên đặt ma sát thành 0 và độ đàn hồi là 1.

Bây giờ chúng ta đã có vật liệu hoàn thiện, nhưng nó vẫn chưa liên quan gì đến quả bóng. Chọn đối tượng bóng trong tab Hệ thống cấp bậc và trong cửa sổ Thanh tra bạn sẽ thấy cánh đồng vật tư thành phần Circle Collider 2D. Kéo và thả nội dung mới tạo của bạn vào đây.

Thêm một thành phần Cơ thể cứng nhắc

Để quả bóng của chúng ta chuyển động dưới sự điều khiển của vật lý, chúng ta cần thêm một thành phần nữa vào nó: Cơ thể cứng nhắc 2D. Chọn đối tượng quả bóng trong cửa sổ Hệ thống cấp bậc và thêm thành phần ở trên - mặc dù nó có một số tham số, chúng tôi chỉ quan tâm đến một: Thang đo trọng lực. Vì quả bóng của chúng ta sẽ chỉ di chuyển do bị trả lại, chúng ta sẽ đặt thông số này thành 0 - bằng cách này chúng ta đảm bảo rằng trọng lực sẽ không phản ứng với vật thể. Mọi thứ khác không thể thay đổi.

Hành vi bóng

Hãy tạo một script riêng cho ball (lại sử dụng C # làm ngôn ngữ lập trình) và gọi nó là BallScript. Liên kết tập lệnh đã tạo với một đối tượng ( Cấu trúc phân cấp -> Thanh tra -> Thêm thành phần).

Trước khi bắt đầu viết script, hãy xác định hành vi của quả bóng:

  1. Quả bóng có hai trạng thái: không hoạt động (khi nó ở trên nền vào đầu trò chơi) và hoạt động (khi nó đang chuyển động).
  2. Quả bóng sẽ chỉ hoạt động một lần.
  3. Khi quả bóng hoạt động, chúng ta tác dụng lực lên nó để nó bắt đầu chuyển động.
  4. Nếu bóng đã rời khỏi sân chơi, nó được chuyển sang trạng thái không hoạt động và được đặt trên bục.

Dựa trên thông tin này, hãy tạo các biến toàn cục ballIsActive, ballPosition và ballInitialForce:

bool ballIsActive riêng tư;
Vector3 ballPosition riêng;
Vector2 ballInitialForce riêng;

Bây giờ chúng ta có một tập hợp các biến, chúng ta cần chuẩn bị đối tượng. Trong phương thức Start (), chúng ta phải:

  • tạo ra một lực tác dụng vào quả bóng;
  • đưa bóng vào trạng thái không hoạt động;
  • nhớ vị trí của quả bóng.

Đây là cách bạn có thể làm điều đó:

Void Start () (// tạo force ballInitialForce = new Vector2 (100.0f, 300.0f); // vô hiệu hóa ballIsActive = false; // lưu trữ vị trí ballPosition = biến đổi.position;)

Như bạn thấy, lực tác dụng không hoàn toàn theo phương thẳng đứng mà nghiêng về bên phải - quả bóng sẽ di chuyển theo đường chéo.

Void Update () (// kiểm tra xem dấu cách có được nhấn không if (Input.GetButtonDown ("Jump") == true) ())

Bước tiếp theo là kiểm tra trạng thái của quả bóng, vì chúng ta chỉ cần đặt lực nếu quả bóng ở trạng thái không hoạt động:

Void Update () (// kiểm tra xem phím cách có được nhấn không nếu (Input.GetButtonDown ("Jump") == true) (// kiểm tra trạng thái if (! BallIsActive) ()))

Giả sử rằng chúng ta đang ở đầu trò chơi, thì chúng ta phải tác động lực lên quả bóng và đặt nó ở trạng thái hoạt động:

Void Update () (// kiểm tra xem phím cách có được nhấn không if (Input.GetButtonDown ("Jump") == true) (// kiểm tra trạng thái if (! BallIsActive) (// áp dụng lực cứngbody2D.AddForce (ballInitialForce ); // đặt trạng thái hoạt động ballIsActive =! ballIsActive;)))

Nếu bây giờ bạn bật trò chơi, thì bằng cách nhấn phím cách, quả bóng sẽ thực sự bắt đầu di chuyển. Tuy nhiên, bạn có thể nhận thấy rằng quả bóng ở trạng thái không hoạt động không hoạt động hoàn toàn chính xác: nếu chúng ta di chuyển nền, thì quả bóng sẽ di chuyển theo nó, nhưng trên thực tế nó vẫn ở vị trí cũ. Dừng trò chơi, chúng ta hãy sửa lỗi này.

Trong phương pháp Cập nhật, chúng ta phải kiểm tra trạng thái của quả bóng, và nếu nó không hoạt động, chúng ta cần đặt vị trí của quả bóng dọc theo trục X giống với vị trí của nó trên nền tảng.

Giải pháp khá đơn giản, nhưng làm thế nào để chúng ta có được tọa độ của một đối tượng hoàn toàn khác? Cơ bản - chúng tôi sẽ tạo một biến kiểu GameObject và lưu trữ một tham chiếu đến đối tượng nền tảng:

công khai GameObject playerObject;

Hãy quay lại phương thức Update ():

Void Update () (// kiểm tra xem phím cách có được nhấn không if (Input.GetButtonDown ("Jump") == true) (// kiểm tra trạng thái if (! BallIsActive) (// áp dụng lực cứngbody2D.AddForce (ballInitialForce ); // đặt trạng thái hoạt động ballIsActive =! ballIsActive;) if (! ballIsActive && playerObject! = null) (// đặt vị trí bóng mới ballPosition.x = playerObject.transform.position.x; // đặt vị trí bóng biến đổi.position = ballPosition;)))

Lưu tập lệnh và quay lại trình soạn thảo Unity. Bạn có thể nhận thấy rằng biến playerObject được khai báo, sử dụng, nhưng không được khởi tạo ở bất kỳ đâu. Vâng, đó là đúng. Để khởi tạo nó, hãy chuyển đến tab Hệ thống cấp bậc, tìm quả bóng và trong cửa sổ Thanh tra tìm thành phần Tập lệnh bóng. Thành phần này có một tham số Đối tượng người chơi, hiện đang trống:

Tìm trong tab Hệ thống cấp bậc nền tảng của chúng tôi và kéo nó vào trường Đối tượng người chơi. Bắt đầu trò chơi bằng cách nhấn nút chơi và đảm bảo rằng mọi thứ đều hoạt động.

Đặt lại trò chơi

Nếu ở giai đoạn này bạn bắt đầu trò chơi và thua (để bóng rơi ra ngoài sân), thì không có gì sẽ trở lại bình thường. Và trên thực tế, trạng thái của trò chơi nên được thiết lập lại. Hãy sửa lỗi này.

Trạng thái này rất dễ bắt gặp: quả bóng sẽ hoạt động, và vị trí của nó dọc theo trục Y là âm. Nếu vậy, chúng tôi đặt quả bóng ở trạng thái không hoạt động và đặt nó trên bệ:

If (ballIsActive &&formation.position.y< -6) { ballIsActive = !ballIsActive; ballPosition.x = playerObject.transform.position.x; ballPosition.y = -4.2f; transform.position = ballPosition; }

Nhưng đây cũng không phải là kết thúc. Sau khi lưu kịch bản và chạy trò chơi, bạn sẽ nhận thấy rằng mỗi khi bạn khởi động lại màn chơi, quả bóng ngày càng trở nên mạnh mẽ hơn. Tại sao chuyện này đang xảy ra? Vấn đề là chúng ta không giải tỏa lực tác dụng lên quả bóng. Để khắc phục điều này, chúng ta có thể sử dụng thông số IsKinematic, tắt nó đi trước khi thêm lực và bật nó lên sau khi rơi.

Đây là cách phương thức Update () cuối cùng của chúng tôi xuất hiện:

Lớp công khai BallScript: MonoBehaviour (private bool ballIsActive; private Vector3 ballPosition; private Vector2 ballInitialForce; // GameObject public GameObject playerObject; // sử dụng phương thức này để khởi tạo void Start () (// tạo force ballInitialForce = new Vector2 (100.0f, 300.0 f); // làm cho nó không hoạt động ballIsActive = false; // ghi nhớ vị trí ballPosition = biến đổi.position;) void Update () (// kiểm tra xem phím cách có được nhấn không nếu (Input.GetButtonDown ("Jump") == true ) (// kiểm tra trạng thái if (! ballIsActive) (// đặt lại tất cả các lực Hardbody2D.isKinematic = false; // áp dụng lực Hardbody2D.AddForce (ballInitialForce); // đặt trạng thái hoạt động ballIsActive =! ballIsActive;) if ( ! ballIsActive && playerObject! = null) (// đặt vị trí mới của bóng ballPosition.x = playerObject.transform.position.x; // đặt vị trí của bóng biến đổi.position = ballPosition;) // kiểm tra xem bóng đã rơi nếu (ballIsActive && tra nsform.position.y< -6) { ballIsActive = !ballIsActive; ballPosition.x = playerObject.transform.position.x; ballPosition.y = -4.2f; transform.position = ballPosition; rigidbody2D.isKinematic = true; } } }

Và bây giờ đó là tất cả chắc chắn. Khởi chạy trò chơi và kiểm tra xem mọi thứ có hoạt động như mong đợi hay không.

Trong phần tiếp theo

Vậy là bài viết thứ hai đã kết thúc. Bây giờ bạn đã học cách làm việc với script, va chạm và với bàn phím. Lần tới chúng ta sẽ nói về cơ chế của các khối trò chơi.

Đã xem: 734


Con đường sáng tạo kỳ lạ của tôi đã đưa tôi vào phát triển trò chơi. Nhờ chương trình dành cho sinh viên xuất sắc từ một công ty CNTT, có tên chỉ bằng một chữ cái Hy Lạp nhỏ, cộng tác với trường đại học của chúng tôi, chúng tôi đã cố gắng tập hợp một nhóm, tạo ra tài liệu và thiết lập phát triển trò chơi Agile dưới sự giám sát của một nhân viên cao cấp Kỹ sư QA (xin chào Anna!)

Không cần suy nghĩ nhiều, Unity đã được chọn làm động cơ. Đó là một công cụ tuyệt vời có thể thực sự nhanh chóng và dễ dàng tạo ra một trò chơi thực sự tồi tệ mà không ai có đủ tâm lý sẽ chơi. Để tạo ra một trò chơi hay, bạn vẫn phải xem qua tài liệu, nghiên cứu kỹ một số tính năng và tích lũy kinh nghiệm phát triển.

Trò chơi của chúng tôi đã sử dụng công cụ vật lý theo cách mà nó không mong đợi, điều này gây ra rất nhiều vấn đề về hiệu suất trên nền tảng di động. Bài viết này, sử dụng ví dụ về trò chơi của chúng tôi, mô tả cuộc đấu tranh của tôi với công cụ vật lý và tất cả các tính năng của công việc của nó đã được nhận thấy trên đường đến phiên bản beta khả thi.

Tro choi

Một vài lời về cách nó được tạo ra.
Được tạo bằng Máy xay sinh tố và một vài tập lệnh python. Vào thời điểm chụp ảnh, có 16 ô vuông ở góc màn hình, màu của chúng mã hóa 32 bit của một số dấu phẩy động - chuyển động quay của điện thoại tại một thời điểm nhất định. R, G - dữ liệu, B - chẵn lẻ. 0 - 0, 255 - 1. Video quay trên máy tính được chia thành các khung hình bằng ffmpeg, mỗi khung hình kết xuất được gán một góc được giải mã. Định dạng này giúp nó có thể tồn tại bất kỳ quá trình nén nào trong quá trình quay và khắc phục được thực tế là tất cả các chương trình đều có những ý tưởng hơi khác nhau về thời gian trôi qua. Trong thực tế, trò chơi chơi theo cách tương tự như trên kết xuất.


Máy bay bay qua một hang động vô tận và không thể đoán trước, trong đó có tiền thưởng, đủ loại tiền xu và kẻ thù mà bạn có thể bắn bằng tên lửa homing. Đập vào tường - ngay lập tức bị mất.
Một tính năng khác biệt của trò chơi là cấp độ được đóng đinh ở đường chân trời và điều khiển trong đó là con quay hồi chuyển, hơn nữa là tuyệt đối. Nghiêng điện thoại 45 độ - máy bay bay một góc 45 độ. Bạn cần tạo một vòng lặp chết - bạn phải xoay máy tính bảng. Không có độ nhạy, chỉ có Hardcore.
Hãy chỉ ra hai vấn đề chính và rõ ràng đối với nhà phát triển:
Vấn đề 1: Vô cực
Unity lưu trữ và xử lý tọa độ đối tượng dưới dạng trôi nổi 32-bit thông thường với độ chính xác lên đến 6 chữ số thập phân. Vấn đề là chúng ta có một trò chơi vô tận và nếu chúng ta bay đủ lâu, tất cả các loại lỗi điên rồ sẽ bắt đầu, cho đến dịch chuyển xuyên tường. Có một số cách tiếp cận để giải quyết vấn đề này:
  • Làm ngơ. Trong Minecraft, ví dụ, lỗi làm tròn chỉ làm cho trò chơi thú vị hơn bằng cách sinh sản.

  • Dịch chuyển đến (0; 0; 0) khi máy bay ở quá xa điểm xuất phát.

  • Thay đổi điểm tham chiếu. Nó không phải là máy bay chuyển động, mà là mức độ xung quanh nó.
  • Trong trường hợp của chúng tôi, tùy chọn duy nhất có thể chấp nhận được là tùy chọn thứ ba, đã được thực hiện. Về việc thực hiện - một chút sau đó.
    Việc đầu tiên - bỏ qua - là hoàn toàn không thể chấp nhận được. Tạo ra một robot có thể chơi trò chơi của chúng ta mãi mãi là một nhiệm vụ thú vị (và khá đơn giản) mà ai đó sẽ giải quyết. Và những người chơi bình thường của Hàn Quốc không nên bị đánh giá thấp - máy bay nhanh, cấp độ được tạo ra một cách khó lường. Và nếu bạn bay và bay trước khi đi qua các bức tường, thì việc bắn chính xác hơn nhiều sẽ bắt đầu gặp trục trặc sau 5 phút bay.
    Sự dịch chuyển thứ hai - dịch chuyển của người chơi và toàn bộ thế giới - đưa thiết bị di động đến đầu gối của họ, trong một số trường hợp - trong khoảng nửa giây. Điều này rất đáng chú ý, và do đó - không thể chấp nhận được. Nhưng đây là một lựa chọn hoàn toàn có thể chấp nhận được đối với các game PC đơn giản vô tận.

    Vấn đề 2: Tạo cấp độ

    Có một số cách tiếp cận cơ bản để xây dựng vận động viên chạy vô tận:
  • Sử dụng các phân đoạn cấp làm sẵn phù hợp ngẫu nhiên. Ví dụ, điều này được thực hiện trong Subway Surfers. Dễ thực hiện nhưng người chơi nhanh chóng quen và biết phải chuẩn bị những gì, đỡ nhàm chán.

  • Mức độ chỉ là một đường thẳng trên đó các chướng ngại vật được đặt ngẫu nhiên. Đây là cách nó được thực hiện trong Joypack Joyride và Temple Run. Trong trường hợp của chúng tôi, điều này sẽ hạn chế đáng kể số lần điều động.

  • Mọi thứ đều được tạo ra một cách ngẫu nhiên. Lựa chọn khó nhất, khó đoán và thú vị nhất cho người chơi.
  • Tất nhiên, chúng tôi đã chọn phương án khó nhất. Trung tâm của nó là một cỗ máy trạng thái rất phức tạp thực hiện các chuyển đổi ngẫu nhiên trên chúng. Nhưng trong khuôn khổ bài viết này, đó không phải là cơ chế thú vị, mà là quá trình tạo ra cấp độ và tổ chức của nó, có tính đến điểm xuất phát đã chọn.

    Cấu trúc cấp độ

    Chúng tôi đang bay trong một hang động, nó có sàn và trần - một vài khối, đơn vị xây dựng cơ bản. Các khối được kết hợp thành các đoạn nối liền mạch với nhau. Nhìn chung, các phân đoạn quay xung quanh máy bay và di chuyển dọc theo vectơ vận tốc của nó, tạo ra ảo giác về chuyến bay. Nếu một phân đoạn rời khỏi trường xem của máy ảnh, phân đoạn đó sẽ bị xóa các khối, được gắn vào phân đoạn cuối cùng của cấp và được lấp đầy bằng các khối mới, theo hướng dẫn của trình tạo. Tổng của các phân đoạn như vậy là cấp độ.
    Các nhà phát triển Unity có kinh nghiệm có thể nhăn mặt một cách hợp lý, sau khi ước tính khối lượng công việc và tất cả các cạm bẫy có thể xảy ra. Nhưng nói cách khác, mọi thứ đều đơn giản, nhưng tôi không có kinh nghiệm phát triển ...

    Các định luật cơ bản của vật lý trong sự thống nhất

    Trong một tháng phát triển, thử nghiệm và đọc tài liệu, tôi đã xác định được ba định luật vật lý cơ bản trong Unity. Chúng có thể bị vi phạm, nhưng cái giá của sự vi phạm là hiệu suất. Công cụ sẽ không cảnh báo bạn về lỗi theo bất kỳ cách nào và nếu không có trình biên dịch, bạn có thể không bao giờ biết về chúng. Không tuân theo các luật này có thể làm chậm trò chơi của bạn hàng chục Một lần. Theo tôi hiểu, vi phạm bất kỳ luật nào dẫn đến thực tế là động cơ vật lý đánh dấu máy va chạm vi phạm là không chính xác và tạo lại nó trên vật thể, sau đó là tính toán lại vật lý:
    1. Máy va chạm không được di chuyển, xoay, bật / tắt và thay đổi kích thước.
    Khi bạn đã thêm một máy va chạm vào một đối tượng, hãy quên bất kỳ tác động nào lên nó hoặc các đối tượng mà nó chứa. Một máy va chạm thông thường là một vật thể tĩnh độc quyền. Ví dụ, một cái cây có thể bằng một máy va chạm. Nếu cây có thể rơi vào người chơi - cây sẽ đổ cùng với màn trình diễn. Nếu cái cây này mọc lên từ một đám mây dinh dưỡng kỳ diệu không có máy va chạm, nhưng có thể di chuyển, thì điều này sẽ đi kèm với sự sụt giảm hiệu suất.
    2. Nếu đối tượng đang chuyển động hoặc quay - nó phải là một vật thể rắn, tức là có một thành phần Rigidbody.
    Về nó, nó được viết trong tài liệu, vâng. Điều này không cần thiết phải đọc kỹ để bắt đầu tạo một trò chơi, bởi vì Unity rất đơn giản và trực quan.
    Rigidbody thay đổi mối quan hệ của động cơ vật lý với đối tượng. Các lực bên ngoài bắt đầu tác động lên nó, nó có thể có vận tốc thẳng và góc, và quan trọng nhất, một vật thể cứng có thể chuyển động và quay nhờ động cơ vật lý mà không gây ra sự tính toán lại hoàn toàn về vật lý.
    Có hai loại chất rắn - thông thường và động học. Các vật thể bình thường tương tác với nhau và với các vật thể va chạm thông thường - một vật thể này không thể đi qua vật thể khác. Các vật thể động học tuân theo các quy tắc mô phỏng đơn giản - chúng không bị ảnh hưởng bởi bất kỳ lực bên ngoài nào, kể cả trọng lực. Họ có thể tự do đi qua bất cứ điều gì.
    Nếu không phải là điều đáng tiếc khi cho các vật thể nằm dưới sự điều khiển của động cơ vật lý - hãy sử dụng các vật thể cứng thông thường. Ví dụ, nếu bạn cần lăn những viên đá trên vách đá một cách đẹp mắt. Nếu tập lệnh hoặc trình tạo hoạt hình của bạn điều khiển đối tượng trực tiếp - hãy sử dụng các cơ quan động học, vì vậy bạn không phải liên tục đối phó với các va chạm động cơ và đối tượng ngẫu nhiên. Ví dụ: nếu bạn có một nhân vật hoạt hình hoặc tên lửa dẫn đường phát nổ khi tiếp xúc với thứ gì đó.
    3. Nếu vật là vật cứng thì vật đó phải chuyển động và quay theo các phương của vật cứng.
    Hãy quên việc gọi trực tiếp Transform "trên một đối tượng ngay sau khi thêm máy va chạm vào nó. Từ bây giờ và mãi mãi, Transform là kẻ thù và kẻ giết hiệu suất của bạn. Trước khi bạn viết biến đổi.position = ... hoặc biến đổi.eulerAngles = ..., nói cụm từ "Bây giờ tôi hoàn toàn hiểu rõ ràng những gì tôi đang làm, tôi hài lòng với hệ thống phanh do đường này gây ra." Đừng quên về các mối quan hệ thứ bậc: nếu bạn đột ngột di chuyển một vật thể có chứa vật cứng, vật lý sẽ được tính toán lại.
    Có ba cấp độ kiểm soát cơ thể cứng nhắc:
    - Mức độ tự nhiên cao nhất và do đó là thông qua các lực lượng. Đây là các phương thức AddForce và AddTorque. Động cơ vật lý sẽ tính đến khối lượng của cơ thể và tính toán chính xác tốc độ kết quả. Tất cả các tương tác của các cơ thể xảy ra ở cấp độ này.
    - Mức độ trung bình - sự thay đổi của các tốc độ. Đây là các thuộc tính vận tốc và vận tốc góc. Dựa trên chúng, các lực tác động lên các vật thể trong quá trình tương tác của chúng được tính toán, cũng như rõ ràng, vị trí của chúng tại thời điểm tiếp theo. Nếu một cơ thể cứng nhắc có tốc độ rất thấp, nó "ngủ quên" để tiết kiệm tài nguyên.
    - Mức thấp nhất - trực tiếp tọa độ của đối tượng và hướng của nó trong không gian. Đây là các phương thức MovePosition và MoveRotation. Ở lần lặp tiếp theo của phép tính vật lý (điều này rất quan trọng, vì mỗi lệnh gọi phương thức tiếp theo trong một khung sẽ thay thế lệnh gọi của khung trước đó), chúng dịch chuyển đối tượng đến một vị trí mới, sau đó nó vẫn tồn tại như trước. Trong trò chơi của chúng tôi, cấp độ này được sử dụng, và chỉ nó, vì nó cung cấp toàn quyền kiểm soát đối tượng.

    Còn lại gì? Bật / tắt đối tượng và thu phóng. Tôi không biết có cách nào để thay đổi kích thước một đối tượng mà không gây nhầm lẫn cho động cơ không. Nó là hoàn toàn có thể không. Tắt đối tượng là không đau, và bật nó ... vâng, gây ra một sự tính toán lại vật lý trong vùng lân cận của đối tượng được bật. Do đó, cố gắng không đưa quá nhiều đối tượng vào cùng một lúc, kéo giãn quá trình này trong thời gian để người dùng không nhận thấy.

    Có một luật không ảnh hưởng đến hiệu suất, nhưng ảnh hưởng đến hiệu suất: một cơ thể cứng nhắc không thể là một phần của một cơ thể cứng nhắc. Đối tượng cha mẹ sẽ chiếm ưu thế, vì vậy đứa trẻ hoặc sẽ đứng yên so với đối tượng cha mẹ, hoặc hành xử không thể đoán trước và không chính xác.

    Có một tính năng phi vật lý khác của Unity đáng đề cập: việc tạo và xóa động các đối tượng thông qua các phương thức Instantiate / Destroy rất chậm. Tôi sợ thậm chí tưởng tượng những gì đang diễn ra trong quá trình tạo ra vật thể. Nếu bạn cần tạo và xóa một thứ gì đó động - hãy sử dụng các nhà máy và điền chúng bằng các đối tượng cần thiết trong quá trình tải trò chơi. Instantiate nên được gọi là phương sách cuối cùng - nếu nhà máy đột nhiên hết các đối tượng miễn phí và quên mất Hủy vĩnh viễn - mọi thứ đã tạo nên được sử dụng lại.

    Áp dụng pháp luật trong thực tế

    (phần này bao gồm quá trình lập luận khi tạo trò chơi và các tính năng của nó)

    Mức độ rõ ràng cần phải xoay và di chuyển.
    Hãy làm cho cuộc sống của chúng ta dễ dàng hơn mãi mãi bằng cách đặt trục quay của mức - máy bay - tại gốc tọa độ. Bây giờ chúng ta có thể tính khoảng cách từ một điểm đến nó bằng cách tính độ dài của vectơ tọa độ của điểm đó. Một chuyện vặt vãnh, nhưng tốt đẹp.
    Chuyển động hợp tác của các đối tượng được thực hiện dễ dàng thông qua hệ thống phân cấp đối tượng trong Unity vì con cái là một phần của cha mẹ. Ví dụ, cấu trúc mức được mô tả được thực hiện một cách hợp lý như sau:
    - Trục quay
    - - Cấp độ
    - - - Phân đoạn 1
    - - - - Khối 1 (Máy va chạm)
    - - - - ...
    - - - - Khối N
    - - - Phân đoạn 2 ...
    - - - Phân đoạn 3 ...
    - - - Phân đoạn 4 ...
    (Bạn thậm chí có thể làm mà không cần đối tượng cấp)

    Tập lệnh trên trục nhận dữ liệu từ con quay hồi chuyển và đặt góc thích hợp cho nó ... Và nó ngay lập tức vi phạm nhiều quy tắc, bởi vì chuyển động quay sẽ được chuyển qua hệ thống phân cấp cho các máy va chạm, điều này sẽ khiến động cơ vật lý phát điên. Bạn sẽ phải làm cho trục trở thành một vật cứng và xoay nó theo phương pháp thích hợp. Nhưng những gì về chuyển động cấp độ? Rõ ràng, trục quay và đối tượng cấp sẽ không di chuyển, mỗi phân đoạn phải được di chuyển riêng lẻ, nếu không chúng ta phải đối mặt với vấn đề vô cực. Điều này có nghĩa là các phân đoạn phải là các phần cứng. Nhưng chúng ta đã có một cơ thể cứng nhắc cao hơn trong hệ thống cấp bậc và một cơ thể cứng nhắc không thể là một phần của một cơ thể cứng nhắc. Một hệ thống phân cấp hợp lý và thanh lịch không phù hợp, mọi thứ sẽ phải được thực hiện bằng tay - cả quay và dịch, mà không sử dụng một đối tượng cho trục quay. Hãy chuẩn bị cho điều này nếu bạn có các tính năng chơi trò chơi độc đáo.

    Nếu bạn vẫn phải di chuyển các phân đoạn trực tiếp, thì bạn sẽ phải xoay chúng. Khó khăn chính là trong công cụ vật lý Unity không có phương pháp "xoay một đối tượng xung quanh một điểm tùy ý" (Transform có nó, nhưng đừng bị cám dỗ). Chỉ có "xoay quanh trung tâm của nó." Điều này là hợp lý, bởi vì quay quanh một trục tùy ý là cả quay và chuyển động cùng một lúc, và đây là hai hoạt động khác nhau. Nhưng nó có thể được bắt chước. Đầu tiên, chúng tôi xoay phân đoạn xung quanh trục của chính nó, sau đó chúng tôi xoay tọa độ của “trục riêng” xung quanh máy bay. Do thực tế là chúng ta có mặt phẳng tại điểm gốc, bạn thậm chí không cần phải nhớ hình học của trường và truy cập vào Wikipedia, Unity đã có tất cả mọi thứ. Nó đủ để chuyển đổi góc quay thành một bậc bốn và nhân nó với tọa độ của điểm. Nhân tiện, tôi phát hiện ra điều này ngay tại thời điểm viết bài, trước đó một ma trận xoay đã được sử dụng.

    Chúng ta có kẻ thù đẩy máy bay vào tường, hy vọng giết được. Có một tấm chắn đẩy máy bay khỏi các bức tường, giúp sống sót. Điều này được thực hiện ít - có một vectơ bù đắp, được thêm vào tọa độ của mỗi đoạn trong mỗi khung hình và đặt lại sau đó. Bất cứ ai muốn đá máy bay, thông qua một phương pháp đặc biệt, có thể để lại véc tơ của cú đá của mình, véc tơ này sẽ được thêm vào véc tơ dịch chuyển này.

    Cuối cùng, tọa độ thực của phân đoạn, mỗi khung hình, được tính toán bởi trung tâm điều khiển chuyển động của cấp giống như sau:
    Vị trí vector3 = phân đoạn.CachedRigidbody.position; Vector3 deltaPos = Time.deltaTime * Cài đặt Vector3.left *.Speed; segment.truePosition = Quaternion.Euler (0, 0, deltaAngle) * (position + deltaPos + movementOffset);
    Sau tất cả các tính toán và nạng cần thiết để làm việc với việc lắp ghép chính xác các phân đoạn trong quá trình tái tạo, segment.truePosition được gửi đến phương thức MovePosition của phần thân cứng của phân đoạn.

    kết luận

    Tất cả hoạt động nhanh như thế nào? Trên các flagship cũ - Nexus 5 và LG G2 - trò chơi bay ở tốc độ 60 FPS, với sự sụt giảm hầu như không đáng chú ý khi các máy va chạm mới được bật trong quá trình tạo phân khúc (điều này là không thể tránh khỏi và không thể tránh khỏi bằng bất kỳ cách nào) và đẩy sâu ra khỏi mặt đất (bạn có thể chất đống một số loại địa ngục, để đi xung quanh nó, nhưng bây giờ có sự cố ý vi phạm luật thứ ba). 40 FPS ổn định cho ra bất kỳ thiết bị nào có con quay hồi chuyển mà chúng tôi đã xem qua. Nếu không biết và tính đến tất cả các luật, hiệu suất, nói một cách nhẹ nhàng, không đạt yêu cầu và điện thoại quá nóng. Đến nỗi tôi đã nghĩ đến việc viết một công cụ chuyên dụng đơn giản của riêng mình cho vật lý 2d. May mắn thay, vật lý trong Unity hóa ra đủ linh hoạt để giải quyết tất cả các vấn đề và tạo ra một trò chơi độc đáo, chỉ với vài tuần thử nghiệm.

    Giờ đây, khi biết tất cả những cạm bẫy chính của engine vật lý Unity, bạn có thể nhanh chóng nhân bản trò chơi của chúng tôi, phá hủy ước mơ, cuộc sống và niềm tin của ba học sinh nghèo vào nhân loại. Tôi hy vọng bài viết này sẽ giúp bạn tiết kiệm nhiều thời gian trong tương lai và giúp bạn tìm ra những vi phạm không quá rõ ràng đối với các định luật vật lý hữu ích trong các dự án của bạn.

    Đọc tài liệu và thử nghiệm, ngay cả khi bạn sử dụng các công cụ đơn giản và trực quan.

    Những bài viết liên quan: