using System;
using UnityEngine;
///
/// 用于控制飞机效果的显示。
///
public class AircraftGraphic : MonoBehaviour
{
public string ExplodeClipName;
public tk2dSpriteAnimator SpriteAnimator;
///
/// 爆炸。
///
/// 爆炸效果结束后的回调
public void Explode(Action callback)
{
if (callback != null)
{
SpriteAnimator.AnimationCompleted = (animator, clip) =>
{
callback();
SpriteAnimator.AnimationCompleted = null;
};
}
SpriteAnimator.Play(mExplodeClip);
}
///
/// 爆炸。
///
public void Explode()
{
Explode(null);
}
protected void Awake()
{
mExplodeClip = SpriteAnimator.GetClipByName(ExplodeClipName);
if (mExplodeClip == null)
Debug.LogWarning(string.Format("Explode clip '{0}' not exist.", ExplodeClipName));
}
private tk2dSpriteAnimationClip mExplodeClip;
}
}
将脚本附加到所有飞机上,并分别把每个脚本上的Body和ExplodeClipName设置好,如图所示。注意后者是要自己按前文步骤创建爆炸精灵和动画后,把名称填进去。另外由于游戏里导弹会穿过已经爆炸的敌机,所以爆炸精灵里的碰撞类型要设置为强制无(Force None)。
然后在Aircraft的Explode方法里增加对特效的调用。
///
/// 令飞机直接爆炸。
///
public void Explode()
{
Health = 0;
mGraphic.Explode(() => Destroy(gameObject));
}
运行游戏后发现飞机生命值到0后的确出现了爆炸效果,可还是可以移动和射击。这个时候之前在Aircraft里预留的IsAlive属性就可以派上用场了,分别修改AircraftController和EnemyController,使其只有在机体存活时才能移动和射击。由于比较简单,代码就不贴了。
某广告说得在理,“没有声音,再好的戏也出不来”。其实不仅仅是电影,这也同样适用于游戏。在Unity中播放声音需要AudioListener和AudioSource,由于是2D游戏不需要控制音源的位置,所以干脆使用一个AudioManager统一管理背景音乐和音效。
namespace Frederick.ProjectAircraft
{
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
///
/// 声音管理器。
///
public class AudioManager : MonoBehaviour
{
///
/// 获取声音管理器的唯一实例。
///
public static AudioManager Instance
{
get
{
if (mInstance == null)
{
var root = new GameObject("_AudioManager");
mInstance = root.AddComponent();
mInstance.mAudioListener = root.AddComponent();
mInstance.mBGMSource = root.AddComponent();
}
return mInstance;
}
}
///
/// 播放背景音乐。
///
/// 背景音乐
/// 是否循环播放
public void PlayBGM(AudioClip clip, bool isLoop)
{
mBGMSource.loop = isLoop;
mBGMSource.clip = clip;
mBGMSource.Play();
}
///
/// 播放声音音效。
///
/// 声音剪辑
public void PlaySFX(AudioClip clip)
{
var freeSource = mSFXSources.FirstOrDefault(source => !source.isPlaying);
if (freeSource == null)
{
freeSource = gameObject.AddComponent();
mSFXSources.Add(freeSource);
}
freeSource.clip = clip;
freeSource.Play();
}
///
/// 停止背景音乐。
///
public void StopBGM()
{
if (mBGMSource != null)
mBGMSource.Stop();
}
private readonly List mSFXSources = new List();
private static AudioManager mInstance;
private AudioListener mAudioListener;
private AudioSource mBGMSource;
}
}
使用单例模式可以方便在其他类中直接调用,以导弹发射为例:AudioManager.Instance.PlaySFX(LaunchSFX);飞机爆炸也是同理,只要在类中公开一个字段,在Unity中把音效文件拖上去即可。背景音乐的话最为简单,其实只需要单独在Camera上加一个背景音乐的AudioSource就可以了,不过考虑到可能需要在场景切换的时候音乐过渡不要那么生硬。所以又写了个专门用来切换音乐过渡的类,以备不时之需(当然目前实现效果是一样的)。
namespace Frederick.ProjectAircraft
{
using UnityEngine;
///
/// 背景音乐切换过渡效果。
///
public class BGMTransition : MonoBehaviour
{
public AudioClip AudioClip;
public bool IsLoop;
protected void Start()
{
if (AudioClip == null)
AudioManager.Instance.StopBGM();
else
AudioManager.Instance.PlayBGM(AudioClip, IsLoop);
}
}
}
:
[size=0.83em]setup%20bgm%20transition.png (193.91 KB, 下载次数: 0)
2013-12-16 10:07 上传