小贴士:
获取组件:GetComponent<T> T:要获取的组件类型设置
动画状态:Animator.SetBool(“变量名字“,变量值)
lnput.GetKeyDown(KeyCode.按键名)
距离判断:Vector3.Distance (坐标1,坐标2) ;
[坐标在物体的Transform上,自己身上直接transform.position,别的物体上即变量名.transform.position]
注意transform虽然是组件,但是是特有的(有且仅有一个,且不可被移除),所以可以直接调用,而没有用GetComponent<T>
还有一个gameObject(小写)是特指当前物体本身
输出语句:Print () Debug.Log()
添加了一张病毒的图片
其余与单图识别差不多
动画制作
我们设置bool变量控制是否切换动作
注意!变量名不要有空格
(单击也行哈哈)
但是当时我用着旧版的动画,没法使用新版的状态机
关于旧版Animatio在新版Animator中的播放问题
解决旧版Animation无法在新版动画animator中播放问题(Animator是新版的动画机,我们尽量紧随时代)
还有就是它动画不能循环播放,百度了一下,
Animator设置公话循环播放的办法:
实现扫描出来有一个特效动作然后进入idle动画
现在希望有一个apperance动画在最开头然后病毒出现之后跳一下:
于是我修改了动画状态机:
勾上是当前动画播放完切换状态,取消勾选是立即切换状态
修改Animator参数代码:
a.SetBool("appearance",true);
(前面是变量名,后面是变量值)
识别到物体后开始的参考:
Unity 使用Vuforia实现识别图后触发其他事件的方法
修改这个函数:
加一个public变量Animator
public Animator bingDu;
protected virtual void OnTrackingFound()
{
if (mTrackableBehaviour)
{
var rendererComponents = mTrackableBehaviour.GetComponentsInChildren<Renderer>(true);
var colliderComponents = mTrackableBehaviour.GetComponentsInChildren<Collider>(true);
var canvasComponents = mTrackableBehaviour.GetComponentsInChildren<Canvas>(true);
// Enable rendering:
foreach (var component in rendererComponents)
component.enabled = true;
// Enable colliders:
foreach (var component in colliderComponents)
component.enabled = true;
// Enable canvas':
foreach (var component in canvasComponents)
component.enabled = true;
//后面是我添加的————————————————————————————————————————————————
a.SetBool("appearance",true);
}
}
protected virtual void OnTrackingLost()
{
if (mTrackableBehaviour)
{
var rendererComponents = mTrackableBehaviour.GetComponentsInChildren<Renderer>(true);
var colliderComponents = mTrackableBehaviour.GetComponentsInChildren<Collider>(true);
var canvasComponents = mTrackableBehaviour.GetComponentsInChildren<Canvas>(true);
// Disable rendering:
foreach (var component in rendererComponents)
component.enabled = false;
// Disable colliders:
foreach (var component in colliderComponents)
component.enabled = false;
// Disable canvas':
foreach (var component in canvasComponents)
component.enabled = false;
//后面是我添加的————————————————————————————————————————————————
a.SetBool("appearance", false);
}
}
也就是说我现在实现了让它识别出来的时候就跳一下,没有识别到的时候就让其呆在一个空的阶段
Trump和病毒靠近时触发攻击特效
现在要做的是当Trump和病毒靠近时触发攻击特效(两者皆触发攻击特效),于是我们现在需要通过距离判断,如果脚本本身在Trump身上,我们要拿到病毒引用即创建一个共有变量,一会儿将病毒拖过去赋值给它
public GameObject bingDu;
在其身上的组件可以直接GetComponent<T>
我们首先要看两个物体坐标距离多远的时候开始打架
Debug.Log("两者距离:"+Vector3.Distance(transform.position,bingDu.transform.position));
不能同时识别出两个物体问题解决:
最开始我不能同时识别出两个物体,百度后看到原因,才想起来上课讲过这里,我给忘了
然后就只能出现一个被识别的东西
修改方法:
外接摄像头显示设置方法
外接了一个摄像头,外接摄像头显示设置方法:
就可以了
(我发现每次摄像头距离拉远的时候距离会变大)
这个暂时还不是特别明白
Trump每次识别图不见的时候都可以重置
我想让Trump每次识别图不见的时候都可以重置(因为这个控制他走路的东西一会儿没控制好就会让他走不见)
最开始我是这样写的:
trump.transform.localPosition = Vector3.zero;
Unity 游戏框架搭建 2019 (十七、十八) Transform 重置与概率函数
unity3d中Transform组件 Rotate()和rotation变量详解
unity 修改transform.rotation的两种方法
protected virtual void OnTrackingLost()
{
if (mTrackableBehaviour)
{
var rendererComponents = mTrackableBehaviour.GetComponentsInChildren<Renderer>(true);
var colliderComponents = mTrackableBehaviour.GetComponentsInChildren<Collider>(true);
var canvasComponents = mTrackableBehaviour.GetComponentsInChildren<Canvas>(true);
// Disable rendering:
foreach (var component in rendererComponents)
component.enabled = false;
// Disable colliders:
foreach (var component in colliderComponents)
component.enabled = false;
// Disable canvas':
foreach (var component in canvasComponents)
component.enabled = false;
//后面是我添加的————————————————————————————————————————————————
bingDu.SetBool("bingduAppearance", false);
trump.GetComponent<Animator>().SetBool("trumpAppearance", false);
trump.transform.localPosition = Vector3.zero;
trump.transform.localRotation = Quaternion.Euler(0.0f, 180f, 0.0f);
//trump.transform.localRotation = Quaternion.Euler(Vector3.up * 180);
//transform.localScale = Vector3.one;
//transform.localRotation = Quaternion.identity;
//transform.eulerAngles = new Vector3(0,0,0);
}
}
这样的话小人就可以每次都出现在纸片中央了
现在我们修改Trump里的函数,让它离病毒近且不走路的时候开始打架并且面朝病毒
但是我发现病毒消失之后trumpAttack还是没有改变,得回到DefaultTrackableEventHandler修改下,增加一条消失改变trumpAttack的语句
GetComponent<Animator>().SetBool("trumpAttack", false);
修改Trumpzou走路的时候的奇怪方向:
受上课视频启发,我修改了旋转的函数,原来是:
transform.eulerAngles = new Vector3(transform.eulerAngles.x, Mathf.Atan2(x, y) * Mathf.Rad2Deg, transform.eulerAngles.z);
修改为:
transform.eulerAngles = new Vector3(0, Mathf.Atan2(x, y) * Mathf.Rad2Deg, transform.eulerAngles.z);
去掉了X方向的旋转这样就显得没有很奇怪了
添加音效
创建空物体并在下面创建一个音源组件
Unity3D游戏引擎一共支持4个音乐格式的文件
.AIFF 适用于较短的音乐文件可用作游戏打斗音效
.WAV 适用于较短的音乐文件可用作游戏打斗音效
.MP3 适用于较长的音乐文件可用作游戏背景音乐
.OGG 适用于较长的音乐文件可用作游戏背景音乐
我用的是MP3格式的背景音乐,音乐下载地址:
TRUMP VS. CLINTON - Songify 2016
这样就好了,参考:
[Unity零基础入门]7.音效系统(使用Unity2018,基于Unity官方教学资源包)
下面的没有调好,不用放进PPT里了
本来想加一些小的打斗声音特效,但是老是加进去是有点问题
后来发现是因为我的音效时间太短了我却用mp3往里加,就加不进去
我用风云音频处理大师去了噪然后WAV格式导出(因为从B站弄出来的音频有背景音乐)
这样就可以用了
我想把这个小病毒往上移动一点,但是这样的话Trump也会跟着仰起头