我正在通过图像(“资源/狗”)创建一个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个)。 我怎样才能实现它?
答案 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
文件夹中加载两个名为dog2
和Resources
的图像,以确保这些图像存在。 SR
是屏幕上的纹理,将使用dog2
和dog
图片进行更改。 dogAnimation.startAnimation(0.2f);
将启动动画,您可以在里面传递动画过渡时间。
答案 1 :(得分:0)
无需在精灵之间进行动画切换。使用Animator组件 - https://docs.unity3d.com/ScriptReference/Animator.html
请参阅本教程:https://unity3d.com/learn/tutorials/projects/2d-roguelike-tutorial/player-and-enemy-animations