Unity3d中unity3d 语音识别别遇到的哪些事

程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之在项目中使用Unity4新Mecanim动画(五十三)
Unity3D研究院之在项目中使用Unity4新Mecanim动画(五十三)
围观41934次
编辑日期: 字体:
Unity4的Mecanim动画很早以前就有体验过,迟迟没有加到项目中有两个原因,今天写这篇博客来记录我在做的过程中遇到的一些问题。
1.以前的代码代码量比较多,修改起来动的地方太多了。
2.使用Mecanim动画,还得需要美术的动画做配合才行。
在3.x中播放动画的时候使用Play()或CrossFade(),直接播放动画 或淡入淡出播放动画。
animation.Play("name"); animation.CrossFade("name");
也可以使用队列播放,让动画形成一个队列。
animation.PlayQueued("name"); animation.CrossFade("name1");
我举一个我现在项目的例子。主角攻击敌人是一套连招,连招一共分为4套动画。也就是当玩家连续按下4次攻击键时这四套动画是连续播放的,假如玩家只连续按下2次攻击,可能只会播放前两套动画。代码中你需要判断其中某个动画是否播放完毕,只有播放完毕才能继续播放下一个动画。
if(animation.isPlaying)
if(animation.IsPlaying("attack1"))
大家在仔细想想这个命题,我们可以把动画分成4中可能的队列,也只可能分为这几种队列。
站立动画- 》攻击动画0 -》站立动画
站立动画- 》攻击动画0 -》攻击动画1 -》站立动画
站立动画- 》攻击动画0 -》攻击动画1 -》攻击动画2-》站立动画
站立动画- 》攻击动画0 -》攻击动画1 -》攻击动画2-》攻击动画3-》站立动画
此时如果用unity3以前的动画方式,无非就是上面这几种方法加上一些逻辑判断完成。现在Unity4加入了Mecanim动画,可以很好的帮我们解决这个问题。详细的动画使用教程我就不多说了,网上已经有很多人写过了。
如下图所示,以前我们在使用模型的时候。一个原始模型,原始模型中没有动画。然后是动画模型,每一个动画都会依赖原始模型。动画的名称末尾用 名称 + @name来表示。 这样的做法使用起来非常方便,但是由于每一个动画都会依赖原始模型所以文件会非常大。
Unity4已经将默认模型与动态导入的类型做了修改,你会发现你的模型拖拽入Hierarchy视图中没有Animation组件而是Animator组件。如果你还是想在Unity4中使用以前的动画系统。你需要把每个模型和动画的类型改成 Rig-& Animation Type -& Legacy,如下图所示。
手动的改起来会非常的累。建议你将下面这条脚本放在项目Editor文件夹下(没有创建一个)。这样当你将模型或动画拖入Project视图中,程序会自动帮你修改它的类型,显然Unity已经不建议大家继续使用以前的动画系统了。
12345678910
using UnityEditor;&public class MyEditor : AssetPostprocessor{&&&&public void OnPreprocessModel()&&&&{&&&&&&&&ModelImporter modelImporter = (ModelImporter) assetImporter;&&&&&&&&
modelImporter.animationType = ModelImporterAnimationType.Legacy;&&&&}&& }
下面开始说说新的动画。在Animations选项卡中先勾掉Import Animation 点击Apply。如下图所示,在Rig选项卡中修改Animation Type的类型为Humanoid。 如果你希望现在选择的这个模型做为标准模型的话,在Avatar Definition中选择Create From This Model。点击下方的Configure可以预览你的骨骼。
让美术修改一下以前的动画,将动画中的原始模型去掉,这样还可以减少文件的大小。然后在Porject视图中找一个原始模型拖拽入右侧Preview中,可以看到这个模型已经播放奔跑动画。
此时换一个模型拖入同样可以预览奔跑效果。
如下图所示,在动画的.fbx中 因为动画需要用刚刚生成的骨骼。所以这里Avatar Definition中你需要选择Copy From Other Avatar 。在Source中选择刚刚生成的Avatar 以后所有动画都需要这样来设置。。
下面我们来让这个女模型和男模型共用男模型的那一套动画,在游戏视图中播放。在Project视图中选择Crate-&AnimatorController。然后把Project中男模型和女模型都拖拽入Hierarchy视图中。 将刚刚创建的AnimatorController放置在Controller处。
此时在Unity导航菜单栏中选择Window -》 Animator。 将动画文件拖入Animator窗口中,你会发现两个模型都开始发生运动。如下图所示,黄颜色表示它为原始动画,也就是根动画。用箭头将它们一一前后相连,箭头实际上就是动画播放的条件。请注意看图中两个蓝色的箭头,A播放完后将会播放B动画,可是B却对应了两个箭头,也就是说B播放完后可以播放C也可以回过头来播放A。
那么B播放完到底是播放C还是播放A呢?用鼠标点击一下箭头,看看这这两个箭头的条件吧。分别点开BA 和BC的两个箭头,在右侧监测面板视图中你都会发现Conditions下有一个Exit Time的条件。根据动画的不同对应数值也会不同,我的数值是0.94。也就是当B动画播放0.94s后将播放下一个动画。默认BA和BC的动画时间是一样的,Unity会有限选择下一个动画,也就是A -》 B-》-》C-》D-》A这样循环播放下去。假设我现在需要动画是 A-》B-》A这样循环播放,只需要修改一下BA箭头的条件,将Exit Time改小一点只要比BC箭头上的小就可以。。 其它的播放虚列原理类似。。
接着还有问题了,用时间来做动画切换的条件是不是有点太限制了。Animator还支持自定义条件,在Animator窗口的左下角处,点击“+”按钮就可以添加变量。这里我添加三组变量, float 、int、bool。
变量添加完毕后,继续点击箭头的条件,箭头上可以有一个条件 或者多个条件。如果是多个条件需要多个条件同时满足才可以。 Conditons左键是变量名称,中间是变量条件,右边是变量值。
Greater 表示左边变量大于右边时触发
Less 表示左边变量小于右边时触发
Equals 表示左边变量等于右边时触发
NotEquals表示左边变量不等于右边时触发。
int 变量上述四种都有,float变量只有Greater 和Less, bool变量只有true和false。
此时我们在加深一下理解。选择AB的箭头,也就设置A动画切换B动画的条件。
5 表示 当ft的值大于5的时候触发。
3 表示 当 it的值小于3的时候触发。
表示 当ib的值等于true的时候触发。
只有上述三种条件全部达成时将A动画将切换播放B动画。否则将一直停留在播放A动画处。
那么ft it ib的这三个变量到底在那里设置呢?如下图所示,才记得前面我们创建的三个变量吗? 这三个变量对应的值就是右边的 0.0 0 false 。在编辑器中你可以通过修改这三个数值来满足播放动画的条件。可是在代码中怎么办呢?
在代码中你可以这样来设置或变更它们的条件。 如果说你需要在程序中判断当前动画的一些信息,可以使用 GetCurrentAnimatorStateInfo(0),我查了一下Animator不能直接拿到当前播放动画的名称, 只能拿到它对应的Has值,也就是说你需要将原始的动画名称转换成Hash来判断。
1234567891011121314151617181920212223242526272829303132333435363738
using UnityEngine;using System.Collections;&public class NewBehaviourScript : MonoBehaviour {& private Animator animator ; void&&Start() {
//得到Animator对象
animator = GetComponent&Animator&(); }& void OnGUI() {
if(GUILayout.Button("play",GUILayout.Width(50)))
&&&&//在这里设置变量的条件
animator.SetFloat("ft",6f);
animator.SetInteger("it",2);
&&&&animator.SetBool("ib",true);&
} }& void Update() {
AnimatorStateInfo animatorState = animator.GetCurrentAnimatorStateInfo(0);&
if(animatorState.IsName("Base Layer.Run_FastStop_Idle"))
Debug.Log("动画相等");
Debug.Log("动画不等");
另外Mecanim还支持多个动画的混合。目前Mecanim还有一个最大的难题,也是文章最上面我说的需要美术配合的那部分。之前我们看到的动画都是应用于人型模型,也就是说它支持人形的骨骼, 举个例子我们的项目人和武器是两个骨骼,这样在用Mecanim就悲剧了。因为不同模型武器的骨骼不一样所以公用模型的话会出现武器位置不对的情况。最后我想到的办法就是美术将以前做的武器骨骼重新导出,每个人对应一套自己武器骨骼(或者一些特殊的骨骼)最后生成武器的动画 ,比如 站立动画、攻击动画、死亡动画等。当Mecanim播放动画的时候,同时在播放该模型对应的武器动画,我想这样就可以解决这个问题吧。。
最后欢迎大家一起讨论。。
今天有朋友QQ上问了我已下,是不是非人形动画还得使用老的动画系统?如下图所示,当你把模型导入Unity的时候,这里可以选择它的类型。
legacy:是老的动画系统,这里就多说了。
Generic:是新的动画系统,它就是支持非人形的动画,建议使用它。但是它不能向Humanoid重定向动画。
Humanoid:就是新的人形重定向动画系统。
本文固定链接:
转载请注明:
MOMO与MO嫂提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之脚本实现模型的平移与旋转(六)
Unity3D研究院之脚本实现模型的平移与旋转(六)
围观30054次
编辑日期: 字体:
这一章MOMO带大家讨论一下Unity3D中使用的脚本,脚本的最大特点就是用少量的代码实现繁多的功能,避免大量的代码。Untiy3D这一块可以使用脚本做很多东西,那么我们开始学习脚本吧。
有关Unity3D 脚本的API所有文档盆友们都可以去这里查阅。
官方API 文档:
Scripting inside Unity consists of attaching custom script objects called behaviours to game objects. Different functions inside the script objects are called on certain events. The most used ones being the following:
This function is called before rendering a frame. This is where most game behaviour code goes, except physics code.
FixedUpdate:
This function is called once every physics time step. This is the place to do physics-based game behaviour.
Code outside any function:
Code outside functions is run when the object is loaded. This can be used to initialise the state of the script.
Note: Sections of this document assume you are using Javascript, but see Writing scripts in C# & Boo for information about how to use C# or Boo scripts.
大概意思是介绍三个重要的脚本函数
Update:这个函数在渲染帧之前被调用,大部分的游戏行为代码都在这里执行,除 物理代码。
FixedUpdate:这个函数在每进行一次物理时间步调时被调用,它是基于物理的游戏行为。
Code outside any function:这类函数在对象加载时被调用,它可以用来脚本的初始化工作。
本章我们着重讨论Update 这个函数,创建脚本与绑定脚本的方法在第二章中已经介绍过了不会的盆友请去那里阅读。虽然官方推荐脚本使用JavaScript编辑,但是其实C#更符合Unity3D的编程思想,推荐新人先使用JavaScript,然后在学习C#,因为JavaScript更容易上手一些。
在三维世界中创建两个矩形,然后在添加两个脚本分别绑定在这两个箱子上,脚本的名称暂时命名为 js0 、js1。
在Project 页面中打开刚刚创建的js0,发现Unity3D 已经将Update 函数添加在脚本中了。
模型的移动
Translate方法中的三个参数分别标示,模型在三维世界中X 、Y、Z 轴移动的单位距离。
<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e
function Update () {&//模型x轴,移动一个单位transform.Translate(1,0,0);&//模型y轴,移动一个单位transform.Translate(0,1,0);&//模型z轴,移动一个单位transform.Translate(0,0,1);&}
执行代码发现参数为1速度居然移动的着么快,怎么能修改移动的速度呢?
Time.deltaTime:标示上一次调用Update一秒为标示每帧执行所消耗的时间。
有了这个参数,我们就可以根据它修改方向移动的速度了。
<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e
function Update () {&&&&&//设置移动的范围&&&&var translation : float = Time.deltaTime * 10;&&&&&//移动的方向&&&&transform.Translate (translation, 0, 0);&&&&transform.Translate (0, translation, 0);&&&&transform.Translate (0, 0, translation);&}
模型的平移可以选择一个参照物,下面代码第二个参数设置模型移动参照物,这里设置成摄像机。那么模型将以相对与摄像机进行移动。
123456789101112131415
function Update () {&&&&&//设置移动范围&&&&var translation : float = Time.deltaTime * 10;& //相对于摄像机,模型向右移动。 transform.Translate(Vector3.right * translation, Camera.main.transform);& // 相对于摄像机,模型向上移动。 transform.Translate(Vector3.up * translation, Camera.main.transform);& // 相对于摄像机,模型向左移动。 transform.Translate(Vector3.left * translation, Camera.main.transform);& }
模型的旋转
Rotate方法中的三个参数分别标示,模型在三维世界中X 、Y、Z 轴旋转的单位距离。
<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e
function Update () {&&& //以模型X轴旋转,单位为2.&& transform.Rotate(2, 0, 0);&&& //以模型Y轴旋转,单位为2.&& transform.Rotate(0, 2, 0);&&& //以模型Z轴旋转,单位为2.&& transform.Rotate(0, 0, 2);}
模型的旋转可以选择一个参照物,下面代码第二个参数设置模型移动参照物,这里设置成3D世界。那么模型将以相对与整个3D世界进行旋转。
<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e<div class="crayon-num" data-line="crayon-55e15e<div class="crayon-num crayon-striped-num" data-line="crayon-55e15e
function Update () {&&& //设置旋转的范围&&&&var rotate : float = Time.deltaTime * 100;&&&&&//旋转的方向&&&&&//相对于世界坐标中心向右旋转物体&&&&transform.Rotate(Vector3.right * rotate, Space.World);&&&&& //相对于世界坐标中心向上旋转物体&&&&transform.Rotate(Vector3.up * rotate, Space.World);&&&&& //相对于世界坐标中心向左旋转物体&&&&transform.Rotate(Vector3.left * rotate, Space.World);}
如下图所示,给出一个小例子,在脚本中移动箱子的坐标,在屏幕中记录模型移动的位置,并且显示在游戏视图中。效果很不错吧,嘻嘻~~
123456789101112131415161718192021222324252627282930313233343536
//X轴移动位置var posX : float;//Y轴移动位置var posY : float;//Z轴移动位置var posZ : float;&function Update () {&&&//设置移动的范围&&&&var x : float = Time.deltaTime * 10;&&&&var y : float = Time.deltaTime * 8;&&&&var z : float = Time.deltaTime * 5;&&&&&//移动的方向X轴&&&&transform.Translate (x, 0, 0);&&&&&//移动的方向Y轴&&&&transform.Translate (0, y, 0);&&&&//移动的方向Z轴&&&&transform.Translate (0, 0, z);&&&&&//赋值计算模型在三维坐标系中的位置&&&& posX += x; &&&& posY += y; &&&& posZ += z; }&function OnGUI () {&&&&&//将坐标信息显示在3D屏幕中&&GUI.Label(Rect(50, 100,200,20),"x pos is" + posX +"float");&&&&GUI.Label(Rect(50, 120,200,20),"y pos is" + posY +"float");&&&&GUI.Label(Rect(50, 140,200,20),"z pos is" + posZ +"float");&&&}
Unity3D 的世界中脚本还可以做很多事情,以后我在慢慢向各位道来~ 欢迎各位盆友可以和MOMO一起讨论Unity3D游戏开发,哇咔咔~~~
本文固定链接:
转载请注明:
MOMO与MO嫂提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!Unity3D如何获取中键事件?_百度知道
Unity3D如何获取中键事件?
再Unity3D如何获取鼠标中键的滚动事件?
提问者采纳
鼠标滑轮吗?Input.GetAxis(&Mouse ScrollWheel&)就是
提问者评价
来自团队:
其他类似问题
类似于Keybd_event和SendKeys,目的就是在不按键的情况下让代码通知程序认为某个键被按下,触发按键事件。因为要把现成的PC程序移植到手机中,改操方式作很繁琐,想要直接把原来的键盘事件映射到手机平台的虚拟按键中。按下某个虚拟按键就模拟出如空格键按下的事件。达到模拟键盘操作的目的。
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁5307人阅读
因为近期项目的需要开始研究metaio sdk。
&&&&& metaio算得上AR界的大家!从mobile到win,从消费类应用到工业级,是我见到的最牛的AR公司了。
废话少说,下面说说如何3d tracking
1.&&&&利用Toolbox制作点云文件(.3dmap和.3dcreatormap),他们分别用于metaiosdk 和metaiocreator。其中,metaio中使用的时候,文件路径不能有中文,否则加载的时候报错。
2.&&&&unity &#43; metaio sdk中导入3dmap文件:
A. 给3dmap加一个后缀“.bytes”,,这样unity才能识别;但是在使用的时候,SDK4.5以后的版本不用加后缀,算然unity不能识别,但是正常使用。
B. 把文件放到Resource\metaio路径下;直接放到StreamingAssets中也可以。
C. 添加到metaioSDK脚本的属性中:SteamingAssets或者AbsolutePath。
3.&&&&一个环境追踪:
直接利用metaioSDK脚本。SelectConfiguration选择AbsolutePath…,然后填写3dmapfile的路径,如tracking.3dmap。
4.&&&&注意事项:
在利用toolbox制作ios和android中,勾选gravity选项;windows平台的应用不能勾选gravity选项。
toolbox工具,据我所知只有ios版本,并且制作3dmap只有这么一个工具。当然也可以自己写程序生成这么一个文件。
由于初学,不当之处望高人指点一二。
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:16522次
排名:千里之外
评论:14条

我要回帖

更多关于 unity3d 手势识别 的文章

 

随机推荐