2017-11-04 5 views
1

jpeg로 인코딩 한 텍스처를로드하고 클라이언트에서 내 서버로 바이트 배열로 직렬화/전송 한 다음 텍스처를 직렬화 해제 및 적용하려고합니다. 인스턴스화 된 조립식 모든 것이 제가 조립식에 텍스쳐를 적용하려고 할 때를 제외하고는 효과가있는 것 같습니다. 나는 오류 받고 있어요 :프로그래밍 방식으로 텍스처를 읽을 수있게 만드는 방법

UnityException: Texture 'deer' is not readable, the texture memory can not be accessed from scripts. You can make the texture readable in the Texture Import Settings. Player_Data+c__Iterator0.MoveNext() (at Assets/_Scripts/Player/Player_Data.cs:82) UnityEngine.SetupCoroutine.InvokeMoveNext (IEnumerator enumerator, IntPtr returnValueAddress) (at C:/buildslave/unity/build/Runtime/Export/Coroutines.cs:17) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) Player_Data:PrepareServerData(String) (at Assets/_Scripts/Player/Player_Data.cs:56) PaintCraft.Controllers.c__Iterator2:MoveNext() (at 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; 
    } 

답변

0

이미지의 읽기/쓰기 가능 플래그를 ' 가져 오기 설정.

Settings

나는 당신이 편집기 스크립트 작성하지 않는 한, 코드에서이 작업을 수행 할 수 있다고 생각하지 않습니다 (단지 편집기에서 작동 게시하지 않을 경우).

+0

어떻게하면 프로그래밍 방식으로 프리 패브릭의 텍스처로 jpeg로 인코딩 된 텍스처를로드 할 수 있습니까? 나는 네트워크를 통해 신속하게 보낼 수 있도록 jpg로 텍스처를 인코딩해야했습니다. – greyBow

+0

그는 편집인이 아닌 코드에서 질문했습니다. @greyBow 복제본보기 – Programmer

+0

@programmer 다른 스레드를 살펴 보았습니다. 뭔가를 놓치지 않았다면 여전히이 중복 텍스처를 가져 와서 파일 크기를 줄이기 위해 jpg로 인코딩하는 방법을 설명하지 못합니다. 나는 다른 스레드가 만든 스크립트의 새로운 텍스처 인코딩을 시도했지만 여전히 같은 오류가 발생했습니다. 다른 방법으로 텍스처를 jpeg로 인코딩 한 다음 프로그래밍 방식으로 다시 읽을 수 있습니까? – greyBow