c# - Unity Sprite 运行时的两个图像动画

标签 c# animation unity-game-engine

我正在通过以下方式从图像(“资源/狗”)创建游戏对象:

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”),我想创建一个切换图像的动画,我可以为另一个图像创建另一个 Sprite ,并在每次 update() 时在它们之间切换被调用,但这是最好的方法吗?这会占用很多内存。

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

最佳答案

您可以使用 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 的脚本。将下面的所有内容复制到其中。同时删除类名后面的“: MonoBehaviour”。 您必须这样做!它不能从 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"); 将设置动画。它将创建一个名为 DogAnimation 的新 GameObject。然后,它将从 Resources 文件夹加载两个名为 dogdog2 的图像,以确保它们存在。 SR 是屏幕上的纹理,将随 dog2dog 图像更改。 dogAnimation.startAnimation(0.2f); 会开始动画,你可以在里面传入动画过渡时间。

关于c# - Unity Sprite 运行时的两个图像动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37805594/

相关文章:

c# - 字符串格式 : Hexadecimal ("X") Format Specifier and Zero (0)

r - 在三维空间中为矢量设置动画

ios - SwiftUI 中的 Animate ViewBuilder 内容大小更改

listview - 如何在 flutter 中制作水平滚动动画

c# - 如何计算屏幕位置

unity-game-engine - Gradle 无法获取依赖项 | Unity3d 中解析失败

c# - 指定的可执行文件不是此操作系统平台的有效应用程序。 Python绘图仪

c# - 如何在 C# 中使用 zxing 应用 Reed-Solomon 算法

c# - 为什么 WIA 看不到我的扫描仪?

unity-game-engine - 关闭 HoloLens 红外传感器?