2016-06-14 24 views
2

Ich bin ein Gameobject von einem Bild zu schaffen ("Resources/dog") durch die:Unity Sprite zwei Bilder Animation zur Laufzeit

tex = Resources.Load<Texture2D>("dog") as Texture2D; 
Sprite sprite = new Sprite(); 
sprite = Sprite.Create(tex, new Rect(0, 0, 250, 150), new Vector2(Random.Range(-1.5f, 1.5f), Random.Range(-1.5f, 1.5f))); 
GameObject newSprite = new GameObject(); 
newSprite.AddComponent<Rigidbody2D>(); 
newSprite.GetComponent<Rigidbody2D>().gravityScale = 0f;  
newSprite.AddComponent<ObjectMovement>(); 
newSprite.AddComponent<SpriteRenderer>(); 
SR = newSprite.GetComponent<SpriteRenderer>(); 
SR.sprite = sprite; 

Ich habe ein anderes Bild ("Resources/dog1"), und ich möchte Erstellen Sie eine Animation, um die Bilder zu wechseln, ich kann ein anderes Sprite für das andere Bild erstellen und jedes Mal zwischen ihnen wechseln, wenn update() aufgerufen wird, aber ist das der beste Weg? es wird viel Speicher benötigen.

Wenn Sie zwei Bilder in die Szene ziehen, wird ein animiertes Sprite erstellt. Ich denke, das Anhängen der Animation wird dann besser sein, wenn Sie jedes Update für jedes Spielobjekt (max. 10) ändern. Wie kann ich es erreichen?

+0

Nur zwei zwei Bilder oder mehr? Wo ist der Animationscode? Dies ist nicht vollständig. – Programmer

+0

@Programmer Nur zwei, aber ich habe 10 Objekte, einige sind Schweine, einige sind Hunde etc .. jedes Objekt hat zwei Bilder zu animieren im Leerlauf. – DAVIDBALAS1

+0

Ok. Wie viele Sekunden wechseln Sie jeweils zwei Sprites? – Programmer

Antwort

1

Sie dies mit dem Animator in Unity tun können, aber mit dem Code zu tun geben Ihnen mehr Kontrolle. Coroutines ist eine der besten Möglichkeiten, dies zu tun.

.Erstellen Sie ein Skript mit der Bezeichnung SpriteAnimator. Kopiere alles von unten hinein.

using UnityEngine; 
using System.Collections; 

public class SpriteAnimator : MonoBehaviour 
{ 
    bool continueAnimation = false; 

    SpriteRenderer displaySprite; 
    Sprite sprite1; 
    Sprite sprite2; 

    public void setupSprites(SpriteRenderer displaySprite, string animSprite1, string animSprite2) 
    { 
     //Set where the animated sprite will be updated 
     this.displaySprite = displaySprite; 

     //Load Sprite 1 
     Texture2D tex = Resources.Load<Texture2D>(animSprite1) as Texture2D; 
     sprite1 = Sprite.Create(tex, new Rect(0, 0, 250, 150), new Vector2(0.5f, 0.5f), 40); 

     //Load Sprite 2 
     Texture2D tex2 = Resources.Load<Texture2D>(animSprite2) as Texture2D; 
     sprite2 = Sprite.Create(tex2, new Rect(0, 0, 250, 150), new Vector2(0.5f, 0.5f), 40); 
    } 

    private IEnumerator startAnimationCRT(float time) 
    { 
     if (continueAnimation) 
     { 
      yield break; 
     } 
     continueAnimation = true; 

     WaitForSeconds waitTime = new WaitForSeconds(time); 
     while (continueAnimation) 
     { 
      //Change to Sprite1 
      displaySprite.sprite = sprite1; 

      //Wait for `time` amount 
      yield return waitTime; 

      //Change Sprite 
      displaySprite.sprite = sprite2; 

      //Wait for `time` amount 
      yield return waitTime; 
     } 

     continueAnimation = false; 
    } 

    public void startAnimation(float time) 
    { 
     StartCoroutine(startAnimationCRT(time)); 
    } 

