C # có khác nhau trong Unity không?


18

Unity có sử dụng phiên bản khác của C # không, hay tất cả đều giống nhau? Nó trông khác với C # thông thường nhưng có một số yếu tố C # thông thường trong đó.


4
Bạn thấy sự khác biệt nào?
Anko

Tôi nghi ngờ những thay đổi bạn đang đề cập là sự khác biệt về khung và không phải là ngôn ngữ C #. Trong Unity3d, bạn đang sử dụng khung .Net (Via Mono) và các thành phần khung cụ thể của Unity với ngôn ngữ C #.
Mike B

Nó chỉ là một phiên bản rất cũ. Nếu bạn muốn phiên bản mới nhất của C # và Mono và muốn lập trình thay vì kịch bản một công cụ được tạo sẵn, thì hãy xem xét một cái gì đó như monogame.net
Den

Tôi nhận thấy sự khác biệt nhỏ của thư viện, ví dụ trong Unity có lớp Mathf cho các hàm toán học, thay vì lớp Toán. Tôi đã không chú ý nếu có sự khác biệt khác, nhưng đó là điểm nổi bật.
Alex

@Alex System.Math vẫn khả dụng và dường như nhanh hơn UnityEngine.Mathf . Vì vậy, lý do thực sự duy nhất để sử dụng phiên bản Unity là để tránh nhiều phôi (float) .. với chi phí của một số hiệu suất.
FlintZA

Câu trả lời:


9

Như đã nêu trong các câu trả lời khác, Unity 4.x sử dụng phiên bản sửa đổi của Mono dựa trên Mono 2.6

Đối với hầu hết các phần, điều này tương thích với .Net 2.0 , mặc dù tôi không thể theo dõi danh sách tương thích cụ thể của Mono 2.6.

Nó trông khác với C # thông thường nhưng có một số yếu tố C # thông thường trong đó.

Như đã đề cập trong một trong những nhận xét về câu hỏi của bạn, điều này có thể là do API tập lệnh cụ thể của Unity chứ không phải do ngôn ngữ.

Ví dụ, rất nhiều mã trong các dự án Unity điển hình được chứa trong các lớp con của một lớp được gọi là MonoBehavior. Đây là những thành phần được loại bỏ trên GameObject trong môi trường Unity Editor. Kiến trúc này dẫn đến mã C # trông khác với mã C # điển hình (dù sao với tôi) theo một số cách:

  • Cho đến khi Unity 4 được phát hành, các đối tượng này không thể được chứa trong các không gian tên, vì vậy chúng luôn nằm trong không gian tên toàn cầu
  • Chúng hiển thị các trường cho môi trường trình soạn thảo bằng cách đặt chúng ở chế độ công khai (hoặc bằng cách sử dụng thuộc tính SerializeField, nhưng tôi thấy rất ít người sử dụng điều này), dẫn đến một số lượng lớn các trường công khai khác thường trên các lớp
  • Các quy ước về quyền riêng tư và trường hợp của Unity không tuân theo Microsoft, do đó, điều này cũng có thể lạ đối với nhà phát triển C # "truyền thống"
  • Họ sử dụng một số phương thức đặc biệt trên các thành phần này, chẳng hạn như Bắt đầu và Cập nhật, không bị ghi đè như người ta thường mong đợi, nhưng được truy cập bằng phương tiện phản chiếu thay thế.

Nói một cách thực tế, tính năng ngôn ngữ C # lớn nhất mà tôi bỏ lỡ trong phiên bản C # hiện tại của Unity là hỗ trợ cho async và các từ khóa và chức năng liên quan. Một khái niệm tương tự trong Unity là coroutines . Chúng thực thi trên luồng chính vì vậy không đồng bộ thực sự, nhưng không cho phép mã chạy dài bị phá vỡ trên nhiều khung. Đa luồng cấp thấp hơn vẫn được hỗ trợ.


2
Chỉ cần làm rõ, asynctrong C # cũng không đúng async như trong đa luồng - nó cũng chạy trên luồng chính. Sự khác biệt lớn nhất, từ góc độ sử dụng, giữa coroutines và async là thời gian mã được chạy.
rhughes

Cảm ơn. Yeah async! = Đa luồng, mặc dù tôi nói rằng việc sử dụng async để ẩn / tương tác với các hoạt động đa luồng sẽ phổ biến hơn nhiều so với việc thực hiện tương tự với coroutines. Tôi đã viết một coroutine bao bọc bắt đầu các nhiệm vụ đại biểu trên một luồng, điều này giúp tôi có mức độ linh hoạt rất giống nhau, nhưng tôi vẫn không ngại có hỗ trợ async "phù hợp". Tất nhiên một GC hiện đại đàng hoàng sẽ còn tốt hơn nữa;)
FlintZA 14/2/2016

