FPS游戏框架漫谈第五天

今天想了想整理下AnimatorManager 他的职责是负责动画的播放,那么在介绍该对象具备的对外接口,必须先介绍下拥有动画的对象他是怎么管理动画数据的,打个比方如果我们一个把武器需要播放开火动画,那么我们基于unity引擎可视化动画编辑器直接在动画状态机中对动画之间的联系进行编辑器,然后保存起来。 但是???????????????
今天我们要说的是假如我们没有编辑器的帮助,假如这个动画状态机由我们自己建立Json文件并解析出来 提供给我们播放动画的业务逻辑用呢。那么现在我要实现这样一个功能我的武器在开火之后自动回到idle状态。那么我们的AnimatorManager 必须具备一个Tick行为,然后假如我们的开火和自然状态之间通过触发器进行关联,也就是开火之后,会自动回到idle状态,并且支持我开火之后可以停留多久才进入idle的逻辑。
那么AnimatorManager的Tick行为必须干一件事,什么事呢,那就是轮询触发器数据,那么我们AnimatorManager对外的播放动画的接口其实就是把触发器的数据加入缓存,等待Tick到进行执行,并不是直接调用unity引擎提供的Animator.Play去播放了。
下面先想下我的武器的状态机Json文件怎么去组织,首先我们可以把AnimatorManager看成一个状态机对象,那么状态机支持多层的 那么我们就可以定义一个叫AnimatorControllerLayer的对象去对应一个层,我们继续深入研究一个Layer层中有什么呢,打开我们的unity引擎找到一个武器打开他的状态机(哈哈 啥都没有啊) 加动作 创建动作之间的转换关系以及转换条件 直到武器有正常的开火动作等其他。好了我们是不是发现其实layer层就是由很多的状态数据组成的。同时发现没有unity中还有一个默认的状态数据
一般情况都是"DefaultState":“Idle”
那么照旧啊 我们定义一个叫AnimatorControllerState的对象来表示玩家可以添加的动画数据 注意啊默认的状态数据其实是属于AnimatorControllerLayer的一个字段 不是AnimatorControllerState
好了 那么AnimatorControllerState中包含什么信息呢 ???????? 第一个是一个动画片段的名字 第二个字段其实是一个数组 也就是记录了第一个动画片段可以过度的一些动画片段集合
那么这个动画片段集合可以叫AnimatorStateTransition 他包含的参数是什么呢
1.第一个目标动画的名字 有了这个数据当我要开火之后 我要查看我可以转换到idle不,那么目标
2.是否可以流转回自身 也就是我播放了过度之后的动画 我能不能回到原先动画
3.有没有离开时间 支持延迟过度动画
4.条件集合 可以采用AnimatorCondition对象来表示 可以存在多个条件 该条件决定了什么情况下可以过度

下面先给出状态机JSON文件
{
"Layers":[
	{
		"DefaultState":"Idle",
		"States":[
			{
				"Name":"Any",
				"Transitions":[
					{
						"DestinationState":"StartFire",
						"CanTransitionToSelf":false,
						"HasExitTime":false,
						"Conditions":[
							{
								"Mode":1,
								"Parameter":"Fire",
								"Threshold":0
							}
						]
					}
				]
			}
		]
	}
],
"parameters":[
{
		"defaultBool":false,
		"defaultFloat":0,
		"defaultInt":0,
		"name":"Fire",
		"type":1
	}
]

}
第六天继续…

你可能感兴趣的:(unity,FPS,游戏)