2016-12-24 4 views
0

Ich möchte ein einzelnes Sprite bekommen, das GameObject in einer SpriteRenderer Komponente hat. Leider gibt dieser Code den ganzen Atlas zurück, aber ich brauche einen Teil dieses Atlasses.Erhalte ein einzelnes Sprite vom Sprite Atlas

Texture2D thumbnail = GetComponent<SpriteRenderer>().sprite.texture; 

Pic

Antwort

0

Es gibt keine native API einzelne Sprite aus dem SpriteRenderer und keine API für den Zugriff auf einzelne Sprite zu erhalten, indem Name. Sie können für diese Funktion abstimmen here.

Sie können Ihre eigene API erstellen, um ein einzelnes Sprite von Atlas im Ordner Resources wie das in Ihrer Frage enthaltene Bild zu erhalten.

Sie können alle Sprites aus dem Atlas mit laden und dann in einem Wörterbuch speichern.Eine einfache Funktion kann dann verwendet werden, um auf jeden sprite mit dem angegebenen Namen zuzugreifen.

Ein einfacher Atlas Loader Skript:

public class AtlasLoader 
{ 
    public Dictionary<string, Sprite> spriteDic = new Dictionary<string, Sprite>(); 

    //Creates new Instance only, Manually call the loadSprite function later on 
    public AtlasLoader() 
    { 

    } 

    //Creates new Instance and Loads the provided sprites 
    public AtlasLoader(string spriteBaseName) 
    { 
     loadSprite(spriteBaseName); 
    } 

    //Loads the provided sprites 
    public void loadSprite(string spriteBaseName) 
    { 
     Sprite[] allSprites = Resources.LoadAll<Sprite>(spriteBaseName); 
     if (allSprites == null || allSprites.Length <= 0) 
     { 
      Debug.LogError("The Provided Base-Atlas Sprite `" + spriteBaseName + "` does not exist!"); 
      return; 
     } 

     for (int i = 0; i < allSprites.Length; i++) 
     { 
      spriteDic.Add(allSprites[i].name, allSprites[i]); 
     } 
    } 

    //Get the provided atlas from the loaded sprites 
    public Sprite getAtlas(string atlasName) 
    { 
     Sprite tempSprite; 

     if (!spriteDic.TryGetValue(atlasName, out tempSprite)) 
     { 
      Debug.LogError("The Provided atlas `" + atlasName + "` does not exist!"); 
      return null; 
     } 
     return tempSprite; 
    } 

    //Returns number of sprites in the Atlas 
    public int atlasCount() 
    { 
     return spriteDic.Count; 
    } 
} 

Nutzungs:

enter image description here

Mit dem Beispielbild oben "Fliese" ist das Basisbild und Ball, unten, menschen und Wallframe sind die Sprites im Atlas.

void Start() 
{ 
    AtlasLoader atlasLoader = new AtlasLoader("tiles"); 

    Debug.Log("Atlas Count: " + atlasLoader.atlasCount()); 

    Sprite ball = atlasLoader.getAtlas("ball"); 
    Sprite bottom = atlasLoader.getAtlas("bottom"); 
    Sprite people = atlasLoader.getAtlas("people"); 
    Sprite wallframe = atlasLoader.getAtlas("wallframe"); 
} 
-2

Sie das Bild, das Sie von sich selbst in den Ordner Ressourcen benötigen setzen könnte, dann verwenden Sie die Resources.Load ("spriteName"), um es zu bekommen. Wenn Sie es als ein Sprite erhalten möchten, würden Sie wie folgt vor:

Sprite thumbnail = Resources.Load("spriteName", typeof(Sprite)) as Sprite; 

Quelle: https://forum.unity3d.com/threads/how-to-change-sprite-image-from-script.212307/

-2

gut mit den neuen Unity-Versionen Sie es SpriteAtlas tun können, Klasse und GetSprite Methode einfach mit: https://docs.unity3d.com/ScriptReference/U2D.SpriteAtlas.html

Also, wenn Sie mit den Ressourcen arbeiten Ordner, den Sie tun können:

Resources.Load<SpriteAtlas>("AtlasName") 
+0

Nein, das geht nicht. Beachten Sie, dass das Sprite in dieser Frage ein einzelner Sprite ist, der mit dem Sprite-Editor von Unity in Stücke geschnitten wurde. Diese Lösung funktioniert nicht wie Håvard Nygårds [Lösung] (https://stackoverflow.com/a/41315125/3785314). – Programmer