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的动画控制如下:

unity 播放bgm unity 播放 闪_vr

窗户动画控制器显示,运行动画控制器时默认播放的动画剪辑是窗户闪烁动画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参数进行赋值设置如下:

unity 播放bgm unity 播放 闪_unity 播放bgm_02


测试:


窗户门可以凝视交互

为什么还不能凝视交互窗户呢?大家知道游戏对象可凝视交互除了有碰撞器外,还要有控制的脚本代码。

和开始按钮的实现脚本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,窗户对象就不能再凝视交互了。

测试: