Как я могу использовать код C # в Unity для работы на мобильном телефоне? - PullRequest
1 голос
/ 09 марта 2019

Я написал кусок кода C # для работы на мобильных устройствах в Unity. Я тестировал на веб-камере, и она отлично работала.

Однако, когда я собрал его как APK, он не работал на моем мобильном устройстве, и проблема явно в коде C #. Я не знаком с мобильной средой и не совсем уверен, что код C # может выполняться на устройствах Android, но я думал, что Unity справится с этим.

Должен ли я в принципе признать, что C # не может быть запущен на мобильных устройствах или есть решение?

Вот мой кусок кода:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;


public class MenuScript : MonoBehaviour {

    Texture2D screenCap;
    Texture2D border;
    bool shot = false;
    public Button m_YourFirstButton;

    // Use this for initialization
    void Start () {

        screenCap = new Texture2D(300, 200, TextureFormat.RGB24, false); // 1
        border = new Texture2D(2, 2, TextureFormat.ARGB32, false); // 2
        border.Apply();
        m_YourFirstButton.onClick.AddListener(TaskOnClick);
    }

    // Update is called once per frame
    void Update () {
    }

    public void TaskOnClick()
    {
        StartCoroutine("Capture");
    }

    void OnGUI()
    {
        GUI.DrawTexture(new Rect(200, 100, 300, 2), border, ScaleMode.StretchToFill); // Top
        GUI.DrawTexture(new Rect(200, 300, 300, 2), border, ScaleMode.StretchToFill); // Bottom
        GUI.DrawTexture(new Rect(200, 100, 2, 200), border, ScaleMode.StretchToFill); // Left
        GUI.DrawTexture(new Rect(500, 100, 2, 200), border, ScaleMode.StretchToFill); // Right

        if (shot)
        {
            GUI.DrawTexture(new Rect(10, 10, 60, 40), screenCap, ScaleMode.StretchToFill);
        }
    }

    IEnumerator Capture()
    {
        yield return new WaitForEndOfFrame();
        screenCap.ReadPixels(new Rect(198, 98, 298, 198), 0, 0);
        screenCap.Apply();
        byte[] bytes = screenCap.EncodeToPNG();
        //Object.Destroy(screenCap);

        // For testing purposes, also write to a file in the project folder
        File.WriteAllBytes(Application.dataPath + "/SavedScreen.png", bytes);
        shot = true;
    }

}

Ответы [ 2 ]

2 голосов
/ 09 марта 2019

Я предполагаю, что вы написали этот код в Unity, и он работает в редакторе. Ваше утверждение проблемы довольно странно, поэтому мне пришлось принять это.

Причина, по которой это не работает в мобильном телефоне, наиболее вероятна, потому что вы используете Application.dataPath. Это не должно использоваться для Android. Наиболее очевидная причина для этого - разрешения Android, и она, вероятно, не позволит вам записывать на SD-карту или во внутреннюю память. Также у вас, скорее всего, есть UnauthorizedAccessException.

Чтобы проверить, что не так с вашей сборкой на Android, вы должны использовать logcat. Когда ваше устройство подключено к ПК с помощью кабеля, откройте командную строку для доступа к папке, содержащей adb.exe, а затем используйте эту команду: adb.exe logcat -s Unity.

Затем запустите APK на мобильном устройстве. Это покажет вам все ваши Debug.Log казни и все ваши исключения. Затем вы можете отладить свой код.

Для получения дополнительной информации о файлах журналов вы можете обратиться к здесь

Удачи!

0 голосов
/ 09 марта 2019

Библиотека .NET, которую использует Unity, является старым подмножеством .NET. Дополнительная информация: Почему Unity использует .NET 2.0, когда Mono поддерживает .NET 3.5?

Вы можете изменить версию .NET, которую использует Unity, но тогда она не будет работать на мобильных устройствах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...