2017-07-11 14:13:13 Mogoson 阅读数 1398

MGS-PathAnimation

概述

Unity3D 制作路径动画 插件包。

需求

  • 创建,编辑路径锚点;
  • 依据路径播放位移动画。

方案

  • 利用AnimationCurve实现基于锚点的平滑路径。

实现

  • 扩展编辑器,辅助创建,编辑路径瞄点;
  • VectorCurve.cs:三维空间动画曲线;
  • Path.cs:依据锚点创建平滑路径;
  • PathAnimation.cs:依据路径播放位移动画。

案例

“MGS-PathAnimation/Scenes”目录下存放简易演示案例,供读者参考。

源码

源码托管地址

2016-04-03 15:52:33 zzlyym 阅读数 1108

        帧动画制作过程。

1:把几张图片拖到项目中,全选,改变它们的属性类型为精灵图,如图所示,之后apple应用一下。

2::精灵图全选,拖到Hierarchy中,这时会自动创建一个Animation的文件,我在场景中改名为Animation,这时你会发现精灵图的旁边出现了两个东西,如下图,第一个是控制动画的,第二个是动画。


3:可能初始图片不是我们想要的,这时选中Animation,如图属性中更改第一张显示的图片。

4:如果只让他播放一次,选中,looptime勾点掉,如果想改变他的播放速度,选中动画控制,属性点击open,出现下图的东西,选中,右边属性有个speed,数值越小,播放速度越慢。有错或者需要注意的地方请指出,谢谢了。


2019-03-28 11:03:51 github_37462634 阅读数 458


Unity软件可以很方便的为创建的游戏对象制作一些简单动画,下面就开始我们的教程吧。
本教程选择的是我目前所做项目中的一个模型,该项目展示了一对虚拟手臂与毛刷,毛刷要在运行时一直前后刷动,下面介绍毛刷前后刷动动画制作的完整过程。

一. 选择要创建动画的对象并为之新建一个动画

选中毛刷对象,在Hierarchy面板中该对象我命名为Cylinder,如下图
选中毛刷对象
在选中情况下,按下Ctrl+6,将会弹出如下界面
按下Ctrl+6
点击Create按钮,保存新建的动画文件,我命名为pen.anim,创建好后界面如下
创建动画
接下来,就可以开始制作动画了。

二. 简单动画的制作

点击Add Property,选择合适的想要改变的属性,如下图

选择合适的属性
因为我想制作的动画是刷子前后刷动,所以只用改变旋转角度即可,即添加Rotation属性,添加后界面如下
添加Rotation属性
点击左下方Curves按钮,转到曲线界面,如图
转到曲线界面
在合适位置添加几处关键帧,并在关键帧处通过调整Rotation.X,RotationY,Rotation.Z这三个值来改变该帧中毛刷对象的旋转角度,调整方法有三种,一是直接修改数值,二是拉动曲线,三是在Scene面板中直接旋转游戏对象,常用的主要是后两种,调整过程截图如下

调整过程
最后,对毛刷调整好后的曲线如下
调整好后的曲线
注:曲线为直线是因为毛刷为匀速运动,调整关键帧时,默认两帧中间为曲线变化,想要调整为直线可定位到该帧后,右键,选择左边或右边为直线,如图
调整为直线
最后点击运行按钮,就可以看到自己制作的动画的效果了。

三. 创建Controller文件并添加Animator组件完成绑定

此部分在我另一篇教程里已经介绍过,这里再简单提一下。

首先创建一个Animator Controller文件,如图创建Animator Controller文件
我将该文件命名为Cylinder.controller,双击打开它,绘制状态图如下

绘制状态图
设置默认状态为pen,即一进入(Entry)则转换到pen状态,编辑pen状态,设置其Motion为我们之前制作的动画pen。
接下来为Cylinder对象添加一个Animator组件,并设置其Controller为Cylinder.controller,如下图
添加Animator组件
最后点击运行按钮就可以看到我们的笔刷在前后摆动了,一个小小的动画就算完成啦。

参考博客:https://blog.csdn.net/jinxiul5/article/details/82352738

2019-07-28 10:34:23 weixin_44345862 阅读数 196

