Unity3D-VR《静夜诗》4-窗户门动画的播放
- 1.播放窗户门对象的闪烁动画
- 1.1窗户门对象的动画控制器
- 1.2播放窗户闪烁动画的实现思路
- 1.3新建控制脚本GameManager
- 1.4脚本GameManager中函数的调用
- 1.脚本GameManager参数的设置
- 窗户门可以凝视交互
- 3播放打开窗户门动画
根据项目要实现的功能要求,对开始按钮凝视转圈完成事件触发后,开始信息文本和开始按钮将会消失,同时播放窗户门对象的闪烁动画,此时如果你凝视在窗户门上,准星会有凝视转圈进度条出现。
1.播放窗户门对象的闪烁动画
开始时窗户门是不闪烁的(动画还没有播放),只有当玩家凝视触发了开始按钮后,窗户才开始闪烁的,以便提示玩家窗户门也是可以凝视交互的。
1.1窗户门对象的动画控制器
选中名为JiaoHu的对象,在监视视图中可以看到对象有一个动画控制器Animator组件,取消组件的enable属性(即Animator组件不打勾),就不会播放窗户的动画了。在运行时要播放窗户动画,只要设置enable属性为true。动画控制器组件会有控制器属性Controller,该参数设置的是一个动画控制器文件,窗户的动画控制器文件JiaoHu已经在资源目录中了,打开动画控制编辑器,显示JiaoHu的动画控制如下:
窗户动画控制器显示,运行动画控制器时默认播放的动画剪辑是窗户闪烁动画WinShane,触发了Open事件后控制器播放的动画会过渡到打开窗户动画。可以进一步了解一下Unity Script API中Animator类的文档,通过调用Animator类的方法SetTrigger(“Open”)可以使控制器进入打开窗户动画状态,也可以用Play(“WinOpen”)让动画控制播放“WinOpen”状态的动画剪辑。
1.2播放窗户闪烁动画的实现思路
回到ReticleTrigger_for_ButtonStartPlay脚本的void HandleTrigger ()函数的实现中,把Debug.Log(“你触发了开始按钮”)的语句注释了,然后写一些代码,通过引用窗户对象,实现窗户闪烁动画的播放,是一种直接的实现方法。但这样脚本的功能结构就不太够清晰了,为了让脚本的功能结构更加清晰,我们把播放窗户闪烁的动画、设置窗户可凝视交互等一系列功能封装在一个全局控制脚本中实现,在这里只调用控制脚本的一个Public的方法就可以了,后面会详细讲到,我们先来新建这个控制脚本。
1.3新建控制脚本GameManager
脚本只有挂在游戏对象上才能被执行,在场景中新建一个Empty游戏对象,并命名为GameManager,为GameManager对象新建一个GameManager.cs脚本。脚本的参考代码如下:
public class GameManager : MonoBehaviour {
public Animator animator_Window;//窗口动画控制器
public Collider collider_Window;//可交互的窗口对象碰撞器
void Start () {
animator_Window.enabled = false; //设置窗口动画控制器不使能(不起作用)
collider_Window.enabled = false; //设置窗口对象不可交互
}
//凝视开始按钮触发交互后执行的方法
public void StartPlay(){
animator_Window.enabled = true; //设置窗口动画控制器使能(起作用)
collider_Window.enabled = true; //设置窗口对象可交互
}
}
提示
在脚本初始化的地方,设置了窗口动画控制器的使能属性值为不使能,即窗口对象动画控制器的enable的属性值为false,同时设置窗口对象不可凝视交互,即设置窗口对象碰撞器的enable属性值为false。
1.4脚本GameManager中函数的调用
脚本类中的函数public void StartPlay()可以被开始按钮凝视事件触发时调用,如何调用呢?
回到ReticleTrigger_for_ButtonStartPlay脚本,对void HandleTrigger ()函数做如下修改:
//准星凝视进度条满了后,要触发的事件代码
void HandleTrigger ()
{ //设置当前对象父对象不活动(不可见,不可交互)
this.transform.parent.gameObject.SetActive(false);
//Debug.Log("你触发了开始按钮");
//调用游戏逻辑控制脚本中对应的public方法,开始游戏
FindObjectOfType<GameManager>().StartPlay();
}
提示
请同学们掌握在当前场景中获取脚本组件的方法,FindObjectOfType< GameManager >()是返回找到的第一个GameManager脚本实例组件,返回类型是GameManager类,可以直接调用该类的public方法(或属性)的。要注意Unity Script API中有很多类似的函数,如FindObjectsOfType<>() 获取的是类的实例数组,注意函数名多了一个“s”。详细参见官网技术文档
1.脚本GameManager参数的设置
在场景中选中GameManager对象,在监视视图中对GameManager脚本的Public参数进行赋值设置如下:
测试:
窗户门可以凝视交互
为什么还不能凝视交互窗户呢?大家知道游戏对象可凝视交互除了有碰撞器外,还要有控制的脚本代码。
和开始按钮的实现脚本ReticleTrigger_for_ButtonStartPlay类似,我们为要凝视交互的对象WindowsBtn添加新的脚本ReticleTrigger_for_Window。代码参考如下:
public class ReticleTrigger_for_Window : MonoBehaviour {
private VRReticleTriggerItem vrReticleTriggerItem;//处理准星精度条触发的类变量
private void Awake ()
{ //要保证对象也有VRReticleTriggerItem脚本
vrReticleTriggerItem = GetComponent<VRReticleTriggerItem> () ?? gameObject.AddComponent<VRReticleTriggerItem>() ;
}
//对象使能(激活)时调用
private void OnEnable()
{
//订阅事件
vrReticleTriggerItem.OnTrigger += HandleTrigger;
}
//对象不使能(不激活)时调用
private void OnDisable()
{ //去掉订阅的事件
vrReticleTriggerItem.OnTrigger -= HandleTrigger;
}
//准星凝视进度条满了后,要触发的事件代码
void HandleTrigger ()
{ //调用游戏逻辑控制脚本中对应的public方法
FindObjectOfType<GameManager>().OpenWindow ();
}
}
同样在void HandleTrigger ()函数中调用了GameManager脚本的OpenWindow ()函数,在GameManager脚本里实现了函数的具体功能并公开了这函数,在这里只是调用就可以了,这样会显得脚本比较规范,可读性也比较好。
下面在GameManager脚本中实现OpenWindow ()函数的功能,以实现播放窗户的打开动画。
3播放打开窗户门动画
打开GameManager脚本,添加public void OpenWindow()函数,代码参考如下:
//凝视窗户触发交互后执行的方法
public void OpenWindow(){
animator_Window.SetTrigger("Open"); //播放窗户打开动画
collider_Window.enabled = false; //关闭窗户对象可交互功能
}
说明
- 在项目资源中找到并打开动画控制器文件JiaoHu,可以看到控制器设定的动画参数“Open”的类型是Trigger,所以调用SetTrigger(“Open”)函数来实现动画状态的过渡,进入下一动画状态(WinOpen),播放对应的动画剪辑。针对不同的参数类型控制器Animator也提供SetInteger、SetBool等类似函数。
- 窗户打开后,设定窗户对象的碰撞器的enable属性为false,窗户对象就不能再凝视交互了。
测试: