Unity Sprite运行时两个图像动画

时间:2016-06-14 07:28:03

标签: c# animation unity3d

我正在通过图像(“资源/狗”)创建一个gameObject:

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;

我有另一个图像(“Resources / dog1”),我想创建一个动画切换图像,我可以为另一个图像创建另一个精灵,并在每次调用update()时在它们之间切换但是它是最好的方法?它需要大量的记忆。

此外,如果您将两个图像拖动到场景中它会创建一个动画精灵,我认为附加动画会更好,然后为每个游戏对象切换精灵每次更新(最多10个)。 我怎样才能实现它?

2 个答案:

答案 0 :(得分:1)

您可以使用Unity中的Animator执行此操作,但使用代码可以让您获得更多控制权。协同程序是最好的方法之一。

1 。创建一个名为SpriteAnimator的脚本。将所有内容从下面复制到它。

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);
    }
}

2 。创建另一个名为SpriteAnimation的脚本。将所有内容从下面复制到它。同时删除&#34; : MonoBehaviour&#34;在班级名称之后。 您必须这样做!它无法从MonoBehaviour派生,因此请将其删除。

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();
    }
}

完成。使用方法:

public SpriteRenderer SR;
SpriteAnimation dogAnimation;

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

调用dogAnimation.stopAnimation();停止动画。 您可以根据需要创建许多SpriteAnimations。代码行dogAnimation.setupSprites("DogAnimation", SR, "dog", "dog2");将设置动画。它将创建一个名为GameObject的新DogAnimation。然后,它会从dog文件夹中加载两个名为dog2Resources的图像,以确保这些图像存在。 SR是屏幕上的纹理,将使用dog2dog图片进行更改。 dogAnimation.startAnimation(0.2f);将启动动画,您可以在里面传递动画过渡时间。

答案 1 :(得分:0)