简单介绍一下unity audio,auido包括三个东西,分别是Aduio Listener,Audio Source,Audio Clips。Audio Listener就相当于耳朵,是用来听声音的,Audio Source就相当于播放器,一个音源,可以播放声音,具体播放什么声音就靠Audio Clips

通常Audio Listener只有一个,默认情况下Audio Listener就在Main Camera中,是固定的

接下来就要在游戏场景中摆放各种声音的内容,然后播放让Audio Listener来听

所以我们要导入音频资源

导入之后我们再导入一下bgm资源

然后我们就要播放声音了

我们在Hierarchy栏创建一个空项目命名为SoundManager,我们用这个项目来管理我们游戏的所有音效

然后我们要写一下代码来控制声音,所以创建一个C#脚本命名为SoundManager,然后我们将这个脚本挂到空项目SoundManager上

我们还需要给这SoundManager项目添加一个Audio Source来播放音效

我们让SoundManager项目可以挂载所有我们需要的声音效果,每当我使用某个音效的时候,我们将Audio Clip放到Audio Source里面然后将它播放,每切换到不同的声音时我们放进去不同的Audio Clip

然后我们写一下代码,我们要先获得自身的Audio Source的引用,然后我们需要很多的Audio Clip来存储我们的音效,这里有跳跃的声音,受伤的声音,吃樱桃的声音,还有敌人死亡时的声音,敌人死亡的音效我们后面在单独做,我们这里主要针对人物来设置音效

我们回到unity设置一下这几个引用

有很多音效可以自己挑选

接下来我们创建不同的函数来将不同的音效输入到Audio Source播放

当我们人物跳跃或者吃到樱桃就会播放SoundManager脚本中的函数

怎么从playercontroller访问SoundManager的函数呢,前面我们消灭敌人那里我们是生成了一个Enemy的实例,然后获得自身的组件调用死亡函数。这里我们不这么做,因为这么做我们需要在三个地方执行这样的操作,这样不是很方便。

这里我们使用静态类的方法生成一个实例,然后在其他的代码就可以直接调用这个类中的函数了

我们先回到SoundManager类,我们要先将SoundManager这个类原地进行实例化,这样我们就可以用这个实体访问这个类中的所有函数

我们这里创建了一个SoundManager静态实例的对象,然后我们在Awake函数里面将自身赋值给instance,这样instance就是自身的静态实例,可以访问SoundManager类的所有对象。

Awake函数与start函数类似,不过Awake函数会在start函数前调用,Awake函数是脚本对象实例化后被调用的,而start函数是在对象的第一帧调用的,这里就不细说了

然后我们在playercontroller设置一下播放时的代码

跳跃时音效

吃到樱桃时的音效

受到伤害时的音效

这样就设置好了

还有背景音乐还没有设置,我们在SoundManager项目那里再创建一个Audio Source组件,我们把它的Audio Clip设置我们想要的bgm就行,循环播放记得勾选loop

之后这个Audio Source我们就不用管了

下面我们把敌人死亡时的音效给添加上去,我们给Enemy_Frog添加一个AudioSource,选择合适的死亡音效添加到它的Audio Clip,记得把play on awake取消勾选,不然游戏一运行就会播放这个音效

然后我们在Enemy脚本里面在死亡的函数里面播放这个音效即可

这样就ok了,我们回到游戏里实验一下就行了