先上图:
在这里插入图片描述
我主要做了几件事:1.导入kl的unity package并拼接动画,2.添加两个UI中的按钮,Canvas是加载按钮时自动生成的,3.同时用代码实现了另外4个按钮的生成,效果图如下:
在这里插入图片描述
不管什么模型,fbx模型或者unity 包 里面含不含动画是可以在assets中看出来的,恐龙模型包导入后如下图:
在这里插入图片描述 assets中多了一个KL_Model文件夹,点击词文件夹,如下图(KLcontrol是后来我自己建的动画控制器):
在这里插入图片描述 最后面的那个是预制文件又叫prefabs文件,带三角说明下面还有其它文件,点击三角就知道有没有含动画了,如下图:
在这里插入图片描述 有很多,但是都不能播放,需要自己建animator control。步骤如下:预制文件拖入层级目录
在这里插入图片描述 inspector中,controller中是none,此时assets空白处右键->create->animator controller,命名KL-control,然后拖入右侧的controller编辑框中就有了如上图的效果。此时动画控制器内还没有动画,我们双击编辑此动画控制器,如下图:
在这里插入图片描述 默认只有三个状态(每个button是一个状态):Any state,entry和exit。一切从entry开始,其它的连个可以不用。把恐龙预置文件中的动画片段随便选几个一一托到base layer中,在每个按钮上右键->make transition,然后左键点到你想连的按钮(状态)上,就会出现图中的箭头了,其中entry的那个箭头是自动生成的,拖进去的第一个按钮会自动和他建立箭头。保存,然后就可以play看效果了,如果想连续循环播放,只需要将最后一个状态连箭头到第一个状态即可,很棒的,注意inspector中的has exit time一定要是勾选上的状态,此动画默认是勾选了的,CHAN模型就没有,如果没勾选,不会自动顺序播放动画的。
在这里插入图片描述
所有想控制的动作,必须拖到此画布中,可以不连线,但必须在base layer中,否则找不到。动画之间的跳转可以通过按钮控制,我这里在WalkFW和RunFW两个状态之间的连线上加了一个key参数,bool型的,通过按键控制此参数,从而影响动画是否往下播放。具体操作:选中此箭头,左边点到parametres标签中,然后点中间的加号,选中bool,随意命个名,我的为key,然后在inspector中的conditions一栏,点击加号,选择刚才的key,并将其值选为true,意思是为true的时候自动播放后面;如果选择false,那么就有些别扭,意思为:当key值为false的时候,自动播放后面,为了写代码时,好理解,所以选择true.
在这里插入图片描述 不加Key的时候,不用写代码,动画是会自动播放的,这里不是向交互嚒,就加key。然后写代码,附加到恐龙模型上。
在这里插入图片描述 其代码如下:

using System.Collections;
using UnityEngine;
public class BehaviourScript : MonoBehaviour
{

Animator animator;
private float scaleW = 1.0f;        //宽度缩放比
private float scaleH = 1.0f;        //高度缩放比
                                    // Use this for initialization
void Start()
{
    //获取动画组件
    animator = GetComponent<Animator>();      
}

// Update is called once per frame
void Update()
{
    scaleW = (float)Screen.width / 800;     //计算宽度缩放比
    scaleH = (float)Screen.height / 480;    //计算高度缩放比
    if (animator)
    {
        AnimatorStateInfo stateinfo = animator.GetCurrentAnimatorStateInfo(0);
    //    if (stateinfo.IsName("WalkFW"))
        
            if (Input.GetKeyDown(KeyCode.UpArrow))
            {
                animator.SetBool("key",true);
            }
        
    //    if (stateinfo.IsName("WalkFW"))
        
            if (Input.GetKeyDown(KeyCode.DownArrow))
            {
                animator.SetBool("key", false);
            }
        
    }
}

void OnGUI()//代码生成第一个图中左侧的4个大按钮
{
    GUI.skin.button.fontSize = (int)(25 * scaleW);        //调整按钮字体大小

    if (GUI.Button(new Rect(70 * scaleW, 50 * scaleH, 90 * scaleW, 40 * scaleH), "WalkFW"))
    {
        animator.Play("WalkFW");
    }
    if (GUI.Button(new Rect(70 * scaleW, 110 * scaleH, 90 * scaleW, 40 * scaleH), "RunFW"))
    {
        animator.Play("RunFW");
    }
    if (GUI.Button(new Rect(70 * scaleW, 170 * scaleH, 220 * scaleW, 40 * scaleH), "idle"))
    {
        animator.CrossFade("idle", 0.5f);
    }
    if (GUI.Button(new Rect(70 * scaleW, 230 * scaleH, 220 * scaleW, 40 * scaleH), "Attack01"))
    {
        animator.CrossFade("Attack01", 0.5f);
    }

}

}

