立即注册
登录
搜索
前端开发
后端开发
虚幻引擎
U3D引擎
体感研发
数据库
论坛
BBS
本版
帖子
用户
麒麟软控
»
论坛
›
麒麟软控
›
U3D引擎
›
U3D动画初识
返回列表
发新帖
U3D动画初识
哈呵哈
哈呵哈
当前离线
积分
15
5
主题
5
帖子
15
积分
新手上路
新手上路, 积分 15, 距离下一级还需 35 积分
新手上路, 积分 15, 距离下一级还需 35 积分
积分
15
发消息
发表于 2023-3-3 22:32:04
|
显示全部楼层
Animation
个游戏物体可以通过Add Component添加Animation组件
之后选择该物体,点击Window菜单栏下的Animation选项,之后点击Add Property添加一些简单的动画
可以进行通过设定动画的不同时间时对游戏物体的移动、旋转、缩放等操作。并且在过程中还可以加入事件,如下图时间线下的蓝色事件。
选中事件后可以在unity的Inspector窗口下的Animation Event添加调用方法。
动画一些相关类的操作
Animation类:可以通过GetComponent<Animation>();方法获取游戏物体的Animation组件。
Animation类下有Play()方法,如果无参会默认播放组件下默认的动画,如下图
Play()方法的重载:Play(&#34;(string)动画名&#34;);播放指定animation。游戏物体下的全部animation可以通过点击Animations查看
[&#34;(string)动画名&#34;]:获取该动画的状态,返回值类型为AnimationState。
AnimationState类
AnimationState类下的属性访问器有time;speed等,可以获取动画的初始时间,和播放速度。比如简单制作一个简易的电梯。进入触发时上升,离开时下降。
Animator
新型动画
新型动画在Inspector窗口中会有这三种选项,第一项为模型的一些选项,第二项为动画的类型,第三项为动画的一些属性。
第二项下有下图所示,Animation Type为动画类型,Avatar Definition为阿凡达创建的方式,可以从模型中创建或是通过其他的阿凡达拷贝(一般有骨骼的使用第二种方法)。
一个新型动画种类通常使用的有Generic(普通类)和Humanoi(人形类),一般所用低模的话可以使用Generic类,消耗性能低,而使用Humanoi类可以完成更高端的需求,比如骨骼遮盖等。Avatar Definition为阿凡达创建的方式,可以从模型中创建或是通过其他的阿凡达拷贝(一般有骨骼的使用第二种方法)。
在Animations选项卡下有以下内容。
可以Clips下点击加号即可添加新的动画。
Loop Time选项是指是否循环播放,如果选中Loop Time,则循环播放,Loop Pose是指动画的初始帧和最后一帧的衔接程度,下面的三个Root Transform选项是记录动画完成后和原位置的衔接程度。其中绿灯表示衔接得好,黄色表示衔接一般,红色表示衔接不行。可以点击Loop pose、Bake Into pose等选项对动画属性进行烘焙,可以使动画初始帧和结束帧衔接或者使动画结束后位置、旋转不变。
还有常用属性Curves可以点击添加,参数的数值可以随曲线每帧变换。此参数也可以通过Animator类下的GetFloat(string name)获取Animator组件下名为name的参数值。
另外可以添加动画事件,如下图,其中动画人物的脚本包含名为EventTest的方法,在对应帧即可调用EventTest方法(注:动画事件的权限必须是public,方法必须是动画人物所在脚本上的,方法参数只能增加一个,只能[float,int,object,string]类型)。
具有Animator组件的游戏物体可以添加Animator Controller组件(动画状态机)
右键创建即可,选中Animator Controller组件后选择菜单栏Window中的Animator选项卡即可对这个动画控制器进行编辑。
动画状态机
上图面板为动画状态机,表示动画的不同状态以及不同状态之间相互切换的决定参数。可以右键点击动画进行切换操作。动画状态机左上角有两个选项卡,第一个为层,第二个为决定参数。二者都可以通过点击加号添加。
右键点击动画状态选择Make Transition即可选择切换到的动画,完成动画切换操作,如箭头所示;选中接头即可选择切换的结束时间、衔接动画、决定参数等信息。
Has Exit Time是指加入退出时间,选中后如果想切换到下一个动画状态需要等到当前动画状态结束后切换。Transition Durator是指过度时间,是指在当前动画状态切换到另一动画状态中两帧之间加入衔接,一般此项是清零的。在Conditions选项卡下可以选择决定参数以及决定的条件。
通过脚本Animator类中的SetBool(string 布尔参数的名字,true/false)、SetTrigger等方法控制决定参数的改变。
在动画状态机空白处右键点击即可出现下面选项可以创建融合树与子动画状态机。
融合树
双击创建好的融合树
最左边为融合树的决定参数,右边是不同的动作状态,融合树可以通过调整决定参数完成一个动作状态向另一个动作状态的融合。
在Inspector窗口中有以上内容,其中Blend Type为融合类型,展开如下图,其中1D是指一个参数控制,上面的四个三角形表示四种不同Motion权重随着决定参数变化的程度,第二个数字为阀值,控制不同状态的切换融合,第三个数值默认为1,可以设置别的数值,指的是动画播放速度。后面的勾选上表示镜像动画。
1D动画面板如下图,Threshold为阈值,决定参数的大小根据阈值判断动画状态的融合度,最后一个选项为镜像。在Automate Thresholds选项上取消勾选可以自己设置阀值。
2D简单融合面板如下图,parameter为决定参数,可以调整决定参数控制两个或多个动作类型的融合程度。2D是两个参数融合,2D Simple Directional为两个参数控制动画方向不同,如向左走向右走,2D Freefrom Directional也是两个参数控制不同方向动画,但需要其中一个动画是无方向动画,2D Freefrom Cartesian也是两个参数控制,自由融合没有方向限制。最后一个Direct会融合全部动画,很暴力。
这里演示一下控制角色(站立->走->跑->左转/右转)用2D自由融合
在参数面板下新建两个新的参数用来控制几种状态(注:融合树下的参数都是float类型),这里命名为speed和angler,点击Compute Position下拉菜单在X Position From选择Speed(第一个参数控制速度)
然后Y Position From选择Angular Speed(Rad/Deg(角度/弧度))。选择完成后两个参数的阈值自动设置成功。可以通过speed和angler控制角色的多种动作。
Animator类下的一些回调
SetFloat/Bool/Int/Trigger:前三个需要设定参数(参数名和值大小),SetTrigger不需要参数。例如SetFloat(&#34;speed&#34;,0.2f); SetTrigger(&#34;die&#34;);
GetFloat/Bool/Int(string name):需要设定参数名字。
GetCurrentAnimatorStateInfo(int layer):需要设定参数(层级数)可以获取Animator组件下当前状态机layer层级下的动画状态信息。
GetCurrentAnimatorStateInfo(int layer).IsName(string name):当前状态机此层级layer层级下播放动画名称是否为name,返回值为bool类型。
GetCurrentAnimatorStateInfo(int layer).IsTag(string Tag):当前状态机此层级layer层级下播放动画标签是否为Tag,返回值为bool类型。
子状态机
双击打开创建好的子状态机,在子状态机内部Make Transition连接到Base layer可以选择返回的动画状态,或者是上一层状态机。从而控制动画状态的切换,如果动作状态太多可以多使用子状态机使逻辑清晰。
层级类型
不同层级会有层级关系,层级序号从0依次增加,在动画控制器不同的层级通常设置权重(Weight)和骨骼遮盖(Mask)控制不同层的遮盖情况。通常权重越大,就会执行该层的动画状态,而在相同权重的情况下,可以创建骨骼遮盖,控制模型的一部分执行该动画,其余部分执行其它层的动画。
Animator类下有一些方法:
SetLayerWeight(int Layer,float weight):设置Layer层的权重为weight。
骨骼遮盖如下图,红色为遮盖住的部分即不执行动画状态,绿色为执行动画状态。
反向动力学
IK意为支持反向动力学,反向动力学即依次反向确定模型的位置,即:手指—手肘—小臂—大臂。
点击动画控制器一层旁边的齿轮出现如下面板,点击IK Pass即可使用反向动力学
反向动力学的回调
void OnAnimatorIK(int layerindex){
}
其中参数为层级为layerindex的状态机。
在这个回调中可以使用Animator类下
SetIKPoinWeight(AvatarIKGoal.模型部位,float 权重)方法设置模型某一部位的权重。AvatarIKGoal为模型部位的枚举值。
SetIKPosition(AvatarIKGoal 模型部位,Vector3 位置)可以运用反向动力学使模型该部位指向三维向量的位置。
void OnAnimatorIK(int layerindex){
if(layerindex == 1){
//AvatarIKGoal:IK部位枚举
getComponent<Animator>().SetIKPositionWeight(AvatarIKGoal.RightHand,1);
getComponent<Animator>().SetIKPosition(AvatarIKGoal.RightHand,enemy.Position);
}
}
上一篇:
如何改进Unity3d手游启动速度?
下一篇:
U3D开发和一般的软件开发在编程方面有何不同?
回复
举报
使用道具
分享
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
快速回复
返回顶部
返回列表