gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:44:32 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com