Unity教程之-Unity3d游戏开发之在iTween中使用事件机制

 

本篇unity3d教程我们来来学习下iTween中使用事件机制,众所周知iTween是Unity3D平台上一个优秀的第三方插件,通过这个插件呢,我们可以快速地实现诸如位移、伸缩、旋转、渐变等等一系列的动画,而不用专门再去为每一种效果去写脚本。说句实话啊,博主其实是不喜欢给游戏中加Duang特技的,因为游戏的本质是好玩,如果不去关心游戏的核心玩法,整天就把精力放到各种各样炫酷的特效上去,我觉得这游戏就算做出来了估计都没人玩吧。

最近大宇资讯和中国手游联手推出的仙剑奇侠传3D复刻版本,尽管从各种宣传中我们得知该游戏是使用了Unity3D引擎开发,以Q版3D造型还原仙剑初代经典剧情,然后游戏聘请国内一线声优全程配音,甚至音乐和技能都是在初代游戏的基础上使用新技术重新进行了还原。可是呢,当这款游戏真正到了我们手中的时候,我们发现这完全就是一个卡牌的回合制游戏,与之前大宇和腾讯合作的仙剑奇侠传官方手游如出一辙。好了,接下来我们再来说说这游戏的玩法吧,让历代仙剑的主角们组队打怪我可以接受,可是你把仙剑初代剧情搞得跟刷副本似的,我就不明白你是想干嘛了。用一个3D游戏引擎做出一个2D的回合制卡牌游戏,我想说这件事情就是Duang特技瞎折腾的吧!

游戏截图1游戏截图2游戏截图3

可是话说回来,现在大家玩游戏不都是奔着画面和特效去的吗?到了手游时代,估计鲜有像博主这样抱着手机将一部游戏打通关的人了吧。因为大家玩游戏的心态早就变了,尤其是当国内游戏越来越缺乏创新精神的时候,大家玩游戏都是奔着娱乐和休闲的目的去的,我们扪心自问,现在你还能再打通关几部游戏?更不要说是手游这种信息高度碎片化时代下的产物了。游戏运营者们深谙此道啊,所以像什么每天定时登陆领取体力啊、掉落物品抽奖啊、迷宫里自动寻路啊、挂机自动战斗啊这些伎俩在各种各样的游戏中都成了标准配置。好了,闲话咱先扯这么多,虽然国内游戏的大环境是这样,可是谁让我们入了游戏开发这个坑呢,今天我们就来说说因为加Duang特技而不得不研究iTween的事件机制这件事情吧!

我们还是以《水果忍者》这个游戏为例吧,因为这段时间基本上都在研究这个游戏在Unity3D引擎下的实现,所以我们还是以这个游戏为例,相信大家都记得在这个游戏中,当玩家碰到炸弹后炸弹爆炸,屏幕会由原来的背景渐变成白色然后再由白色渐变成原来的背景,当整个渐变过程结束后,游戏画面中央会缓缓出现GameOver字样,当玩家手势再次经过GameOver时,GameOver会渐渐地变小直至最后消失,GameOver消失后音乐响起并返回到主菜单。好了,现在我们来分析下这样一个过程:

  • 画面透明度由0到255的渐变过程
  • 画面透明度由255到0的渐变过程
  • 加载GameOver,游戏结束
  • 玩家触发GameOver伸缩变化过程
  • 音乐响起返回主菜单

通过对这几个过程的分析,可以很明显地看出这几个过程其实是相关关联的,就是说一个过程结束了会触发另一个过程的开始。比如说画面透明度从0变到255后将触发画面透明度从255变到0的过程。因为这些过程是属性变化的过程,因此我们理所当然的会想到使用itween来实现,那么好了,现在终于到正题了,iTween中的事件机制!

我们都知道iTween是一个补间动画的插件,可是同时它是一个有状态的动画插件,在iTween中我们可以通过回调函数来获得这些状态并执行某些方法,如onstart、onupdate和oncomplete等。相信熟悉iTween的朋友一定知道在使用iTween前需要为其配置一个Hashable,在这个HashTable中我们可以配置补间动画的初始和最终状态以及完成整个状态变化的时间等信息,那么类似地,当我们需要在iTween中使用事件机制的时候,只要在配置HashTable的时候增加:


//创建一个哈希表
private HashTable table=new HashTable();
//增加相关事件
table.Add("onstart","OnStart");
table.Add("onupdate","OnUpdate");
table.Add("oncomplete","OnComplete");

因为我们增加了对onstart、onupdate和oncomplete这三个事件,所以我们需要在同一个脚本中定义三个对应的方法:


private void OnStart()
{
Debug.log("iTween Start")
}
private void OnUpdate()
{
Debug.log("iTween Update")
}
private void OnComplete()
{
Debug.log("iTween Complete")
}

这样我们就能在不同的状态中响应不同的事件,好了,现在回到我们一开始的问题,我们一开始要解决的问题是在一个动画结束了以后执行第二个动画,因此我们可以按照这样的思路来实现这个功能:


using UnityEngine;
using System.Collections;
public class FadeAnimaiton : MonoBehaviour
{
public GameObject _GameOver;
/// <summary>
/// 渐出动画参数
/// </summary>
private Hashtable mFadeOut;
/// <summary>
/// 渐入动画参数
/// </summary>
private Hashtable mFadeIn;
private void Start()
{
//渐出动画配置
mFadeOut=new Hashtable();
mFadeOut.Add("alpha",0);
mFadeOut.Add("time",2.0f);
mFadeOut.Add("oncomplete","FadeIn");
//渐入动画配置
mFadeIn=new Hashtable();
mFadeIn.Add("alpha",0);
mFadeIn.Add("time",2.0f);
mFadeIn.Add("oncomplete","OnComplete");
FadeOut();
}
/// <summary>
/// 渐出
/// </summary>
public void FadeOut()
{
iTween.FadeFrom(this.gameObject,mFadeOut);
}
/// <summary>
/// 渐入
/// </summary>
private void FadeIn()
{
//获取全部的特效
GameObject[] effects=GameObject.FindGameObjectsWithTag("BoomEffect");
foreach(GameObject effect in effects)
{
//移除特效
Destroy(effect);
}
iTween.FadeTo(this.gameObject,mFadeIn);
}
/// <summary>
/// 动画结束事件
/// </summary>
private void OnComplete()
{
//显示GameOver
Instantiate(_GameOver,Vector3.zero,Quaternion.identity);
//允许玩家控制
GameManager.Instance.isPlay=true;
}
}

在这段脚本中主要使用了oncomplete事件,主要有3个过程:

  • 背景渐出过程
  • 背景渐出过程结束后,移除场景中的特效,背景渐入过程开始
  • 背景渐入过程完成后,显示GameOver,允许玩家控制

好了,下面我们来看看具体的效果吧!

屏幕震动效果演示

好了,本篇unity3d教程到此结束!,下篇再会