Tại sao Unity trong chế độ 2d sử dụng tỷ lệ và kích thước bản đồ mặc định theo cách nó làm?


8

Trước đây tôi đã sử dụng SFML, XNA, Monogame, v.v. để tạo các trò chơi 2d, trong đó nếu tôi hiển thị một sprite 100px trên màn hình, nó sẽ chiếm 100px . Nếu tôi sử dụng gạch 128px để tạo nền, lát đầu tiên sẽ ở (0, 0) trong khi gạch thứ hai sẽ ở (128, 0).

Mặt khác, Unity có hệ thống đơn vị riêng của mình, chia tỷ lệ trên tất cả các biến đổi, pixel-to-unit, kích thước othographic, v.v., vì vậy, câu hỏi của tôi là hai lần, cụ thể là:

  1. Tại sao Unity có hệ thống này theo mặc định cho 2d? Có phải cho dev di động? Có một lợi ích lớn mà tôi không nhìn thấy?
  2. Làm cách nào tôi có thể thiết lập môi trường của mình, để nếu tôi có một sprite 128x128 trong Photoshop, nó sẽ hiển thị dưới dạng sprite 128x128 trong Unity khi tôi chạy trò chơi của mình?

Lưu ý rằng tôi đang nhắm mục tiêu độc quyền máy tính để bàn.


1
Tại sao điều này xảy ra là vì Unity là một công cụ 3D gần đây có đồ họa 2D được ghép vào. Cách xử lý mọi thứ tuy nhiên là điều tôi tò mò muốn xem câu trả lời, để xem liệu có ai khác có cách tiếp cận tốt hơn tôi không.
jhocking

Các chức năng GUI của Unity và thành phần GUITexture cho phép bạn vẽ họa tiết lên màn hình ở kích thước gốc, trực tiếp. docs.unity3d.com/Documentation/ScriptReference/GUI.html docs.unity3d.com/Documentation/Components/ class- GuiTexture.html Nếu bạn cần linh hoạt hơn, đặt cược tốt nhất của bạn là xác định tỷ lệ nhất quán - như 1U = 128px - và áp dụng nó một cách nhất quán cho tất cả các quads / spites / camera của bạn.
DMGregory

Tôi sẽ tránh lớp GUI của Unity; bởi vì GUI chế độ ngay lập tức trong Unity khá kém hiệu quả, họ đang xây dựng một hệ thống GUI mới (sắp phát hành trên thực tế, trong phiên bản 4.6).
jhocking

Câu trả lời:


4

Xử lý tọa độ 2D và chia tỷ lệ trong Unity khá đơn giản, nhưng không rõ ràng và như bạn đã nhận thấy nó không giống như cách các công cụ dev khác hoạt động. Tại sao điều này xảy ra là vì Unity là một công cụ 3D gần đây có đồ họa 2D được ghép vào.

Cụ thể, 1 đơn vị trong Unity không nhất thiết phải là 1 pixel trong ảnh. Khi bạn nhập hình ảnh dưới dạng 2D Sprites, thực tế có cài đặt Pixels-to-units có thể được thực hiện theo tỷ lệ 1: 1 nhưng tôi khuyên bạn nên để nó ở mặc định 100: 1 vì một vài lý do (công cụ vật lý không hoạt động ngay ở 1: 1 và mặc định là tốt hơn để tương thích với mã của người khác).

Cài đặt chia tỷ lệ này có nghĩa là tất cả các vị trí được chia cho 100. Nó khá dễ dàng miễn là bạn luôn nhớ tỷ lệ; Khi bạn muốn di chuyển một sprite 256 pixel (giả sử) thì bạn di chuyển nó 2.56 Bạn cũng có thể muốn viết một hàm tiện ích để làm tròn số đến 2 chữ số thập phân / pixel gần nhất: Mathf.Round (float * 100) / 100f


Đối với việc thiết lập một máy ảnh hoàn hảo pixel, trước hết hãy đặt nó làm máy ảnh chính tả. Khi bạn chọn máy ảnh, trong cài đặt của nó là trình đơn thả xuống cho phép chiếu phối cảnh hoặc Chính tả; phối cảnh có nghĩa là mọi thứ sẽ trông 3D, trong khi hình chính tả hiển thị cảnh phẳng. Ngay dưới phần thả xuống này là Kích thước; đặt kích thước chính tả của máy ảnh thành một nửa kích thước pixel của màn hình bạn muốn.