最后贴一下SoundManager,Enemy还有playercontroller的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SoundManager : MonoBehaviour
{public static SoundManager instance;//生成静态实例public AudioSource audioSource;//播放器public AudioClip hurtAudio, jumpAudio, cherryAudio;//不同的音效资源private void Awake(){instance = this;}//不同音效的函数public void JumpAudio(){audioSource.clip = jumpAudio;audioSource.Play();}public void HurtAudio(){audioSource.clip = hurtAudio;audioSource.Play();}public void CherryAudio(){audioSource.clip = cherryAudio;audioSource.Play();}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Enemy : MonoBehaviour
{protected Animator anim;private AudioSource deathSource;protected virtual void Start(){anim = GetComponent<Animator>();deathSource = GetComponent<AudioSource>();}//播放完死亡动画销毁敌人public void DeathFall(){Destroy(gameObject);}//关闭碰撞器public void Death(){//先把敌人的碰撞器关闭,这样敌人就可以掉下去了GetComponent<Collider2D>().enabled = false;//播放死亡动画anim.SetTrigger("death");//播放死亡音效deathSource.Play();}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class playercontroller : MonoBehaviour
{private Rigidbody2D rb;//获得Rigidbody2D组件private Collider2D coll;//获得Collider2D组件private Animator anim;//获得动画组件public float speed, jumpForce;//公开,设置速度和跳跃力public LayerMask ground;//获得地面图层public Transform groundCheck;//检测角色是否碰到地面private bool isJump, isGround;//判断是否按下空格键,判断是否在地面private int jumpCount;//用来设置角色是几段跳private int cherries;//计数变量public Text cherryText;//樱桃计数的UI组件private bool isHurt;//受击判断//初始化void Start(){rb = GetComponent<Rigidbody2D>();coll = GetComponent<Collider2D>();anim = GetComponent<Animator>();}void Update(){//如果按下空格键并且在地面上if (Input.GetKeyDown(KeyCode.Space) && jumpCount > 0){isJump = true;}}private void FixedUpdate(){isGround = Physics2D.OverlapCircle(groundCheck.position, 0.1f, ground);if(!isHurt){Movement();}Jump();SwitchAnim();}//基础移动void Movement(){float horizontal = Input.GetAxisRaw("Horizontal");rb.velocity = new Vector2(horizontal * speed, rb.velocity.y);//设置x轴的移动//设置角色的转向问题if (horizontal != 0){transform.localScale = new Vector3(horizontal, 1, 1);anim.SetBool("run", true);}elseanim.SetBool("run", false);}//跳跃void Jump(){//如果在地面设置二段跳if (isGround){jumpCount = 2;}//按下跳跃键且在地面上if (isJump && isGround){rb.velocity = new Vector2(rb.velocity.x, jumpForce);SoundManager.instance.JumpAudio();jumpCount--;isJump = false;}//按下跳跃键且不在地面上且jumpCount大于0else if (isJump && !isGround && jumpCount > 0){rb.velocity = new Vector2(rb.velocity.x, jumpForce);SoundManager.instance.JumpAudio();jumpCount--;isJump = false;}}//切换动画void SwitchAnim(){//如果在下落状态if (rb.velocity.y < 0 && !isGround){anim.SetBool("fall", true);anim.SetBool("jump", false);}//如果在跳跃状态if (!isGround && rb.velocity.y > 0){anim.SetBool("jump", true);}//如果人物受击else if (isHurt){anim.SetBool("hurt", true);if (Mathf.Abs(rb.velocity.x) < 0.1f){anim.SetBool("hurt", false);isHurt = false;}}//如果在地面上else if (coll.IsTouchingLayers(ground)){anim.SetBool("fall", false);}   }//判断是否碰到物品private void OnTriggerEnter2D(Collider2D collision){if(collision.tag=="Collection"){Destroy(collision.gameObject);cherries++;cherryText.text = "樱桃:" + cherries;SoundManager.instance.CherryAudio();}}//消灭敌人private void OnCollisionEnter2D(Collision2D collision){//判断是否碰到敌人if(collision.gameObject.tag=="Enemy"){//消灭敌人Enemy enemy = collision.gameObject.GetComponent <Enemy>();//获得敌人父类引用if(anim.GetBool("fall"))//判断是否下落跳到敌人头上消灭敌人{enemy.Death();//调用父类函数rb.velocity = new Vector2(rb.velocity.x, jumpForce);anim.SetBool("jump", true);}//如果人物在敌人的左边else if(transform.position.x<collision.gameObject.transform.position.x){rb.velocity = new Vector2(-8, rb.velocity.y);isHurt = true;SoundManager.instance.HurtAudio();}//如果人物在敌人的右边else if(transform.position.x>collision.gameObject.transform.position.x){rb.velocity = new Vector2(8, rb.velocity.y);isHurt = true;SoundManager.instance.HurtAudio();}}}
}

如有错漏之处,敬请指正!

unity2D横版游戏教程8-音效相关推荐

  1. unity2D横版游戏教程-2 代码实现

    接下来就是写代码的时候 我们创建一个文件夹用来存我们的脚本,名字就叫Scripts,在里面右键->Create->C#Script,这样就创建好了一个脚本 直接将这个脚本拖给我们Hiera ...

  2. unity2D横版游戏教程终章-主菜单和暂停菜单

    最后一节我们做一下主菜单和暂停菜单 我们创建一个新的scene,命名为Menu,这个就是主菜单场景 我们双击Menu进去设置一下我们的UI 我们先添加一下Canvas,在Canvas下面创建连个Pan ...

  3. unity2D横版游戏教程-1 让人物动起来

    在看完了麦扣老师的小狐狸的视频后,为了巩固练习,我另外找一个素材包来练手,顺便写成一个教程让自己更加熟练,同时当自己遗忘时可以回头查阅.另外,这个教程我写的非常详细,萌新也可以学习.有什么不对的地方或 ...

  4. unity2D横版游戏教程-3 Cinemachine镜头移动

    Cinemachine是官方提供的摄像机工具组件,这个工具的用处还蛮大的,不过我们这里就简单说一下在2D游戏里面怎么实现镜头跟踪的效果,这里我们用Cinemachine代替使用Main Camera ...

  5. unity2D横版游戏教程10-场景控制

    我们让角色掉出地图时重置游戏 我们在Hierarchy那里创建一个一个空项目,命名为DeathLine,也就是死亡线,我们给它添加一个盒体碰撞器,调整一下碰撞器 我们要把这个碰撞器当做触发器使用,所以 ...

  6. unity2D横版游戏教程9-对话框dialog

    这节我们实现对话框dialog的效果,也就是人物到达某个地方后会弹出来一个对话框,比如资源包里有一个奖杯的模型,我们可以做人物碰到奖杯时提示游戏胜利的效果 我们先在地图中添加奖杯 我们在Collect ...

  7. unity2D横版游戏教程5-UI

    UI是User Interface的缩写,也就是用户界面.像登录界面的按钮,游戏的得分,暂停的按钮等都是UI 之前我门创建一个Cherries变量来计算我们收集樱桃的数量,现在我们创建一个UI来显示我 ...

  8. unity2D横版游戏教程7-敌人AI死亡效果

    我们稍微完善一下敌人AI,我们给敌人添加一个死亡动画,命名为death 先创建一个Trigger变量来控制什么时候切换death,这个Trigger相当一个开关.死亡动画是任何状态都可以实现的,所以在 ...

  9. unity2D横版游戏教程4-物品收集以及物理材质

    我们先把背景扩大一点,ctrl+D复制一个背景图然后调一下位置,在把地图稍微拓展一下 然后再Hierarchy界面创建一个空组件命名为Collection,表示物品,创建一个空的子组件叫Cherrie ...

最新文章

  1. ASP.net实现无扩展名的URL重写。简单、方便、无需ISAPI
  2. 组合游戏系列5: 井字棋、五子棋AlphaGo Zero 算法实战
  3. 简单粗暴彻底解决selenium+chromedriver无法定位各种元素的方法
  4. Wix学习整理(7)——在开始菜单中为HelloWorld添加卸载快捷方式
  5. angularJS的controller之间如何正确的通信
  6. 上下位机通讯协议_嵌入式中自定义协议的一些典型例子
  7. 关于 SAP 电商云 Spartacus UI SSR 的 state transfer 问题
  8. WCF 客户端连接慢
  9. LinkedList的线程安全解决办法
  10. 较强冷空气影响中东部地区 江南华南等地有小到中雨
  11. Mac用VirtualBox虚拟机安装win10教程
  12. win10 加快开机速度
  13. 微信搜一搜中的智能问答技术
  14. Ajax访问接口报错NET::ERR_CERT_REVOKED
  15. ipa图片解密 php,ipa文件详解 - 如何提取App图片
  16. python设置端口控制ie浏览器_[Python爬虫] 之二:Selenium 调用IEDriverServer打开IE浏览器安装配置...
  17. 苏大计算机考研 操作系统常见易错知识点整理
  18. PDF如何修改编辑文字?两种简单的方法分享给大家
  19. a链接实现alt提示
  20. Spring-Boot Dubbo 整合

热门文章

  1. 2018年美亚杯电子数据取证大赛-资格赛wp
  2. Android逆向之源码刷机及Root
  3. 推荐两个免费的论文查重网站(24小时一次)
  4. 0902 团队销售漏斗
  5. 从《梦华录》的争议性,谈谈数字版权作品的价值泡沫
  6. 视频处理入门 | 六
  7. GPU加速在前端的应用
  8. python 检测直线 交点_OpenCV-Python教程(9、使用霍夫变换检测直线)
  9. HashMap,ArrayMap,SparseArray 源码角度分析,Android中的数据结构你该如何去选择?
  10. 文件打开方式更改为原本的计算机程序