Làm cách nào để tôi truy cập lớp Unity từ Hoạt động Android?


7

Tôi đã thực hiện các lớp C # của riêng mình trong Unity. Làm cách nào tôi có thể truy cập chúng từ Hoạt động Android bắt đầu UnityPlayer?

Ví dụ : Tôi có một lớp C # được gọi testClasstrong Unity:

class testClass {
    public static string myString = "test string";
}

Từ hoạt động Android trong Java, tôi muốn truy cập một thành viên của lớp đó:

string str = testClass.myString;

Điều này có thể không? Nếu vậy thì thế nào? Có một cách khác để làm điều này? Cuối cùng, về cơ bản, tôi muốn liên lạc giữa hoạt động Android của mình và đối tượng UnityPlayer.


Chỉnh sửa : Tôi tìm thấy một giải pháp.

Tôi đã xem xét việc xây dựng các plugin Android cho Unity nhưng điều này không thỏa đáng với tôi.

Tôi đã kết thúc việc xây dựng giao diện máy khách-máy chủ ổ cắm trong Unity với C # và một giao diện khác trong Java cho ứng dụng Android: Unity lắng nghe trên cổng X và phát trên cổng Y. Hoạt động của Android lắng nghe trên cổng Y và phát trên cổng X. Đây là cần thiết vì cả hai giao diện đang chạy trên cùng một máy chủ.

Vì vậy, đó là cách tôi giải quyết vấn đề của mình, nhưng tôi sẵn sàng cho mọi đề xuất nếu có ai biết cách giao tiếp tốt hơn giữa Unityplayer và ứng dụng của bạn.


2
Bạn nên đăng bit cuối cùng với giải pháp bạn tìm thấy như một câu trả lời. (Điều đó hoàn toàn tốt, thậm chí còn khuyến khích bạn trả lời các câu hỏi của riêng bạn.)
Anko

Câu trả lời:


1

Mức độ truy cập mà bạn đang mong đợi có thể hoặc không thể thực hiện được. Tuy nhiên, có một chức năng gọi lại đơn giản được thiết kế để gửi tin nhắn từ các plugin gốc trở lại Unity: UnitySendMessage (). Điều đó sẽ gọi phương thức được đặt tên trên đối tượng được đặt tên; nói cách khác, bạn cần phải có một đối tượng với phương thức mong muốn trong cảnh và sau đó plugin của bạn có thể gọi đó. Thông thường, hầu hết các plugin tạo một đối tượng trống với DontDestroyOnLoad và một loạt các cuộc gọi lại.

Ví dụ: tìm chức năng đó được giải thích trên trang này http://docs.unity3d.com/Manual/PluginsForIOS.html

Lưu ý rằng trang đó là về iOS chứ không phải Android. Tuy nhiên, nó hoạt động theo cách tương tự trong Android; để gọi UnitySendMessage () từ mã Java, bạn phải bao gồm tệp Unity. Nhập khẩu đó được giải thích trên trang này; cuộn toàn bộ xuống "Mở rộng UnityPlayerActivity" http://docs.unity3d.com/Manual/PluginsForAndroid.html

và một trang khác giải thích lệnh đó http://forum.unity3d.com/threads/android-plugin-call-c-from-java.78598/


0

Nếu bạn chỉ muốn truy cập giá trị của biến thành viên của bất kỳ lớp thống nhất nào hoặc muốn gọi một phương thức của lớp Unity từ hoạt động Android, bạn luôn có thể sử dụng JNI cho việc này. Bạn cũng sẽ cần phải tạo giao diện C ++ giữa chúng (Dunno nếu nó có thể được thực hiện mà không có giao diện C ++, nhưng tôi tin rằng điều đó là bắt buộc).

Kiểm tra liên kết này cho một giải pháp nhanh chóng.


Tôi thực sự đã chơi với ikvm một chút để xem những gì tôi có thể đạt được ở đó, nó hoàn toàn giống với khái niệm ngược lại, nó tạo ra một dll từ một cái bình và cũng có thể tạo ra các lọ từ các cụm .net. Công cụ tuyệt vời và nó hoạt động 100% trong một ứng dụng .net bình thường, nhưng khi được sử dụng trong Unity, nó sẽ đưa ra một số ngoại lệ java ngăn bạn xuất dự án của mình mặc dù các ngoại lệ không ngăn nó hoạt động. Nếu tôi có thể đi xung quanh nó thì nó sẽ hoàn hảo. Tôi không thể xử lý các trường hợp ngoại lệ trên toàn cầu do thực tế là chúng xảy ra trong bình / dll được bọc
Bất thường

Đoàn kết không bao giờ dừng lại khi có bất kỳ ngoại lệ nào trong bất kỳ kịch bản nào. Nó sẽ chỉ bỏ qua phần còn lại của mã trong cùng một khung và sẽ tiếp tục. Tôi cho rằng có thể có một số lệnh gọi API không được hỗ trợ trong công cụ. Tuy nhiên, một cuộc gọi JNI thô được đảm bảo hoạt động vì nó được sử dụng trong nhiều plugin Android. Hãy thử một phương pháp đơn giản để gọi trước, nếu phù hợp với nhu cầu của bạn hay không.
noob

0

Theo như tôi biết, các lớp C # bên trong Unity sẽ không thể truy cập trực tiếp từ bên ngoài (tức là trong Hoạt động của bạn). Bạn có thể sử dụng hàm UnitySendMessage, nhưng đây là một hàm tương đối đơn giản với một số hạn chế nghiêm ngặt về nó (chẳng hạn như bạn chỉ có thể gửi 1 tham số và đó sẽ là một chuỗi). Nếu bạn cần phải làm một cái gì đó phức tạp hơn, thì phương pháp tạo kết nối cục bộ của bạn chắc chắn không phải là một điều xấu.

Khả năng khác là gửi tin nhắn đến ứng dụng Unity rằng dữ liệu có sẵn và sau đó có truy vấn mã C # vào mã Android để nhận các giá trị. Ví dụ: nếu bạn nhận được mua hàng trong ứng dụng, bạn có thể có tín hiệu Hoạt động Android đến ứng dụng C # có sự kiện mua hàng trong ứng dụng mới xảy ra và sau đó mã C # có thể truy vấn vào hoạt động Android để nhận kết quả của việc mua hàng. Nói chung, đây là cách tôi thiết lập mã của mình.

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.