【精选】Unity3D 您所在的位置:网站首页 静夜思动画 【精选】Unity3D

【精选】Unity3D

2023-10-28 15:16| 来源: 网络整理| 查看: 265

Unity3D-VR《静夜诗》4-窗户门动画的播放 1.播放窗户门对象的闪烁动画1.1窗户门对象的动画控制器1.2播放窗户闪烁动画的实现思路1.3新建控制脚本GameManager1.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().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 () ?? gameObject.AddComponent() ; } //对象使能(激活)时调用 private void OnEnable() { //订阅事件 vrReticleTriggerItem.OnTrigger += HandleTrigger; } //对象不使能(不激活)时调用 private void OnDisable() { //去掉订阅的事件 vrReticleTriggerItem.OnTrigger -= HandleTrigger; } //准星凝视进度条满了后,要触发的事件代码 void HandleTrigger () { //调用游戏逻辑控制脚本中对应的public方法 FindObjectOfType().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,窗户对象就不能再凝视交互了。

测试:

凝视触发开始按钮后,播放闪烁提示可以凝视交互,窗户凝视触发后,播放窗户打开动画。

接下来实现李白吟诗



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有