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としてエンコードするか説明していない限り、私は新しいテクスチャをエンコードしようとしましたが、他のスレッドのスクリプトが作成しましたが、まだ同じエラーがあります。テクスチャをエンコードしてプログラムで読み込む方法はありますか? – greyBow

関連する問題