查看: 72355|回复: 99

【飞机大战】开发手记(六)爆炸与声音

[复制链接]

1

主题

342

帖子

7万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
75866
发表于 2014-9-4 05:12:20 | 显示全部楼层 |阅读模式
本篇手记旨在为《飞机大战》游戏增加机体爆炸的动画效果,以及导弹发射、机体爆炸的音效,最后还有背景音乐。

创建一个AircraftGraphic类,专门用于控制飞机的各种显示效果。




namespace Frederick.ProjectAircraft

{

    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)

下载附件  [url=]保存到相册[/url]

2013-12-16 10:07 上传




好了,运行游戏,慷慨激昂的音乐响起来!








回复

使用道具 举报

xbit 该用户已被删除
发表于 2014-12-28 02:51:40 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

cuckoo307 该用户已被删除
发表于 2014-12-28 02:55:59 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

神话 该用户已被删除
发表于 2015-4-5 19:40:55 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

心愿 该用户已被删除
发表于 2015-4-10 13:54:30 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

0

主题

1232

帖子

3889

积分

vip会员

Rank: 1

积分
3889
发表于 2015-4-10 18:51:04 来自手机 | 显示全部楼层
支持支持再支持
回复 支持 反对

使用道具 举报

0

主题

1245

帖子

3991

积分

vip会员

Rank: 1

积分
3991
发表于 2015-4-12 00:50:57 来自手机 | 显示全部楼层
边撸边过
回复 支持 反对

使用道具 举报

0

主题

1259

帖子

3929

积分

vip会员

Rank: 1

积分
3929
发表于 2015-4-14 06:48:44 来自手机 | 显示全部楼层
我了个去,顶了
回复 支持 反对

使用道具 举报

濮真 该用户已被删除
发表于 2015-4-16 19:04:36 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

0

主题

1253

帖子

3948

积分

vip会员

Rank: 1

积分
3948
发表于 2015-4-20 19:03:02 来自手机 | 显示全部楼层
……
回复 支持 反对

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | enginedx注册

本版积分规则

 
 



邮件留言:


 
返回顶部