我正在通过以下方式从图像(“资源/狗”)创建游戏对象:
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
文件夹加载两个名为 dog
和 dog2
的图像,以确保它们存在。 SR
是屏幕上的纹理,将随 dog2
和 dog
图像更改。 dogAnimation.startAnimation(0.2f);
会开始动画,你可以在里面传入动画过渡时间。
关于c# - Unity Sprite 运行时的两个图像动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37805594/