手动添加按钮的代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

public class buttontest : MonoBehaviour
{

// Use this for initialization
void Start () {

    // 获取按钮游戏对象
     GameObject btnObj = GameObject.Find("Canvas/Button");
             //获取按钮脚本组件
     Button btn = (Button)btnObj.GetComponent<Button>();
            //添加点击侦听
     btn.onClick.AddListener(onClick);
}
void onClick()
 {
     Debug.Log ("click!");
 }
 void Update () {	
}

}
在这里插入图片描述 书上说赋给canvas,我也是这么做的。另外说一句,上图中的fbx格式的熊猫,预制文件展开,很明显都是贴图,就没有动画(害的我一门心思的向给他重组动画呢,野路子下载的模型,根本就不含动画,费了不少时间弄个明白的!)。
按钮肯定要用到代码,就不要想着通过其inspector下面的On click()添加动作了,此平台跟其它的不一样,没那么简单的事情。自己写代码,拖到按钮上是必经之路。除了前面的全代码生成和控制。
在这里插入图片描述

2012-11-29 17:09:33 Sparrowfc 阅读数 18100

用Unity3D也算是好久了,但是每次做项目总还是能学到新的东西。这次做一个TPS的项目就遇到了这样一个问题,如何同时在上下半身播放不同的动画?解决方法其实是很简单,但由于对于动画资源的了解不足导致问题不断,最后是彻彻底底的研究了一遍Unity3D的动画系统(Legacy),虽然4.0出了新的动画控制系统,使用了一下功能相比原来确实强大不少,但还是将这次对于原先的动画系统的学习总结记录下来,毕竟这些动画的概念与策略是通用的,而且因为4.0在mac上目前貌似还没有破解所以项目还是得在3.5上做。相信对于深入理解新的动画系统也会很有帮助。

一、Unity3D动画系统相关类

1.1 AnimationClip

AnimationClip是Unity3D中播放动画的最基本对象,通过FBX导入的各个动画对象其实就是一个AnimationClip。这个类已关键帧的形式记录了骨骼关节在各个时间节点上的位置、旋转信息,根据帧频率frameRate结合播放模式wrapMode通过插值计算即可播放出连续的骨骼动画。

1.2 AnimationState

每个AnimationState包含了一个AnimationClip,并记录这个动画片段的一些播放控制属性,实际上是一个AnimationClip的包装器。

其中比较重要的参数有layer,weight, enabled, speed, blendMode这几项。这些参数的具体含义将在自定义混合动画控制中详细解释,在简单的动画控制时并不需要对AnimationState进行直接操作。

1.3 Animation

Animation是Unity3D的动画播放控制组件,包含了一系列的AnimationState对象,提供各种动画播放及控制方法。常用方法有Play(), CrossFade(), Stop()。在脚本中通过animation即可直接引用同一物体上的Animation控件。


二、简单动画播放控制

所谓简单动画播放控制就是同一时间只有一个动作,比如Standard Assets中的那个水管工,静止idle,走walk,跑run,跳跃jump,攻击attack这些动作都是全身动作,同一时间只应该做一种动作,只有在动作切换时需要将两种切换动作进行混合以达到平滑过渡的效果,以上的操作使用Animation提供的CrossFade()方法即可达到。无论是CrossFade还是Play理论上都只需要在切换动画时调用一次即可,当然重复的调用并不会影响动画的播放,当Unity3D检测到当前播放的动画与函数调用使用的动画一样后会忽略该次调用。


