怎么在Unity3D中做连续unity2d 序列帧动画画

求助:Animator如何控制一个动画循环播放,而不是只播放一次_unity3d吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:60,289贴子:
求助:Animator如何控制一个动画循环播放,而不是只播放一次收藏
比如默认状态为idle,要一直播放idle,而不是只播放一次idle
火星时代作为专业unity3d研发培训机构,依靠多年游戏教学实力,让您快速成为u3d工程师.毕业月薪&12000起&.详情请点击&&&
还有 脚本 怎么判断当前是否有动画正在播放啊?
Animation.isPlaying 是否在播放循环的话,就点Project里的模型,然后点击Animations,设置WrapMode为LOOp
楼主有解决方法了吗,能说一下吗
Animator的默认动画clip是idle,并且在动画的设置中勾选loop的相关设置,是可以的。这个和legacy有些不一样,但是肯定是可以的
model里对应的动画clip勾选loop pose
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或10167人阅读
Unity3D(156)
今天我给大家讲一下如何使用NGUI做序列帧动画。本节主要包括两方面内容,分别是使用UIspirit和使用UITexture 做序列帧动画。废话不说了,下面开始。
还要在啰嗦一句,首先大家要准备一些序列帧的素材图片,最好是大图和小图各一套。我们先来将使用UISpirit做序列帧动画,这个方法只适合使用小图。
在使用UISpirit 之前大家还要把准备好的序列帧图片做成Atlas,如何做Atlas,大家可以参考系列教程四,这里就不多说了。建好自己的Atlas之后就可以开始着手做了。废话终于完了。
1. 老规矩,新建一个场景,新建一个2D UI ,在Panel节点下新建一个UISpirit,图片选择序列帧的第一帧图片。
2.如何让Spirit动态换图片,是我们要解决的重要问题。只要UIspirit能够根据时间动态的换图片就可以做到播放序列帧动画。其实很简单,最重 要的就是UISpirit的Name属性。我们只要能够动态改变UISpirit的SpiritName,就可以实现动态换图的功能。
public bool ActivateWait =
&&& float fireRate = 0.2f;
&&& int i = 0;
&&& float nextF
&&& string[] ActivatorTexture = new string[] { &activity00&, &activity01&, &activity02&, &activity03&, &activity04&, &activity05&, &activity06&, &activity07&, &activity08&, &activity09&, &activity10&, &activity11& };&&&&&&&&&&& //这里存放我们需要调用的序列帧的名称,这种方法比较笨拙,
//只适合使用图片较少的情况,当图片很多的情况下,我们可以使用代码控制名称,思路是前面的名称一样,后面的名称代表序列帧编号,我们只要
//在代码中根据编号加上前缀名称就可以得到所需序列帧的全名。具体使用参见下面的Texture序列帧动画。
&&& void Awake()
&&&&&&& this.GetComponent&UISprite&().enabled =
&&& // Use this for initialization
&&& void Start()
&&& // Update is called once per frame
&&& void Update()
&&&&&&& if (ActivateWait)
&&&&&&&&&&& this.GetComponent&UISprite&().enabled =
&&&&&&&&&&& if (i & ActivatorTexture.Length)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& if (Time.time & nextFire)
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& nextFire = Time.time + fireR
&&&&&&&&&&&&&&&&&&&& this.GetComponent&UISprite&().spriteName= ActivatorT
&&&&&&&&&&&&&&&&&&& i++;
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& else
&&&&&&&&&&& {
&&&&&&&&&&&&&&& i = 0;
&&&&&&&&&&& }
&&&&&&& else
&&&&&&&&&&& this.GetComponent&UISprite&().enabled =
这里重要的代码其实就只有一句 this.GetComponent&UISprite&().spriteName= ActivatorT 根据i的索引,动态的改变Spirit的名称。
其余的是控制播放序列帧的节奏和是否播放序列帧。如图是我使用此方法做的等待的进度条效果。
3.第二种方法,使用UITexture做序列帧动画。新建一个UITexture,拖放需要做动画的序列帧的第一帧到Texture槽中,关于它的参 数,在以前的系列教程中都已经解释的很清楚了,大家可以参考以前的教程。使用UITexture做序列帧动画的关键在于动态改变它的Texture。关键 代码:UITexture.mainTexture 。
这里说明一点就是使用该方法做序列帧动画之前,需要把所有的序列帧图片放到Resources目录下。我们在运行的时候动态调用需要的Texture。还 有一点需要注意的是,当图片很多的时候,我们还需要动态卸载已经加载的图片资源,避免挤爆内存。使用的方法是 : Resources.UnloadUnusedAssets();
4.有了上面的知识之后,我们就可以动手写出下面的代码了:
void DynamicLoadUnload(int curframe )
&&&&&&& //plane.renderer.material.mainTexture=ani[currentFrame];
&&&&&&& if (curframe & 10)&&& //这里判断当前帧
&&&&&&&&&&& TextureUI.mainTexture = (Texture2D)Resources.Load(SequenceName_Gewei + curframe.ToString(), typeof(Texture2D));
//SequenceName_Gewei 是指序列帧的名称去掉各位数字的名称,比如全名为Texture00,那么这里的参数应该是Texture0。下面还有十位百位,
//依次类推。这里是根据名称加帧索引,获取全名的。
&&&&&&& else if (curframe &= 10 && curframe & 100)
&&&&&&&&&&& if (curframe % 50 == 0)
&&&&&&&&&&&&&&& Resources.UnloadUnusedAssets();
&&&&&&&&&&& TextureUI.mainTexture = (Texture2D)Resources.Load(SequenceName_Shiwei + curframe.ToString(), typeof(Texture2D));
&&&&&&& else
&&&&&&&&&&& if (curframe % 50 == 0)
&&&&&&&&&&&&&&& Resources.UnloadUnusedAssets();
&&&&&&&&&&& TextureUI.mainTexture = (Texture2D)Resources.Load(SequenceName_Baiwei + curframe.ToString(), typeof(Texture2D));
需要大家跟着自己动手做,自己学,授之以鱼不如授之以渔。大家可以试着自己结合上面的UISpirit的方法先自己写一下看看。这样可以让大家根据学习内容多思考,自己写出的东西才能记得牢固。不要只简单的从网上下载现成的代码用,这样对学习没好处。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:991873次
积分:10515
积分:10515
排名:第1174名
原创:78篇
转载:350篇
评论:77条
(2)(3)(2)(1)(3)(1)(4)(2)(2)(6)(25)(2)(5)(3)(65)(20)(2)(4)(4)(58)(12)(10)(82)(75)(25)(1)(1)(1)(3)(2)(8)(1)&&&&Unity3D_切图以及序列帧动画
Unity3D_切图以及序列帧动画
在Cocos2dx中,对大图的处理已经封装好了一套自己的API,但是在Unity3D中貌似没有类似的API,或者说我没找到。不过这也在情理之中,毕竟Unity3D是做3D的,要切割图片的地方还是很少的。
因为我用Unity3D主要是用于做2D游戏的(PS:很蛋疼吧?我也觉得),所以就不得不考虑切图和播放序列帧这两个在2D上常见的功能了,下面废话不多说。我的任务是把下面这张图切割成16块,并且按照动画的序列播放出来。
若举报审核通过,可奖励20下载分
被举报人:
baijiajie2012
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
开发技术下载排行后使用快捷导航没有帐号?
只需一步,快速开始
&加载中...
查看: 1079|回复: 4
求大神赐教..K侦动画如何取消循环播放
TA的其他好贴
马上注册,加入CGJOY,让你轻松玩转CGJOY。
才可以下载或查看,没有帐号?
本帖最后由 虚空神殿 于
17:25 编辑
本人用的是Unity 5.1.1f1 (64-bit)本来做特效的时候选择播放,可以点次play once就播放一次特效。但是自从用了ctil+6制作特效动作之后, K侦完动作取消了循环播放,结果勾完就只播放了一次 之后就死在那了 再怎么点Play Once动画也不能再次播放了!
QQ图片45.png (16.41 KB, 下载次数: 1)
10:19 上传
问同事他也没辙,就告诉我重复勾选Long 才能每次单次播放
QQ图片20.png (17.68 KB, 下载次数: 1)
10:19 上传
有哪位大神能解决下这问题啊?拉破车知道这是什么原因吗?
(16.41 KB, 下载次数: 2)
10:18 上传
(17.68 KB, 下载次数: 1)
10:19 上传
如何勾引别人关注你?
loop time勾上是循环 去了是不循环
本楼回复(<span id="dp_count_)
如何勾引别人关注你?
loop time勾上是循环 去了是不循环
可能是我没表达清楚,我知道loop time是循环播放,但是我没勾的时候,点play once只能播放一次,再点击就没作用了。我想的是要点PLAY ONCE能每次点下播放动画一次。
本楼回复(<span id="dp_count_)
如何勾引别人关注你?
你说的那个方式貌似不行&&你不勾选循环的话 默认播放一次是直接播放到最后一帧,但是你再点播放的话&&Unity貌似不会帮你从0帧开始的..
本楼回复(<span id="dp_count_)
如何勾引别人关注你?
好好好好好好好好好
本楼回复(<span id="dp_count_)
如何勾引别人关注你?
Powered byUnity3d动画脚本&Animation&Scripting(深入了解游戏引擎中的动画处理原理)
也许这一篇文章的内容有点枯燥,但我要说的是如果你想深入的了解游戏引擎是如何处理动画片断或者素材并
让玩家操控的角色动起来栩栩如生,那么这(当然我仅仅是翻译了一下)
动画系统允许你创建一个漂亮的动画蒙皮角色.
动画系统支持动画融合,混合,添加动画,步调周期时间同步.动画层.控制动画回放的所有方面(时间,速度,混合权重)
每个顶点有1.2.4个骨骼影响的mesh,基于物理系统的布娃娃系统,另外还有程序动画.为了获得最佳效果推荐您在制作模型和动画绑定前阅读一下
制作一个动画角色主要包括两个方面;
在世界中移动
由此产生的动画.
如果你想了解角色移动相关的更多内容,
请参阅 . &&实际上角色动画是由Unity's
脚本界面完成的
你可以下载
中预设置好的动画角色.
当你学完本页的基础部分你还可以看一看 .
&如果需要你可以点击并快速转到以下主题:
&&&动画融合
&&&&&动画层
&&&&&&动画混合
&&&&&附加动画
&&&程序动画
&&动画重放和取样
Animation Blending
在现今的游戏中Animation Blending是一项保证游戏动画顺畅过渡的基本的特性.动画师创建的动画例如:
循环, idle原地空闲动画
或射击动画.在游戏的任何时间点你都有可能从空闲站立转换到走动,反之亦然.
当然你不希望两个不同的动作之间突然跳转,
你需要动画平滑过渡.
而这个问题的解决就依赖动画融合技术.
在Unity中你可以让同一个角色拥有任意数量的动画.所有这些动画融合添加成为一个总的动画.
首先我们来为一个角色添加两个动画原地空闲站立和走动并平滑的使这两个动画过渡.
为了使我们在写脚本时简单些,
首先我们设置动画的 Wrap Mode为
Automatically来让我们的脚本来独占动画的播放.
我们第一个动画脚本很简单;
我们需要一些方法来探查角色移动的有多快,
然后在走和站立之间淡入淡出.
在这个简单的测试中我们使用
pre-setup input
function Update () {
(Input.GetAxis("Vertical") & 0.2)
animation.CrossFade ("walk");
animation.CrossFade ("idle");
下面我们来让这个脚本运行:
创建一个js脚本
Assets-&Create
Other-&Javascript.
把代码拷贝进去
把脚本拖拽给角色 character (It needs to be the same
GameObject as the animation)
当你按上下键时角色会走动,松开上下键时角色站立不动.
动画层Animation Layers
层是一个非常有用的概念它可以让你将动画片段任意成组并且区分优先顺序.
在Unity's动画系统中,
你可以混合任意数量的动画片段.
你可以手工分配权重或者直接使用animation.CrossFade(),来自动分配权重.
混合权重混合权重总是在应用前被规格化 normalized
比如说我们现在有一个
walk cycle
和一个run cycle,
权重都是1 (100%).当unity计算最终动画时会规格化权重,
这意味着 walk占50%
权重, &&run
cycle占50%
这在大多数情况下都是不错的,
但当两个动画片段同时运行而其中一个权重明显大于另外一个.
那么你需要手动调整权重值,但如果你使用动画层来解决这个问题过程会容易得多.
制作动画层的范例Layering Example
例如现在你有一个射击动画,
一个空闲站立,一个走动循环
你需要在走和站两个动作间持续的淡入淡出(在玩家走动速度的基础上)
但当玩家射击时我们只想展示射击动画.
因而射击动画此时的优先度最高.
为了达到这一目的最简单的方法是在射击时简单的保持 walk
和 idle动画.
接下来需要确定shoot animation在一个比idle
和 walk更高的层.
这意味着shoot animation
将首先收到混合权重. &&walk
animation不使用
混合权重的情况下接收权重.
所以当 CrossFading the shoot animation in,
权重将从0开始很短时间内到达
在开始阶段 walk
层将依然可以收到混合权重
但当 shoot animation
完全切入时,
他们就收不到权重了.&
这才是我们需要的!
function Start () {
Set all animations to loop
设置所有动画为循环
animation.wrapMode = WrapMode.L
except shooting
除了射击(不循环)
animation["shoot"].wrapMode = WrapMode.O
//放置idle
进低一级别的 layers &(默认
This will do two things这将作两件事情
当 calling CrossFade时,由于shoot
和 idle/walk
在不同的layers
它们将不会影响互相之间的重放.
由于 shoot
在高一级的 layer,
当faded in
时shoot动画将替换
animation["shoot"].layer = 1;
Stop animations that are already playing停止已经播放的动画
忘记的话,自动disable播放)
animation.Stop();
function Update () {
Based on the key that is pressed,基于按下的键
play the walk animation or the idle animation播放走,站动画
(Mathf.Abs(Input.GetAxis("Vertical")) &
animation.CrossFade("walk");
animation.CrossFade("idle");
(Input.GetButtonDown ("Fire1"))
animation.CrossFade("shoot");
默认情况下
animation.Play()
animation.CrossFade()
将停止或淡出在同一层里面的动画.
这是我们在绝大多数情况下需要的.
在我们shoot, idle, run
将不会影响到 shoot动画
反之亦然 (you can change this behavior(行为) with an optional parameter(任意参数) to animation.CrossFade if you like).
动画混合Animation Mixing
动画混合可以让你缩减你必须为游戏制作的动画片断数量
,方法是制作只对身体某个部分起作用的动画.
这意味着这些动画可以和其他动画合并起来一起使用.
如果你想给一个动画添加 animation mixing transform to an animation by
calling AddMixingTransform() on the given AnimationState.
混合范例Mixing Example
例如你可能有一个挥手(hand-waving)动画.
你可能需要让一个空闲站立(idle)角色或者一个走动(walking)角色
如果没有动画混合你可能需要制作两个挥手hand-waving动画
一个给 idle,
一个给walking.
如果你将挥手(hand-waving)动画作为一个mixing transform
添加到shoulder transform,挥手动画将只控制肩膀.
身体余下部位不受其影响,
下半身会继续播放 idle
因而你只需要一个挥手(hand-waving)动画.
/// Adds a mixing transform using a Transform
var shoulder : T
animation["wave_hand"].AddMixingTransform(shoulder);
Another example using a path.
function Start () {
Adds a mixing transform using a path instead
mixTransform : Transform =
transform.Find("root/upper_body/left_shoulder");
animation["wave_h和"].AddMixingTransform(mixTransform);
Animations
附加动画和动画混合可以让你缩减为游戏制作的动画片断的数量,并且对面部动画(facial animations)来说非常重要.
让我们来看看如果创建一个在跑和转身时身体可以自动倾斜的角色.
你已经制作好了一个 walk
和 run循环,
现在你还要制作一个走动左倾( walk-lean-left),
走动右倾(walk-lean-right),
跑左倾(run-lean-left),
跑右倾(run-lean-right)动画.
这意味着你需要多做4个动画片断!
制作这么多数量的动画会累死人的.
而附加动画(Additive animations)
和混合(Mixing)
可以大大减少这些工作量!
附加动画范例 Additive Animation Example
附加动画允许你在顶层覆盖其他所有可能播放的动画的效果( allow you to overlay the effects of animation on
top of any others that may be playing).
当你制作一个附加动画时, Unity将计算动画片断里的第一帧
frame)和当前帧(current frame)的差异.
然后它将在所有其他播放的动画之上应用这个差异(Then it will apply this difference on top of all
other playing animations).
现在你只需要制作一个左倾( lean-left)
和右倾( lean-right)动画. Unity将为此倾斜动画新建一个层并置于walk, idle
或 run循环的层级之上.
下面是代码Here is the code to make that happen:
private var leanLeft : AnimationS
private var leanRight : AnimationS
function Start () {
leanLeft = animation["leanLeft"];
leanRight = animation["leanRight"];
Put the leaning animation in a separate layer
So that other calls to CrossFade won't affect it.
leanLeft.layer = 10;
leanRight.layer = 10;
Set the lean animation to be additive
混合模式为附加
leanLeft.blendMode = AnimationBlendMode.A
leanRight.blendMode = AnimationBlendMode.A
Set the lean animation ClampForever
With ClampForever animations will not stop
automatically when reaching the end of the clip
leanLeft.wrapMode = WrapMode.ClampF
leanRight.wrapMode = WrapMode.ClampF
Enable the animation
和 fade it in completely
We don't use animation.Play here because we manually adjust the
in the Update function.
Instead we just enable the animation
和 set it to full weight
leanRight.enabled =
leanLeft.enabled =
leanRight.weight = 1.0;
leanLeft.weight = 1.0;
For testing just play "walk" animation
和 loop it
animation["walk"].wrapMode = WrapMode.L
animation.Play("walk");
// Every frame just set the normalized
// based on how much lean we want to
function Update () {
lean = Input.GetAxis("Horizontal");
normalizedTime is 0 at the first frame
和 1 at the last frame in the clip
leanLeft.normalizedTime = -
leanRight.normalizedTime =
当使用附加动画时它会判断你同时也在播放一些其他的使用了附加动画的非附加动画(it is critical that you are also playing some
other non-additive animation on every transform that is also used
in the additive animation),
否则动画将添加到最后一帧结果的顶部(animations will add on top of the last frame's
这通常不是你所需要的 (This is most certainly not what you
程序动画角色Procedurally Animating Characters
有时你需要程序化的驱动你的角色骨骼.
例如你可能需要你的角色的头注视3d空间的某个点.
这个活最好让脚本来干.
幸运的是, Unity做这个很容易.
中所有骨骼来驱动蒙皮网格(skinned mesh)的变换(Transforms).
因而你可以给角色的骨骼写脚本,就和其他GameObject一样.
很重要的一点是动画系统updates the Transforms
是在Update() function调用之后&
,LateUpdate() function
因而如果你要调用
你应该do that in LateUpdate() to make sure that
you are really overriding the animation.
布娃娃系统Ragdolls
也是用同样的方法制作出来的.
你可以简单的把刚性物体(Rigidbodies),
角色关节(Character Joints)
胶囊碰撞体(Capsule Colliders)连接给不同的骨骼.
这样物理系统就可以作用于蒙皮角色(skinned character). (什么是布娃娃系统,当你在射击类游戏中打死对手时可以注意到当角色快接近地面时,他的四肢开始瘫软在地面上,这个不是动画师调出来的,而是布娃娃系统自动计算出来的。)
动画重放和取样Animation Playback
和 Sampling
将说明引擎如何在动画重放时取样.
动画片断制作时总是有一个特定的速率.
你可能在Max
创建了一个帧速为 60 frames
每秒(fps)的动画.
当导入 Unity后,
输入模块将读取帧速,
所以导入的动画帧速还是60fps.
游戏运行时的速率是不断变化的.
有的电脑帧速快有的电脑帧速慢,
即使是同一台电脑前一秒和后一秒因为视角的不同帧速也不一样.
基本上当游戏开始运行时我们无法确定一个精确的帧速.
这意味着即使我们的动画片断制作时是 60 fps,
它重放时也许用的是另外一个速率,
例如 56.72 fps,
或 83.14 fps.
它可以变成任何一个速率.
对这些变化的速率取样,
不在于其制作时的速率.
幸运的是,3d电脑图形动画不是由分散的动画组成,
确切地说是由连续的曲线构成的.
这些曲线可以让我们在任何时间点取样;
而不是适配某一个原始帧的时间点. I这也意味着如果游戏运行速率高于原始制作速率,
动作事实上看起来会更平滑流畅.
对绝大多数应用场合, &Unity对变化帧速的采样我们无需对其进行干预.
如果你的某个游戏逻辑所依赖的动画变化或道具(transforms or properties)结构十分特殊,
那你必须知道这一点. &举例说,
如果你有一个动画是把一个物体30帧内从
0旋转到180度,
你想从代码中得知什么时候动画完成一半,
你不能写一段条件语言来检查现在旋转值是不是90度.
因为 Unity
依照游戏的变化速率来对动画采样,
它可能在旋转快到90度时进行采样,
或者是刚好过90度的时候采样.
如果你需要通报动画中一个特殊点到达时,
你可以使用
同样需要注意的是变化的帧速采样结果,
一个使用WrapMode.Once
模式重放的动画的采样不一定是精确的最后一帧( last frame).
在游戏中很有可能是刚好结束前的某一帧,
在下一帧时间可能超过动画的长度, so it is disabled
和 not sampled further.
如果你需要动画的最后一帧采样精确,你可以使用WrapMode.ClampForever.
如果是那样的话动画将不停的对最后一帧进行采样直到你自己停止动画.&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 unity 序列帧动画 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信