【发布时间】: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