Unity - 取得Android手機中的圖檔來做為材質

  一般來說如果遊戲要使用Resources資料夾的東西,用Unity提供的API像是Resources.Load就可以了,如果在編輯器底下也可以用Resources.LoadAssetAtPath()之類的方法,這邊使用的是另一種取得外部檔案的方式,也就是讓Unity呼叫在Plugin裡面預先製作好的方法,在Android手機中去取得外部檔案並回傳給Unity,然後在Unity執行中即時使用這個檔案建立材質。



  首先在Android Plugin的Java檔案中建立一個方法,來取得外部檔案,並且轉換成byte後回傳,當然這個方法也可以給它輸入的參數,像是路徑的String等等,不過這邊就先寫死了。


JAVA Code
public byte[] GetTexture() {
    //假設我在SD卡的download資料夾下有張材質
    File filePath = new  File("/sdcard/download/test.jpg");

    //取得檔案並轉換成byte並回傳
    if(filePath.exists()) {
        Bitmap myBitmap = BitmapFactory.decodeFile(filePath.getAbsolutePath());
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        myBitmap.compress(Bitmap.CompressFormat.PNG, 100, output);
        byte[] result = output.toByteArray();
        return result;
    }
return null;
}

  Plugin內的方法做完重新build一次jar檔案後,之後就可以在Unity裡面呼叫這個方法使用,呼叫在Plugin裡面做好的方法GetTexture()並設定好回傳值,也就是byte[],確認有取得資料而不是空資料後建立一個Texture,然後把這個材質設定到物件上,就可以看到物件的材質改變了。


Unity C# Code
public GameObject obj;
void Start() {
    AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    AndroidJavaObject currentActivity = activityClass.GetStatic<androidjavaobject>("currentActivity");
    byte[] result = currentActivity.Call<byte[]>("GetTexture");
    if(result != null) {
        //測試的Text.jpg材質圖檔為256x256大小
        Texture2D tex = new Texture2D(256, 256);
        tex.LoadImage(result);
        //改變一個測試場景中物件的貼圖
        obj.renderer.material.mainTexture = tex;
    }
}

3 comments:

Ling Tze Hock said...

你好~Unity3D要调用android里的method,如果不用jar还有其他方法吗?因为我的andriod package里有用到许多图案和xml档案开发环境是android studio,那在这种情况下,要怎么解决呢? 求指导~~~~谢谢~~

VervProject said...

可以試著使用WWW來載入檔案,我做了個簡單的說明http://www.iverv.com/2015/12/unity-androidassetbundle-unityapi.html,但如果只是要呼叫某個編譯好的jar裡面的方法的話可以用AndroidJavaClass、AndroidJavaObject、AndroidJNI,來載入呼叫

Tre Tree said...

@Ling
可以輸出成.aar檔放入unity project任何地方

Post a Comment