三、自定义混合动画控制

3.1 多动画同时播放的需求

在大多数情况下简单的动画播放控制已经足够,然而当游戏变得复杂时,单动画播放带来的问题就是美术工作量的急剧增加。

最为典型的就是第三人称射击(动作)游戏,通常来说游戏中的人物会有各种上身动作如瞄准、射击、换子弹等,而下身则对应站立,行走(通常还是四个方向的行走动作)。这时候如果只能播放一个动作的话就需要美工制作大量的动作(站立瞄准、站立射击、跑步瞄准、跑步射击等等),其工作量可想而知。显然,最为效率的方式是美工分别做出上半身以及下半身的动作,然后由程序根据游戏角色的操作将两者动作混合起来同时播放。而这就涉及到了多动画同时播放的需求。此时简单的CrossFade()方法已经不能满足了,我们需要通过AnimationState来对动画播放进行自定义的控制。

3.2 使用AnimationState控制动画播放

Unity3D的动画播放实际上都是通过AnimationState来进行控制的,Animation组件中提供的CrossFade,Play等方法其实就是将一系列对AnimationState参数进行设置的操作进行了封装。

其中主要相关的参数有四个:

layer: 该动画片段(AnimationClip)所在的播放层次。

weight: 该动画片段在动画混合中所占的权重(0~1)

enable: 该动画片段是否进行播放

blendMode: 混合方式,有两种Blend和Additive

默认初始化情况下Animation组件中的全部AnimationState的layer=0,weight=0, enable=false。Animation组件默认播放的AnimationState的layer=0, weight=1, enable=true。

 

一、Unity3D动画播放策略

Unity3D在进行动画播放时按照下面的策略进行:

1.找到最高一层的全部AnimationState

2.将其中enable为true且weight > 0的AnimationState中的clip加入混合池(虚构的一个概念)

3.如果当前混合池中全部blendMode为Blend的clip的权重相加少于1,则找到下一层的全部AnimationState。重复2.

4.对混合池中的全部clip进行混合操作,生成最终的动作。

在进行最终混合时所有clip的实际权重会进行归一化处理,即相加为1,处理时根据blendMode的不同结果也会有所差异,下面的例子会进一步说明。

 

二、使用AnimationState控制播放的实例

举几个实际的例子对Unity3D的动画混合策略进行说明。对于AnimationState的设置全部放在Start或Awake中进行。并且注意把Animation组件中的默认播放动画设为None,取消选中Player Automatically,原因正如前文所述,默认播放的AnimationState参数初始值与其他State不同,会对实验造成影响。

1. 同一层动画的混合播放

AnimationState right= animation[“run_right”];

AnimationState idle= animation[“idle”];

right.layer = 1;right.weight = 1; right.enable = true;

idle = 1; idle.weight= 1; idle.enable = true;

 运行结果是角色动画介于行走与静止之间,体现两个动画1:1的混合效果

2. 高层动画覆盖下层动画

 right.layer = 1; right.weight = 1;right.enable = true;

idle = 0; idle.weight = 1; idle.enable = true;

 运行结果是角色行走

3. 高层动画与下层动画混合

right.layer = 1; right.weight = 0.5f; right.enable = true;

idle = 0; idle.weight = 1; idle.enable = true;

运行结果与1相同,idle的实际weight为1 * (1 – 0.5f)

4. 使用Additive混合不同层动画

right.layer = 1; right.weight = 1; right.enable = true;

right.blendMode = BlendMode.Addictive;

idle = 0; idle.weight = 1; idle.enable = true;

 运行结果与1相同,idle的实际weight为1/(1+1)

 

三、其他的动画播放控制参数

speed: 控制动画播放速度,比如调整射击速度就是将该值提高

time: 当前动画所在时间点

warpMode: 动画循环方式,有一次、循环、镜像循环PingPong

3.3 自定义动画过渡

动画过渡实际上就是两种动画混合权重的过渡,前一种动画的权重由1渐变为0,后一种由0变为1,由此实现动画的平滑过渡。在实际操作时,并不需要过渡时在Update()中每帧去调整两种动画AnimationState的权重weight。Animation控件提供了Blend()方法帮助在后台自动计算这种过渡,其使用方法与CrossFade类似,详见Unity3D的script手册。

