【问题标题】:How do I make a texture readable programmatically [duplicate]如何以编程方式使纹理可读[重复]
【发布时间】:2017-11-04 00:05:33
【问题描述】:

我正在尝试将我正在编码的纹理加载到 jpeg,然后作为字节数组从客户端序列化/发送到我的服务器,然后反序列化并将纹理应用到实例化的预制件。一切似乎都在工作,除了最后当我试图将纹理应用到我的预制件时。我收到了错误:

UnityException:纹理“鹿”不可读,无法从脚本访问纹理内存。您可以在纹理导入设置中使纹理可读。 Player_Data+c__Iterator0.MoveNext () (在 Assets/_Scripts/Player/Player_Data.cs:82) UnityEngine.SetupCoroutine.InvokeMoveNext (IEnumerator enumerator, IntPtr returnValueAddress) (在 C:/buildslave/unity/build/Runtime/Export/Coroutines.cs:17) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) Player_Data:PrepareServerData(String) (在 Assets/_Scripts/Player/Player_Data.cs:56) PaintCraft.Controllers.c__Iterator2:MoveNext()(在 Assets/_Scripts/ColoringBook/CanvasController.cs:221)

我知道我可以在统一编辑器中使其可读,但由于我在运行时完成所有这些,我该如何完成呢?

将纹理转换为 jpg

IEnumerator DoGetTexToBytes(Texture2D tex)
    {
        playerObj.texBytes = tex.EncodeToJPG(50);
        yield return new WaitForEndOfFrame();
    }

将所有玩家对象数据组装成字节数组(包括纹理)

public void PrepareServerData(Texture2D texToSend, string typeToSend)
    {
        StartCoroutine(DoGetTexToBytes(texToSend));

        playerObj.texWidth = texToSend.width;
        playerObj.texHeight = texToSend.height;
        playerObj.texFormat = texToSend.format;
        playerObj.tranX = tran.x;
        playerObj.tranY = tran.y;
        playerObj.tranZ = tran.z;
        playerObj.type = typeToSend;
        Player_ID id = GetComponent<Player_ID>();
        playerObj.id = id.MakeUniqueIdentity();
        playerObj.strength = strengthToSend;
        playerObj.hitpoints = hitPointsToSend;

        Network_Serializer serialize = GetComponent<Network_Serializer>();

        // Send Data from Client to Server as many small sequenced packets
        byte[] bytes = serialize.ObjectToByteArray(playerObj);

        StartCoroutine(Network_Transmitter.instance.DoSendBytes(0, bytes));
    }

发送字节,在服务器上接收,然后用纹理实例化一个预制件:

[Server]
    public void InstantiatePlayerOnServer(PlayerObject playerObj)
    {
        GameObject go = Instantiate(Player_Controller.instance.serverAvatar, new Vector3(playerObj.tranX, playerObj.tranY, playerObj.tranZ), Quaternion.identity) as GameObject;

        // go.transform.parent = GameObject.FindGameObjectWithTag("Player").transform;

        StartCoroutine(DoLoadRawTextureData(go, playerObj.texBytes, playerObj.texWidth, playerObj.texHeight, playerObj.texFormat));
    }

    [Server]
    IEnumerator DoLoadRawTextureData(GameObject go, byte[] texBytes, int texWidth, int texHeight, TextureFormat texFormat)
    {
        Texture2D tex = new Texture2D(texWidth, texHeight, texFormat, false);
        tex.LoadRawTextureData(texBytes);
        tex.Apply();
        yield return new WaitForEndOfFrame();
        go.GetComponent<Renderer>().material.mainTexture = tex;
    }

【问题讨论】:

    标签: c# unity3d networking textures jpeg


    【解决方案1】:

    您需要在图像的导入设置中设置读/写启用标志。

    我认为你不能从代码中做到这一点,除非你正在编写一个编辑器脚本(它只在编辑器中工作,而不是在发布时)。

    【讨论】:

    • 那么如何以编程方式加载使用编码为 jpeg 的纹理作为预制件上的纹理?我必须将我的纹理编码为 jpg,以便我可以通过网络快速发送它。
    • 他从代码而不是从编辑器中询问。 @greyBow 查看副本
    • @programmer 我查看了另一个线程,除非我错过了什么,否则它仍然没有解释如何获取这个重复的纹理并将其编码为 jpg 以减小文件大小。我尝试对另一个线程中的脚本创建的新纹理进行编码,但我仍然遇到相同的错误是否有任何其他方法可以将纹理编码为 jpeg,然后以编程方式将其读回?
    • @greyBow 如果您无法将“编辑”添加到您的问题中并添加您从副本中所做的事情以及您仍然遇到“可读”问题的地方,那么就无法为您提供帮助。我们最终都会浪费时间。
    猜你喜欢
    • 2018-08-15
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 2020-07-06
    • 2015-03-30
    相关资源
    最近更新 更多