21

Unity 4 sử dụng Mono 2.6 , đây là một triển khai đầy đủ của .NET framework, bao gồm cả ngôn ngữ C #.

Tôi không chắc nó trông khác nhau như thế nào, nhưng hãy nhớ rằng Unity hỗ trợ một số ngôn ngữ, tất cả đều hoạt động trên cùng một thời gian chạy Mono. Có thể bạn đang nhầm lẫn C # với UnityScript ?


10
Thêm vào đó, Mono 2.6 tương đương với C # 3.0 về các tính năng ngôn ngữ. Mono 2.6.1 bắt đầu thêm các tính năng C # 4.0.
Cooper

Dưới đây là một tổng quan đẹp về Khả năng tương thích Mono của Unity kể từ phiên bản 4.1.2
Kelly Thomas

Nó không chỉ tăng nhẹ mà còn tăng phiên bản chính: mono-project.com/Release_Notes_Mono_3.4
Den

3

Unity sử dụng C # thường xuyên.

Sau đó, một lần nữa, khi bạn viết C # trong Unity, bạn sẽ sử dụng rất nhiều thư viện của họ, nhưng theo tôi biết, mọi thứ có thể có trong C # đều có thể có trong Unity, ngoài những khác biệt được liệt kê bên dưới:

  • Các khu vực cụ thể khác của .Net liên quan đến Windows Forms & ASP bị giới hạn thông qua Unity.

  • Mặc dù bạn có thể sử dụng Visual Studio để chỉnh sửa và biên dịch lỗi thời gian, bạn phải xây dựng và chạy trong Unity IDE.

  • Unity sử dụng Mono, một triển khai mã nguồn mở của .Net, có nghĩa là có một số khác biệt nhỏ.


Để mở rộng trên viên đạn thứ hai của bạn - bạn cũng có thể gỡ lỗi trong Visual Studio bằng cách sử dụng UnityVS . Microsoft gần đây đã mua lại các nhà phát triển để họ sẽ phát hành plugin miễn phí trong tương lai gần.
mrohlf

Xin lỗi nhưng nó không ở đâu gần C # thông thường.
Alper

0

Câu hỏi liệu Phiên bản C # được Unity sử dụng có khác với C # "thông thường" đã được trả lời bởi các bài đăng khác không. Kể từ khi bạn đang yêu cầu một cách rõ ràng cho một số yếu tố mà có thể khác nhau từ một phiên bản thường xuyên như vậy tôi sẽ chia sẻ chỉ khác biệt nhỏ, tôi nhận thấy khi so sánh việc sử dụng C # tôi tại nơi làm việc (ví dụ: C # 4.0 trong Visual Studio 2010 và cao hơn) và C # trong Unity, mà là tôi không thể sử dụng các giá trị mặc định cho các tham số trong định nghĩa hàm. đó là bạn phải thiết lập dự án của mình cẩn thận hơn để sử dụng phiên bản C # mới hơn. Xem liên kết này để giải thích thêm.

Chỉnh sửa: Tôi để lại câu trả lời này vì theo tôi biết đây là một sự hiểu lầm xảy ra với khá nhiều người.


Vì tính năng đó chỉ được thêm vào C # trong phiên bản 4.0 và không có mặt trước đó, nên sự vắng mặt của nó thực sự không thể được gọi là "sự khác biệt" so với "C #".
HOẶC Mapper

1
Phiên bản C # 4 được phát hành vào năm 2010. Tôi nghĩ rằng rất nhiều người đang sử dụng nó và cảm thấy, giống như tôi, sự vắng mặt của nó khi lập trình trong Unity.
Nessuno

Bạn có chắc chắn không thể sử dụng các giá trị mặc định? Tôi khá chắc chắn rằng tôi làm và có ...
NPSF3000

Tôi đã thử và nó sẽ không biên dịch với một thông báo cho tôi biết rằng tôi không thể sử dụng các giá trị mặc định. Bạn có đang sử dụng phiên bản đặc biệt của Unity không? Giống như phiên bản pro?
Nessuno

1
Bạn hoàn toàn có thể sử dụng các giá trị mặc định và không có gì để làm với pro hoặc không pro. Unity và MonoDevelop có mối quan hệ kỳ lạ. Các dự án được tạo tự động trong MonoDevelop thường được đặt thành các phiên bản C # trước đó không hỗ trợ các giá trị mặc định. Tuy nhiên nếu bạn thay đổi cài đặt đó trong dự án, nó sẽ hoạt động tốt. Nếu bạn bỏ qua quá trình biên dịch trong MonoDevelop và chỉ cần quay lại Unity, bạn sẽ lưu ý rằng Unity không phàn nàn về các tham số mặc định.
MrCranky
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.