当前位置:   article > 正文

unity2D横版游戏教程8-音效_unity 添加背景音乐

unity 添加背景音乐

简单介绍一下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的代码

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class SoundManager : MonoBehaviour
  5. {
  6. public static SoundManager instance;//生成静态实例
  7. public AudioSource audioSource;//播放器
  8. public AudioClip hurtAudio, jumpAudio, cherryAudio;//不同的音效资源
  9. private void Awake()
  10. {
  11. instance = this;
  12. }
  13. //不同音效的函数
  14. public void JumpAudio()
  15. {
  16. audioSource.clip = jumpAudio;
  17. audioSource.Play();
  18. }
  19. public void HurtAudio()
  20. {
  21. audioSource.clip = hurtAudio;
  22. audioSource.Play();
  23. }
  24. public void CherryAudio()
  25. {
  26. audioSource.clip = cherryAudio;
  27. audioSource.Play();
  28. }
  29. }
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Enemy : MonoBehaviour
  5. {
  6. protected Animator anim;
  7. private AudioSource deathSource;
  8. protected virtual void Start()
  9. {
  10. anim = GetComponent<Animator>();
  11. deathSource = GetComponent<AudioSource>();
  12. }
  13. //播放完死亡动画销毁敌人
  14. public void DeathFall()
  15. {
  16. Destroy(gameObject);
  17. }
  18. //关闭碰撞器
  19. public void Death()
  20. {
  21. //先把敌人的碰撞器关闭,这样敌人就可以掉下去了
  22. GetComponent<Collider2D>().enabled = false;
  23. //播放死亡动画
  24. anim.SetTrigger("death");
  25. //播放死亡音效
  26. deathSource.Play();
  27. }
  28. }

 

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. public class playercontroller : MonoBehaviour
  6. {
  7. private Rigidbody2D rb;//获得Rigidbody2D组件
  8. private Collider2D coll;//获得Collider2D组件
  9. private Animator anim;//获得动画组件
  10. public float speed, jumpForce;//公开,设置速度和跳跃力
  11. public LayerMask ground;//获得地面图层
  12. public Transform groundCheck;//检测角色是否碰到地面
  13. private bool isJump, isGround;//判断是否按下空格键,判断是否在地面
  14. private int jumpCount;//用来设置角色是几段跳
  15. private int cherries;//计数变量
  16. public Text cherryText;//樱桃计数的UI组件
  17. private bool isHurt;//受击判断
  18. //初始化
  19. void Start()
  20. {
  21. rb = GetComponent<Rigidbody2D>();
  22. coll = GetComponent<Collider2D>();
  23. anim = GetComponent<Animator>();
  24. }
  25. void Update()
  26. {
  27. //如果按下空格键并且在地面上
  28. if (Input.GetKeyDown(KeyCode.Space) && jumpCount > 0)
  29. {
  30. isJump = true;
  31. }
  32. }
  33. private void FixedUpdate()
  34. {
  35. isGround = Physics2D.OverlapCircle(groundCheck.position, 0.1f, ground);
  36. if(!isHurt)
  37. {
  38. Movement();
  39. }
  40. Jump();
  41. SwitchAnim();
  42. }
  43. //基础移动
  44. void Movement()
  45. {
  46. float horizontal = Input.GetAxisRaw("Horizontal");
  47. rb.velocity = new Vector2(horizontal * speed, rb.velocity.y);//设置x轴的移动
  48. //设置角色的转向问题
  49. if (horizontal != 0)
  50. {
  51. transform.localScale = new Vector3(horizontal, 1, 1);
  52. anim.SetBool("run", true);
  53. }
  54. else
  55. anim.SetBool("run", false);
  56. }
  57. //跳跃
  58. void Jump()
  59. {
  60. //如果在地面设置二段跳
  61. if (isGround)
  62. {
  63. jumpCount = 2;
  64. }
  65. //按下跳跃键且在地面上
  66. if (isJump && isGround)
  67. {
  68. rb.velocity = new Vector2(rb.velocity.x, jumpForce);
  69. SoundManager.instance.JumpAudio();
  70. jumpCount--;
  71. isJump = false;
  72. }
  73. //按下跳跃键且不在地面上且jumpCount大于0
  74. else if (isJump && !isGround && jumpCount > 0)
  75. {
  76. rb.velocity = new Vector2(rb.velocity.x, jumpForce);
  77. SoundManager.instance.JumpAudio();
  78. jumpCount--;
  79. isJump = false;
  80. }
  81. }
  82. //切换动画
  83. void SwitchAnim()
  84. {
  85. //如果在下落状态
  86. if (rb.velocity.y < 0 && !isGround)
  87. {
  88. anim.SetBool("fall", true);
  89. anim.SetBool("jump", false);
  90. }
  91. //如果在跳跃状态
  92. if (!isGround && rb.velocity.y > 0)
  93. {
  94. anim.SetBool("jump", true);
  95. }
  96. //如果人物受击
  97. else if (isHurt)
  98. {
  99. anim.SetBool("hurt", true);
  100. if (Mathf.Abs(rb.velocity.x) < 0.1f)
  101. {
  102. anim.SetBool("hurt", false);
  103. isHurt = false;
  104. }
  105. }
  106. //如果在地面上
  107. else if (coll.IsTouchingLayers(ground))
  108. {
  109. anim.SetBool("fall", false);
  110. }
  111. }
  112. //判断是否碰到物品
  113. private void OnTriggerEnter2D(Collider2D collision)
  114. {
  115. if(collision.tag=="Collection")
  116. {
  117. Destroy(collision.gameObject);
  118. cherries++;
  119. cherryText.text = "樱桃:" + cherries;
  120. SoundManager.instance.CherryAudio();
  121. }
  122. }
  123. //消灭敌人
  124. private void OnCollisionEnter2D(Collision2D collision)
  125. {
  126. //判断是否碰到敌人
  127. if(collision.gameObject.tag=="Enemy")
  128. {
  129. //消灭敌人
  130. Enemy enemy = collision.gameObject.GetComponent <Enemy>();//获得敌人父类引用
  131. if(anim.GetBool("fall"))//判断是否下落跳到敌人头上消灭敌人
  132. {
  133. enemy.Death();//调用父类函数
  134. rb.velocity = new Vector2(rb.velocity.x, jumpForce);
  135. anim.SetBool("jump", true);
  136. }
  137. //如果人物在敌人的左边
  138. else if(transform.position.x<collision.gameObject.transform.position.x)
  139. {
  140. rb.velocity = new Vector2(-8, rb.velocity.y);
  141. isHurt = true;
  142. SoundManager.instance.HurtAudio();
  143. }
  144. //如果人物在敌人的右边
  145. else if(transform.position.x>collision.gameObject.transform.position.x)
  146. {
  147. rb.velocity = new Vector2(8, rb.velocity.y);
  148. isHurt = true;
  149. SoundManager.instance.HurtAudio();
  150. }
  151. }
  152. }
  153. }

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/118493
推荐阅读
相关标签
  

闽ICP备14008679号