Ví dụ: giả sử bạn muốn có màn hình 1024x768 pixel hoàn hảo. Điều đó có nghĩa là chiều cao camera phải là 384 pixel. Chia cho 100 (vì tỷ lệ pixel-đơn vị) và bạn nhận được 3,84 cho kích thước máy ảnh. Một lần nữa, toán học đó chỉ đơn giản là SCREEN_SIZE / 2 / 100f


(Tôi đã chờ xem câu trả lời nào khác xuất hiện trước, nhưng đã được vài ngày. Tôi đã thực hiện 2D trong Unity một thời gian bằng Bộ công cụ 2D , nhưng còn khá mới đối với các tính năng 2D tích hợp)


2

Như jhocking nói, đó là kết quả của việc đánh giày 2D vào IDE 3D. Nhưng, có một giải pháp, đó chỉ là một chút phức tạp.

Bước đầu tiên là mở Cài đặt nhập của sprite của bạn từ ngăn Dự án. Khi Texture Type được đặt thành Sprite hoặc Advanced (Advanced cung cấp cho bạn các tùy chọn tiện dụng khác, nhưng Sprite được mặc định nếu bạn tạo dự án 2D ở đầu), có trường Pixels To Đơn vị với mặc định là 100.

Tôi đang tìm hiểu về hệ thống ô vuông, vì vậy tôi đang sử dụng các ô có kích thước 16x16 pixel và đặt Pixels thành Đơn vị thành 16. Toán học hoạt động như vậy: Kích thước tính bằng pixel (X hoặc Y) / Pixels To Đơn vị = Đơn vị đơn vị trong Biến đổi . Khối lập phương 16 pixel với PTU 16 chiếm 1 đơn vị trong không gian Unity.

Tôi chưa thử, nhưng tôi hy vọng PTU là 1 sẽ khiến mọi thứ trở nên hoàn hảo.

Tuy nhiên, cài đặt máy ảnh chính tả là một chút đau đầu. Một lần nữa, nó dựa trên cài đặt Pixels cho Đơn vị, nhưng cũng có một vài thứ khác. Về cơ bản, nó chỉ bằng một nửa chiều cao màn hình từ Cài đặt trình phát (ví dụ 1080, 768, cho dù iPhone 5 là gì, không thể bận tâm tìm kiếm nó) chia cho Pixels To Đơn vị.


1

Các đơn vị pixel không phải là một cách tốt để thể hiện các thế giới rộng lớn do cách các số dấu phẩy động hoạt động. Với số dấu phẩy động, bạn mất độ chính xác với số lượng rất lớn. Các số gần 0 có độ chính xác tốt nhất. Do đó, một số công cụ trò chơi có xu hướng thích hệ thống đo lường MKS (Mét / Kilôgam / giây). Unity mặc định là mét, vì vậy các nhân vật trong game có thể dễ dàng được biểu thị là cao 1,0-2 mét với độ chính xác rất tốt.

Cân nặng và chiều cao trung bình của một người đàn ông là khoảng 50kg và cao 1,8 mét. Nếu bạn cố gắng tạo một nhân vật cao 1200 pixel, trọng lượng của nó sẽ vào khoảng 33.000 pixel. Nếu sau đó bạn muốn thêm một vật thể rất nặng như xe buýt vào trò chơi, bạn sẽ có một số lượng lớn đơn vị pixel. Bạn có thể dễ dàng thấy làm thế nào điều này có thể dẫn đến các tính toán rất thiếu chính xác cho các va chạm.

Nếu bạn rất quyết tâm sử dụng đơn vị pixel, bạn có thể dễ dàng tính tỷ lệ pixel trên mét.


Nhưng tất cả những điều này không áp dụng cho hầu hết các game 2D mà hầu như không cần sử dụng vật lý. Vấn đề là Unity đề xuất hỗ trợ cho 2D nhưng nó rất thô sơ và đòi hỏi nhiều nghiên cứu để đơn giản hóa những gì bạn thực sự cần từ một công cụ 2D.
Kokodoko
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.