    public void stopAnimation() 
    { 
     continueAnimation = false; 
    } 

    public void removeAnimation() 
    { 
     Destroy(this.gameObject); 
    } 
} 

.Create ein anderes Skript SpriteAnimation genannt. Kopiere alles von unten hinein. Entfernen Sie auch ": MonoBehaviour" nach dem Klassennamen. Sie müssen dies tun! Es kann nicht von MonoBehaviour abgeleitet werden, also entfernen Sie es.

using UnityEngine; 
using System.Collections; 

public class SpriteAnimation 
{ 
    SpriteAnimator spriteAnimator; 
    GameObject gameObj; 

    public void setupSprites(string animationName, SpriteRenderer displaySprite, string animSprite1, string animSprite2) 
    { 
     gameObj = new GameObject(animationName); 
     gameObj.AddComponent<SpriteAnimator>(); 
     spriteAnimator = gameObj.GetComponent<SpriteAnimator>(); 
     spriteAnimator.setupSprites(displaySprite, animSprite1, animSprite2); 
    } 

    public void startAnimation(float time = 0.5f) 
    { 
     spriteAnimator.startAnimation(time); 
    } 

    public void stopAnimation() 
    { 
     spriteAnimator.stopAnimation(); 
    } 

    public void Destroy() 
    { 
     spriteAnimator.removeAnimation(); 
    } 
} 

Erledigt. Wie zu verwenden:

public SpriteRenderer SR; 
SpriteAnimation dogAnimation; 

void Start() 
{ 
    dogAnimation = new SpriteAnimation(); 
    dogAnimation.setupSprites("DogAnimation", SR, "dog", "dog2"); 
    dogAnimation.startAnimation(0.2f); 
} 

Anruf dogAnimation.stopAnimation(); die Animation zu stoppen. Sie können viele SpriteAnimations erstellen, wie Sie möchten. Die Zeile Code dogAnimation.setupSprites("DogAnimation", SR, "dog", "dog2"); wird Animation einrichten. Es wird ein neues GameObject namens DogAnimation erstellt. Es lädt dann zwei Bilder namens dog und dog2 aus dem Ordner Resources, so stellen Sie sicher, dass diese existieren. SR ist die Textur auf dem Bildschirm, die mit dog2 und dog Bilder geändert werden. dogAnimation.startAnimation(0.2f); startet die Animation und Sie können die Animationsübergangszeit hineingeben.

+0

Wow, Danke Mann! – DAVIDBALAS1

+0

@ DAVIDBALAS1 Nr. Sie können es auch ändern, um Arrays zu übernehmen. Dadurch wird es mit jeder Menge Sprite-Animation funktionieren.Vergessen Sie nicht, die Zeile 'Vector2 (Random.Range (-1.5f, 1.5f), Random.Range (-1.5f, 1.5f))' aus Ihrem Code zu entfernen. Sie hatten das in Ihrer Frage und ich bat Sie, es zu entfernen. Es kostet später Probleme für Sie, da das Bild manchmal nicht auf dem Bildschirm erscheint. – Programmer

+0

Ich habe es bereits entfernt, ich denke, ich habe diesen Code aus dem vorherigen Thread kopiert, so dass es nicht aktualisiert oder etwas ist. Danke :) – DAVIDBALAS1

0

Keine Animation zwischen Sprites zu wechseln. Verwenden Animator Komponente - https://docs.unity3d.com/ScriptReference/Animator.html

dieses Tutorial Siehe: https://unity3d.com/learn/tutorials/projects/2d-roguelike-tutorial/player-and-enemy-animations

+0

Ich mache dies zur Laufzeit, habe versucht, den Animator durch diese Zeile hinzufügen: newSprite.addComponent (); aber wie kann ich den Animator spielen die Animation, die ich für dieses spezifische gameObject will? – DAVIDBALAS1

+0

Sie können verschiedene Animationen in AnimationClip Objekte speichern und an animation.Play() übergeben. Methode: https://docs.unity3d.com/ScriptReference/AnimationClip.html –

Verwandte Themen