本教程将用最简单的方式在Unity中实现音效播放器,对2D和3D游戏均适用。此教程需要大家了解一些Unity的基本概念。

创建项目
首先新建一个空项目,2D或3D均可,命名为SoundMechanism。本例中使用2D项目,如下图: 140858xg47n8mb75b7w22q.png
下面添加一些图片资源到工程中。在Assets目录下新建文件夹UI,然后将如下两张图拖拽到UI目录下: 140854ipn8lfn5qrnl9eke.png


140855xtosg8gppo66l96c.jpg
然后将两张图片都拖拽到场景,拉伸背景图以适应屏幕尺寸。新建两个GameObject分别命名为GroundCollider和Ball。
为GroundCollider添加BoxCollider2D组件,将其坐标设为(0, -4, 0),Scale设为(5, 1, 1)。 为Ball添加CircleCollider2D和Rigidbody2D组件,并将其坐标设为(0, 0, 0),Scale设为(0.3, 0.3, 0.3)。
新建PhysicsMaterial2D材质命名为BallMaterial,将其Friction设为0,Bounciness设为1。然后将其拖拽至小球的Circle Collider 2D组件的Material字段。此时场景示图如下:
140855ghpepnj9cnc89inn.jpg

现在点击运行,可以看到小球坠落到地面并不停弹跳。下面就来实现音效播放。 140856umb1kn9m8i0i980m.jpg

播放机制
首先来实现使用PlayerPrefs保存Boolean值。PlayerPrefs是Unity自带的永久性数据存储方式。位于该存储区域中的值会在游戏安装时被保存,然后在游戏卸载后删除,而游戏退出运行对其中的值没有影响。PlayerPrefs比较典型的应用就是存储玩家最高分及音效的开关状况等。
因为Unity内置的PlayerPrefs并不支持直接保存Boolean值,所以这里新建类Utils来扩展PlayerPrefs,代码如下: [C#] 纯文本查看 复制代码public static void SetInt (string key, int value) { PlayerPrefs.SetInt (key, value); } public static int GetInt (string key) { return PlayerPrefs.GetInt (key); } public static void SetString (string key, string value) { PlayerPrefs.SetString (key, value); } public static string GetString (string key) { return PlayerPrefs.GetString (key); } public static void SetBool (string key, bool value) { if (value) PlayerPrefs.SetInt (key, 1); else PlayerPrefs.SetInt (key, 0); } public static bool GetBool (string key) { int val = PlayerPrefs.GetInt (key); if (val == 1) return true; return false; }


在所有的代码架构中都会用一个集中的类或头文件来存储项目需要用到的所有常量。这里需要保存string值到永久性存储区域中,所以新建类Constant用来保存常量。该类中包含两个publicstaticreadonly类型的string值作为使用PlayerPrefs保存数据的Key,分别表示音效是否开启以及是否首次进入游戏。代码如下:
[C#] 纯文本查看 复制代码public class Constants { public static readonly string KEY_SOUND = keysound; public static readonly string KEY_IS_APP_LAUNCHED_FIRST_TIME = isapplaunchedfirsttime; }
下面首先检查是否首次进入游戏,如果是,则开启音效播放。代码如下: [C#] 纯文本查看 复制代码void Start(){ bool appLaunchedFirstTime = Utils.GetBool (Constants.KEY_IS_APP_LAUNCHED_FIRST_TIME); if (!appLaunchedFirstTime) { Utils.SetBool (Constants.KEY_IS_APP_LAUNCHED_FIRST_TIME, true); Utils.SetBool (Constants.KEY_SOUND, true); } }

控制进入游戏时是否播放音乐只需简单调用Utils.SetBool(Constant.KEY_SOUND, true)或Utils.SetBool(Constant.KEY_SOUND, false)即可。 140856synntuztyektkyjn.jpg


上面介绍了这么多都还只是准备工作,下面就来添加播放音效的代码。新建GameObject和脚本均命名为SoundController,并将脚本添加到GameObject上。在SoundController对象下新建子对象命名为BallBounce。这里需要多少种音效就可以在SoundController对象下添加多少子对象。本例中只需一个。
添加音效
这里使用简便办法来添加音效,在SoundController的子对象BallBounce上添加Audio Source组件,然后将音效文件从项目视图拖拽至Audio Source的AudioClip字段,并取消勾选Play On Awake,如下图: 140856gzfzvzsv4mkfmfyy.png



打开SoundController脚本,编辑代码如下: [C#] 纯文本查看 复制代码public AudioSource _ballBounce; void Awake () { DontDestroyOnLoad (gameObject); } public void PlayBallBounce() { if (Utils.GetBool(Constants.KEY_SOUND)){ _ballBounce.Play(); } }

使用DontDestroyOnLoad来保证切换场景时不会销毁指定的GameObject。在PlayBallBounce函数中首先检测玩家设置,此时是否应该播放音效,如果是则播放。将BallBounce赋给SoundController的对应字段,如下图: 140858mjyzvjyrrhykorrz.png


最后一步
最后就是决定播放音效的时机。本例中是在有物体撞击到地板时发出声音,所以将播放声音的代码绑定到GroundCollider上。新建脚本Ground并添加到GroundCollider游戏对象上,代码如下: [C#] 纯文本查看 复制代码void Start () { _soundController = FindObjectOfType<SoundController> (); // This line will find SoundController. bool appLaunchedFirstTime = Utils.GetBool (Constants.KEY_IS_APP_LAUNCHED_FIRST_TIME); if (!appLaunchedFirstTime) { Utils.SetBool (Constants.KEY_IS_APP_LAUNCHED_FIRST_TIME, true); Utils.SetBool (Constants.KEY_SOUND, true); } } void OnCollisionEnter2D (Collision2D col) { //Here Im not checking what the collider is. Just play sound whatever strikes with the ground _soundController.PlayBallBounce (); }
到此只要有物体撞击地面,就会发出声音。该机制的优点如下: 类功能集中; 整个游戏只需控制一个Flag; 不需在地方检测是否播放音效; 只需通过一个Flag来控制音效是否播放。


今天的教程就分享到这里,还有很多功能大家可以自行扩展。最后附上工程文件: davinci8,如果您要查看本帖隐藏内容请回复
本文来源于:http://www.hamzahasan.com/ 原作者:Hamza Hasan
转载请保留以上信息并注明来源:Unitychina.cn!
锐亚教育

锐亚教育 锐亚科技 unity unity教程