Unity Resources.load () не будет работать с внешними DLL - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь загрузить ресурс с помощью Resources.load (), но он всегда возвращает ноль.

Вот моя структура папок: https://imgur.com/a/z8KObW1

Когда я использую Resources.load() в моем проекте единства, это работает без проблем.Но когда я создаю отдельный проект в visual studio с помощью библиотеки unityengine dll и использую Resources.load () в одном из файлов .cs в папке Source, он всегда возвращает null, независимо от того, что я пытаюсь.

Когда я поместил папку «Ресурсы» в папку «Исходный код», она вернула значение «ноль», а когда я поместил файлы .cs в папку «Активы», он также вернул значение «ноль».Я не могу понять, почему.Я также попытался извлечь путь, с которого начинается Resources.load (), но я не могу понять это.Это начинается с .dll или из .cs файла в Source?

public static void Create_Manager() {
    GameObject networkManagerObj = new GameObject();
    networkManagerObj.name = "_NetworkManager";
    networkManager = networkManagerObj.AddComponent<NetworkManager>();

    networkManager.playerPrefab = Resources.Load("Player") as GameObject;

    networkManager.dontDestroyOnLoad = true;
    networkManager.runInBackground = true;
    networkManager.autoCreatePlayer = true;
}  

Все, что мне нужно, это чтобы Resources.load () работал с моим отдельным проектом / dll.Кто-нибудь знает, как это сделать?

1 Ответ

0 голосов
/ 31 декабря 2018

Вот код, который мой коллега написал и объяснил мне.Я опустил много кода, который имел дело с тем, для чего этот класс (обработка сенсорного ввода), оставив только разделы, связанные с загрузкой изображения (используется для отображения точки касания на экране).

using System;
using System.IO;
using System.Linq;
using System.Reflection;

using UnityEngine;

using HedgehogTeam.EasyTouch;

namespace TouchControls
{
    /// <summary>Helper to control touch-based input.</summary>
    public static class Utility
    {
        const string imageNamespace = "TouchControls.";
        const string imageResourceFolder = "TouchControls/Images/";

        /// <summary>Static helper to contain texture resources.</summary>
        public static class Texture
        {
            /// <summary>The texture used to represent a second finger when simulating touches.</summary>
            public static Texture2D SecondFinger
            {
                get
                {
                    if (null == secondFinger)
                        secondFinger = LoadImage(secondFingerFilename);

                    return secondFinger;
                }
            }
            static Texture2D secondFinger = null;
            const string secondFingerFilename = "secondFinger.png";
        }

        static Assembly ExecutingAssembly
        {
            get
            {
                if (null == executingAssembly)
                {
                    executingAssembly = Assembly.GetExecutingAssembly();
                }
                return executingAssembly;
            }
        }
        static Assembly executingAssembly = null;
        static Stream GetImageStream(string imageName) { return ExecutingAssembly.GetManifestResourceStream(imageName); }

        static Texture2D LoadImage(string filename, TextureWrapMode wrapMode = TextureWrapMode.Clamp, FilterMode filterMode = FilterMode.Bilinear, bool useMipMaps = true, TextureFormat format = TextureFormat.ARGB32)
        {
            Texture2D texture = Resources.Load<Texture2D>(imageResourceFolder + Path.GetFileNameWithoutExtension(!string.IsNullOrEmpty(filename) ? filename : string.Empty));
            try
            {
                // Didn't find it in resources in the project so try to find it in the library manifest....
                if (null == texture)
                {
                    using (Stream stream = GetImageStream(imageNamespace + filename))
                    {
                        texture = new Texture2D(0, 0, format, useMipMaps);
                        if (!texture.LoadImage(GetImageBuffer(stream)))
                            throw new NotSupportedException(filename);

                        texture.wrapMode = wrapMode;
                        texture.filterMode = filterMode;
                    }
                }
                else // ensure it is read/write enabled...
                {
                    Texture2D invertedTexture = new Texture2D(texture.width, texture.height, texture.format, 1 < texture.mipmapCount);
                    invertedTexture.SetPixels32(texture.GetPixels32());
                    invertedTexture.Apply(true);
                    texture = invertedTexture;
                }
            }
            catch
            {
                // Something went wrong so make a magenta 4 pixel texture.
                texture = new Texture2D(2, 2, TextureFormat.ARGB32, false);
                texture.SetPixels(0, 0, 2, 2, Enumerable.Repeat(Color.magenta, 4).ToArray());
            }
            texture.Apply(true);

            return texture;
        }

        static byte[] GetImageBuffer(Stream stream)
        {
            stream.Seek(0, SeekOrigin.Begin);
            byte[] buffer = new byte[stream.Length];
            stream.Read(buffer, 0, (int)stream.Length);

            return buffer;
        }
    }
}

Сначала он пытается загрузить изображение из папки «Ресурсы» (как вы знакомы) в заданном месте: это позволяет при желании переопределить изображение локальным проектом.Если это изображение не найдено, оно загружает одно из DLL.Я не уверен, где находится это изображение, но поскольку ссылка на путь находится в коде, я уверен, что он работает достаточно разумно (ключевая часть, которую он сообщил мне, была как , чтобы гарантировать, что файлвключается в DLL, а не , где он был расположен).

Важным блоком для его загрузки из DLL является этот раздел:

static Stream GetImageStream(string imageName) { return ExecutingAssembly.GetManifestResourceStream(imageName); }
//...
using (Stream stream = GetImageStream(imageNamespace + filename))
{
    texture = new Texture2D(0, 0, format, useMipMaps);
    if (!texture.LoadImage(GetImageBuffer(stream)))
        throw new NotSupportedException(filename);

    texture.wrapMode = wrapMode;
    texture.filterMode = filterMode;
}
//...
texture.Apply(true);

return texture;
...