3.4 Play(), CrossFade()背后的操作

了解这些基本方法背后进行的操作在同时使用AnimationState对动作进行控制时十分有用。

首先是Play(stringanimationName)(Play() = Play(default Animation name))这个方法实际上是将animationName所在层的全部其他AnimationState的weight置为0,enable置为false,将animationName的weight置为1, enable置为true。

CrossFade()与Play()大致相同,只不过他并不直接将其他的AnimationState的weight置为0,而是调用Blend()方法将其向0进行渐变,一旦该AnimationState的weight变为0再将其enable设置为false。

由此可见,当你设置了多层AnimationState后,仅仅调用这两个方法很可能并不能达到你想要的动画控制效果。当然,这两个方法最后有一个默认参数PlayMode来调整执行策略(区别就在于操作对象仅仅在该层还是全部AnimationState对象),总之这一节通过阐述Play与CrossFade背后的操作,希望使我们在使用AnimationState进行混合动画控制编程时能够正确的使用这两个方法以达到期望的效果。

3.5 局部动画

以上所介绍的AnimationState操作只是多动画的手动播放及混合控制,还并没有涉及到如何向开头所讲的上下半身播放不同的动画。要在同一个角色上同时播放两个不同的动作使用局部动画即可。

一、生成局部动画

在Unity3D中有两种方式实现局部动画,一是使用AnimationState的AddMixingTransform方法,该方法传入一个骨骼节点的Transform,调用后该动画片段AnimationClip便只会影响该节点及其子骨骼,而对其他骨骼关节并不再影响。

另一种方法是在动画模型制作时就只对局部的骨骼制作动画,其他骨骼在整个动画片段中都保持不变,这样生成的动画片段AnimationClip中就不会包括对那些不变骨骼的关键帧信息,也就不会对其他骨骼关节进行影响。(这是我根据动画播放的实际控制结果进行的推测,在Unity3D的官方文档中好像并没有直接说明,仍需查证)

了解第二种方法十分重要,虽然还只是推测。因为在与美术沟通前你可能并不知道导入的是一个局部动画,而将其当成全身动画,使得在进行动画混合控制时产生了意想不到的结果。我在一次项目中发现明明角色应该进入idle状态,但是双腿仍然在跑动,为此花了两天时间查证,也是直接促成了这篇文章的诞生,最终发现原来美术给的idle只有上半身有动画,下半身没有,因此虽然idle比跑动高一层,但下半身并不能覆盖。

 

二、局部动画的混合

局部动画的混合策略与前述Unity3D动画播放策略相同,只不过只是影响局部骨骼。这也就是说,上半身与下半身的动画无论谁所在的层更高,权重多少都不会影响另外半身的动画播放。但是上层的半身动画会覆盖下层的全身动画或与之混合,而全身动画中不包含在半身动画中的骨骼则完全不受影响。


四、射击类游戏应用

参考Unity3.5的官方例子Angry Robot。在这个例子中很好的实现了上下半身的独立旋转,射击动作与跑步动作的半身分离。这一节以此作为样例进行分析。

动作资源:

run_forward,fun_backward, run_left, run_right。四方向的跑动,全身动作,全部置于第1层。

Idle。静止,全身动作,位于第2层。

Attack。攻击,半身动作,位于第4层。混合方式Additive

操作控制:

初始化,全部动作的weight置为1,Attack的enable置为false,其余为true。这样初始状态下Attack不播放,Idle覆盖跑动动作,角色表现为静止站立动作。

移动时将Idle的weight根据速度向0渐变,开放跑动动作。使用CrossFade()在四个跑动动作中选择合适的动作进行播放。停止时再将Idle的weight逐渐置为1,重新覆盖跑动动作。

攻击时将Attack的enable置为true,停止攻击时置为false。由于Attack动作在最高层,且混合模式为Additive,因此站立攻击时Attack动作与行走动作上半身进行混合,跑动攻击时Attack动作与跑动动作上半身进行混合。


unity3d播放帧动画

阅读数 627

没有更多推荐了,返回首页