2017-03-01 156 views
0

我想在運行時將精靈的二維數組變成一個精靈圖像。所有的精靈都是正方形的,大小完全相同,但由於陣列的寬度和高度可能會有所不同,因此生成的圖像不一定需要爲正方形。Unity2D組合精靈

我還沒有發現這個資源:Combine Array of Sprite objects into One Sprite - Unity

但我不認爲它適合我的目的。

+0

如果有任何答案都不能解決您的問題,請考慮接受它是正確的。 _(接受答案有助於未來的訪客進入本頁)_ – Kardux

回答

0

如果你在你的項目已經可以簡單地編輯自己的進口設置高級和檢查讀那些精靈/寫使能切換。

那麼你應該能夠讀取你的精靈內容並將其合併這樣的:

public Sprite CombineSpriteArray(Sprite[][] spritesArray) 
{ 
    // Set those two or get them from one the the sprites you want to combine 
    int spritesWidth = (int)spritesArray[0][0].rect.width; 
    int spritesHeight = (int)spritesArray[0][0].rect.height; 

    Texture2D combinedTexture = new Texture2D(spritesWidth * spritesArray.Length, spritesHeight * spritesArray[0].Length); 

    for(int x = 0; x < spritesArray.Length; x++) 
    { 
     for(int y = 0; y < spritesArray[0].Length; y++) 
     { 
      combinedTexture.SetPixels(x * spritesArray.Length, y * spritesArray[0].Length, spritesWidth, spritesHeight, spritesArray[x][y].texture.GetPixels((int)spritesArray[x][y].textureRect.x, (int)spritesArray[x][y].textureRect.y, (int)spritesArray[x][y].textureRect.width, (int)spritesArray[x][y].textureRect.height)); 
      // For a working script, use: 
      // combinedTexture.SetPixels32(x * spritesWidth, y * spritesHeight, spritesWidth, spritesHeight, spritesArray[x][y].texture.GetPixels32()); 
     } 
    } 
    combinedTexture.Apply(); 

    return Sprite.Create(combinedTexture, new Rect(0.0f, 0.0f, combinedTexture.width, combinedTexture.height), new Vector2(0.5f, 0.5f), 100.0f); 
} 

警告:未測試的代碼

要知道,這樣的操作是沉重和異步做在協同程序中可能是避免凍結的一個好主意。


編輯:

因爲你似乎新的堆棧溢出,請記住它不是提供服務的腳本,人們來這裏是爲了幫助對方:這意味着提供的代碼不會永遠是完美的,但可能只是引導你到正確的道路(這也是爲什麼我加了「警告:代碼未經測試」後我的代碼)。

你聲稱代碼「完全破碎」並且「在所有地方輸出錯誤」。我寫了一小塊腳本的測試腳本和我唯一的錯誤是一個(同意它的彈起多次):所以,在谷歌搜索之後

(你應該什麼)我注意到有GetPixels32()/SetPixels32()方法也可以用來代替GetPixels()/SetPixels()(這裏是顯示這種方法的3rd5th結果)。通過簡單地改變這一點,代碼現在完美無缺地工作。

我得到的唯一問題是精靈在紋理的左下方堆積在一起:我對此不好,我犯了一個小錯誤。不難發現其中:只是改變
x * spritesArray.Length, y * spritesArray[0].Length, ...

x * spritesWidth, y * spritesHeight, ...
SetPixels方法內。

所以請發現整個測試腳本我寫的,感覺自由地使用它:

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 

public class TestScript : MonoBehaviour 
{ 
    public Image m_DisplayImage; 
    public Sprite m_Sprite1, m_Sprite2; 

    void Update() 
    { 
     if (Input.GetKeyDown(KeyCode.Space)) 
     { 
      StartCoroutine(CombineSpritesCoroutine()); 
     } 
    } 

    private IEnumerator CombineSpritesCoroutine() 
    { 
     Sprite[][] spritesToCombine = new Sprite[4][]; 
     for (int i = 0; i < spritesToCombine.Length; i++) 
     { 
      spritesToCombine[i] = new Sprite[4]; 
     } 

     for (int x = 0; x < spritesToCombine.Length; x++) 
     { 
      for (int y = 0; y < spritesToCombine[x].Length; y++) 
      { 
       spritesToCombine[x][y] = ((x + y) % 2 == 0 ? m_Sprite1 : m_Sprite2); 
      } 
     } 

     Sprite finalSprite = null; 
     yield return finalSprite = CombineSpriteArray(spritesToCombine); 

     m_DisplayImage.sprite = finalSprite; 
    } 

    public Sprite CombineSpriteArray(Sprite[][] spritesArray) 
    { 
     // Set those two or get them from one the the sprites you want to combine 
     int spritesWidth = (int)spritesArray[0][0].rect.width; 
     int spritesHeight = (int)spritesArray[0][0].rect.height; 

     Texture2D combinedTexture = new Texture2D(spritesWidth * spritesArray.Length, spritesHeight * spritesArray[0].Length); 

     for (int x = 0; x < spritesArray.Length; x++) 
     { 
      for (int y = 0; y < spritesArray[0].Length; y++) 
      { 
       combinedTexture.SetPixels32(x * spritesWidth, y * spritesHeight, spritesWidth, spritesHeight, spritesArray[x][y].texture.GetPixels32()); 
      } 
     } 
     combinedTexture.Apply(); 

     return Sprite.Create(combinedTexture, new Rect(0.0f, 0.0f, combinedTexture.width, combinedTexture.height), new Vector2(0.5f, 0.5f), 100.0f); 
    } 
}