AudioListener:听声音的Source,获敌人死亡函数

AudioListener:听声音的Source,获敌人死亡函数

我们简单介绍一下Unity Audio。 音频包括三部分,即Aduio Listener、Audio Source、Audio Clips。 Audio Listener相当于耳朵,是用来听声音的。 Audio Source相当于播放器unity 音效格式,是一个可以播放声音的音源。 具体播放的声音取决于音频剪辑。

通常只有一个音频监听器。 默认情况下,音频侦听器位于主摄像头中并且是固定的。

接下来,我们需要在游戏场景中放置各种声音内容,然后播放它们以供Audio Listener收听。

所以我们需要导入音频资源

导入完成后,我们来导入bgm资源

然后我们要播放声音

我们在 Hierarchy 列中创建一个名为 SoundManager 的空项目。 我们使用这个项目来管理游戏的所有音效。

然后我们需要写一些代码来控制声音,所以我们创建一个名为SoundManager的C#脚本,然后我们把这个脚本挂在空项目SoundManager上

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

我们允许 SoundManager 项目挂载我们需要的所有音效。 每当我使用某种音效时,我们都会将音频剪辑放入音频源中并播放它。 每次我们切换到不同的声音时,我们都会放入不同的音频剪辑

然后我们编写代码。 我们首先需要获得自己的Audio Source的引用,然后我们需要很多Audio Clip来存储我们的音效。 这里有跳跃的声音、受伤的声音、吃樱桃的声音以及敌人死亡时的声音。 后面我们会单独做敌人死亡的音效。 这里我们主要设置角色的音效。

让我们回到 unity 并设置这些引用。

有多种音效可供选择

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

当我们的角色跳跃或者吃樱桃时,SoundManager脚本中的函数就会被播放。

如何从播放器控制器访问SoundManager函数? 前面我们消灭敌人的时候,生成了一个Enemy的实例,然后获取了它自己的组件,并调用了death函数。 这里我们不会这样做3D道具,因为这样做需要在三个地方进行这样的操作,这不是很方便。

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

我们先回到SoundManager类。 我们需要首先实例化 SoundManager 类,以便我们可以使用该实体来访问该类中的所有功能。

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

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

然后我们在playercontroller中设置播放代码

跳跃时的音效

吃樱桃的音效

受到伤害时的音效

就是这样设置的

背景音乐尚未设定。 我们在 SoundManager 项目中创建另一个音频源组件。 我们只需将其音频剪辑设置为我们想要的背景音乐即可。 请记住检查循环以进行循环播放。

之后我们就不需要担心这个音频源了。

接下来,我们添加敌人死亡时的音效。 我们向 Enemy_Frog 添加一个 AudioSource,选择适当的死亡音效并将其添加到其音频剪辑中。 记得取消勾选play on awake游戏素材,否则游戏一运行就会播放音效。

然后我们就可以在Enemy脚本中的死亡函数中播放这个音效了。

没关系。 让我们回到游戏并进行实验。

最后,贴出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();
        deathSource = GetComponent();
    }
    //播放完死亡动画销毁敌人
    public void DeathFall()
    {
        Destroy(gameObject);
    }
    
    //关闭碰撞器
    public void Death()
    {
        //先把敌人的碰撞器关闭,这样敌人就可以掉下去了
        GetComponent().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();
        coll = GetComponent();
        anim = GetComponent();
    }
    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);
        }
        else
            anim.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大于0
        else 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 ();//获得敌人父类引用
            if(anim.GetBool("fall"))//判断是否下落跳到敌人头上消灭敌人
            {
                enemy.Death();//调用父类函数
                rb.velocity = new Vector2(rb.velocity.x, jumpForce);
                anim.SetBool("jump", true);
            }
            //如果人物在敌人的左边
            else if(transform.position.xcollision.gameObject.transform.position.x)
            {
                rb.velocity = new Vector2(8, rb.velocity.y);
                isHurt = true;
                SoundManager.instance.HurtAudio();
            }
        }
    }
}

如有错误或遗漏unity 音效格式,敬请指正!

文章来源:https://blog.csdn.net/qq_52905520/article/details/126159533