unity里的unity5 animationn怎么播放

在Unity中实现动画的正反播放代码
投稿:hebedich
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了在Unity中实现动画的正反播放代码,非常的实用,这里推荐给大家,希望大家能够喜欢。
using UnityE
using System.C
public class AnimationAntiSowing : MonoBehaviour {
public static AnimationAntiSowing _
void Awake()
_initialise =
/// &summary&
/// 动画进行正反播放
/// &/summary&
/// &param name="gameObject"&需要播放动画的物体&/param&
/// &param name="isZhengOrFan"&动画的播放状态&/param&
/// &param name="animation"&动画状态&/param&
/// &returns&&/returns&
public bool isPositiveAndNegativePlay(GameObject gameObject,bool isZhengOrFan,AnimationState animation)
//判断传入的动画的播放状态
//----传入的状态为true时,表示正常播放
//----传入的状态为false时,表示动画播放完,可以进行反向播放
if(!isZhengOrFan)
//当没有播放动画的时候,播放动画
if(!gameObject.animation.isPlaying)
gameObject.animation.Play();
//-----改变动画的播放状态-----
//动画的当前时间置为初始
animation.time = 0f;
//动画的播放速度为正常速度
animation.speed = 1.0f;
//改变传入的bool变量的值
isZhengOrFan =
//当没有播放动画的时候,播放动画
if (!gameObject.animation.isPlaying)
gameObject.animation.Play();
//-----改变动画的播放状态-----
//动画的当前时间置为动画的时长
animation.time = animation.
//向后走,即动画进行反向播放,从终点向起点播放
animation.speed = -1.0f;
//改变传入的bool变量的值
isZhengOrFan =
return isZhengOrF
以上就是本文分享的全部内容了,希望大家能够喜欢。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具【跟我一起学Unity3D】代码中切割图片并且加载帧序列动画 - 推酷
【跟我一起学Unity3D】代码中切割图片并且加载帧序列动画
在Cocos2dx中,对大图的处理已经封装好了一套自己的API,但是在Unity3D中貌似没有类似的API,或者说我没找到。不过这也在情理之中,毕竟Unity3D是做3D的,要切割图片的地方还是很少的。
因为我用Unity3D主要是用于做2D游戏的(PS:很蛋疼吧?我也觉得),所以就不得不考虑切图和播放序列帧这两个在2D上常见的功能了,下面废话不多说。我的任务是把下面这张图切割成16块,并且按照动画的序列播放出来。
查Unity3D的使用手册的过程中,我发现了一个类:Texture2D,他是继承Texture的,主要是用于创建2D纹理的,非常符合切图的需要。
首先,我们需要加载大图,加载大图有一个非常简单的方法,就是创建一个public的Texture2D类成员变量,然后在编辑器中直接拖动到上去给他赋值就可以了。
当然也可以采用动态加载图片资源的方法,这种方法比较麻烦,需要把图片先转换成二进制流,然后赋值给Texture2D
//加载图片资源
void LoadTexture()
using (FileStream file = File.Open (Application.dataPath + &/Textures/Player.png&, FileMode.Open))
using (BinaryReader reader = new BinaryReader(file))
m_texPlayer = new Texture2D (192, 256, TextureFormat.ARGB4444, false);
texture.LoadImage (reader.ReadBytes((int)file.Length));
加载完之后就要切割了,主要思路就是,两个for循环,一个表示行,一个表示列,然后再循环每个像素点,把每个像素点里面的颜色复制出来给切割的Texture2D,最后把Texture2D组合成一个4x4的矩阵数组。
for (int i = 0; i & m_iMinPicColumnC ++i)
for (int j = 0; j & m_iMinPicRowC ++j)
DePackTexture(i, j);
上面的最终处理调用了一个DePackTexture,这个函数是用于实际上的切割的。
void DePackTexture(int i, int j)
int cur_x = i * m_iMinPicW
int cur_y = j * m_iMinPicH
Texture2D newTexture = new Texture2D(m_iMinPicWidth, m_iMinPicHeight);
for (int m = cur_y; m & cur_y + m_iMinPicH ++m)
for (int n = cur_x; n & cur_x + m_iMinPicW ++n)
newTexture.SetPixel(n - cur_x, m - cur_y, m_texPlayer.GetPixel(n, m));
newTexture.Apply();
m_texPlayers[i, j] = newT
切图值得注意的就是两点,一点就是找好位置,另一点就是执行完SetPixel操作后一定要执行Apply,不然是没有效果的。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面是帧序列动画,帧序列动画实际上就是将图片按照一定的顺序加载上去,值得注意的是所有的GUI操作一定要放到OnGUI里面。
void DrawAnimation(Texture[,] tex, Rect rect)
//绘制当前帧
GUI.DrawTexture(rect, tex[m_iCurFram, m_iCurAnimation], ScaleMode.StretchToFill, true, 0.0f);
//计算限制帧的时间
m_fTime += Time.deltaT
//超过限制帧切换贴图
if (m_fTime &= 1.0 / m_fFps && m_bStop == false)
//帧序列切换
m_iCurFram = ++m_iCurFram % m_iMinPicRowC
//限制帧清空
m_fTime = 0;
//超过帧动画总数从第0帧开始
if (m_iCurFram &= tex.Length)
m_iCurFram = 0;
然后没有什么了,代码还是很简单的。下面附上全部的代码,这个我做成了一个小的demo,含有动画的开始和暂停功能,而且还有动画的帧速调整的功能。(最后会附上demo的地址)
using UnityE
using System.C
public class CTexture : MonoBehaviour
//大图的人
public Texture2D m_texP
//小图的人
private Texture2D[,] m_texP
private int m_iCurF
//当前动画
private int m_iCurA
//限制帧的时间
private float m_fTime = 0;
//小图的宽和高
public int m_iMinPicWidth = 48;
public int m_iMinPicHeight = 64;
//一行有多少个小图
public int m_iMinPicRowCount = 4;
//一列有多少个小图
public int m_iMinPicColumnCount = 4;
//动画控制
private bool m_bStop =
//一秒多少帧
private float m_fFps = 4;
private string m_sFps = &&;
void Start()
m_texPlayers = new Texture2D[4, 4];
m_iCurAnimation = 0;
m_sFps = m_fFps.ToString();
//加载图片资源
LoadTexture();
for (int i = 0; i & m_iMinPicColumnC ++i)
for (int j = 0; j & m_iMinPicRowC ++j)
DePackTexture(i, j);
void Update()
if(Input.GetKeyDown(KeyCode.A))
m_iCurAnimation = 2;
if (Input.GetKeyDown(KeyCode.S))
m_iCurAnimation = 3;
if (Input.GetKeyDown(KeyCode.W))
m_iCurAnimation = 0;
if (Input.GetKeyDown(KeyCode.D))
m_iCurAnimation = 1;
void OnGUI()
DrawAnimation(m_texPlayers, new Rect(100, 100, m_iMinPicWidth, m_iMinPicHeight));
if(GUI.Button(new Rect(200,20,80,50),&开始/暂停&))
m_bStop = m_bStop == false ? true :
m_sFps = GUI.TextField(new Rect(200, 80, 80, 40), m_sFps);
if (GUI.Button(new Rect(200, 150, 50, 40), &应用&))
m_fFps = float.Parse(m_sFps);
//加载图片资源
void LoadTexture()
using (FileStream file = File.Open (Application.dataPath + &/Textures/Player.png&, FileMode.Open))
using (BinaryReader reader = new BinaryReader(file))
m_texPlayer = new Texture2D (192, 256, TextureFormat.ARGB4444, false);
texture.LoadImage (reader.ReadBytes((int)file.Length));
void DePackTexture(int i, int j)
int cur_x = i * m_iMinPicW
int cur_y = j * m_iMinPicH
Texture2D newTexture = new Texture2D(m_iMinPicWidth, m_iMinPicHeight);
for (int m = cur_y; m & cur_y + m_iMinPicH ++m)
for (int n = cur_x; n & cur_x + m_iMinPicW ++n)
newTexture.SetPixel(n - cur_x, m - cur_y, m_texPlayer.GetPixel(n, m));
newTexture.Apply();
m_texPlayers[i, j] = newT
void DrawAnimation(Texture[,] tex, Rect rect)
//绘制当前帧
GUI.DrawTexture(rect, tex[m_iCurFram, m_iCurAnimation], ScaleMode.StretchToFill, true, 0.0f);
//计算限制帧的时间
m_fTime += Time.deltaT
//超过限制帧切换贴图
if (m_fTime &= 1.0 / m_fFps && m_bStop == false)
//帧序列切换
m_iCurFram = ++m_iCurFram % 4;
//限制帧清空
m_fTime = 0;
//超过帧动画总数从第0帧开始
if (m_iCurFram &= tex.Length)
m_iCurFram = 0;
demo地址:/s/1qWpyf5E
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致  项目剧情模块分给了我做,其中很重要的一个功能就是摄像机旋转平移等操作,本来打算使用Camera Path这个插件制作的,但是鉴于项目Unity版本还停留在4.3,低于插件要求版本,另外编辑器做出来是交由策划进行编辑的,而他们的权限只能看到场景,代码部分很少,因此只能寻求另外的解决方案。  选择Animation组件实现功能有两点好处:  1.Animation是Unity自带组件,不需要任何其他代码支持,方便策划编辑。  2.直观,所见即所得,操作较为简单,功能强大。  实现过程中需要注意三个方面。首先,需要在摄像机挂在一个Animation组件,用于播放摄像机动画。  其次,需要教给策划如何去创建编辑一个动画文件。打开Animation窗口,选中摄像机,新建一个Animation文件,左侧是组件列表,通常只会用到Postion和Rotation两种,红线表示当前选中的帧,可以看到摄像机此时Position参数和Rotation参数,在场景中拖动摄像机编辑每一帧摄像机的状态,记录于每个帧。右侧横轴表示动画时间轴,图中的单位是秒,滑动滑轮可以进行缩放,两个帧点之间的距离与动画速度成反比。  最后,完成一个动画的编辑后需要修改动画文件Type,选中文件,将Inspector窗口改为Debug模式,修改Animation Type参数2为1。这个问题主要是由于新的Mecanim动画系统出现后,动画文件默认的类型会被改为适合Animator的Type,这里需要将之修改回来,否则会报The AnimationClip 'xxx' used by the Animation component 'xxx' must be marked as Legacy.错误。完成这些后将动画文件挂载于Prefab上,打包成AssetBundles,在游戏中加载完成根据需要将Animation挂载于摄像机播放,摄像机动画即会呈现出来。  其实并不推荐大家使用以上解决方案,如果版本支持,使用上文中提到的Camera Path插件是个非常不错的选择,插件是使用新版动画Animator来实现的。经过几个版本的完善,新版Mecanim动画已经比较可靠了,功能强大、所见即所得。这里分享出来主要是因为项目版本较低,记录一下这个自创的山寨解决方案。Unity3D教程手册(unitymanual)
 文章为作者独立观点,不代表大不六文章网立场
unitymanual游戏蛮牛 ---
中国最大的手机游戏开发者技术社区! 热门文章最新文章unitymanual游戏蛮牛 ---
中国最大的手机游戏开发者技术社区! &&&&违法和不良信息举报电话:183-
举报邮箱:Copyright(C)2017 大不六文章网

我要回帖

更多关于 unity animationcurve 的文章

 

随机推荐