unity学习30:Audio Source, Audio clip 音效和音乐

目录

1 音乐相关必须要有 Audio listener 和Source

2 Scene里必须要有 Audio listener

3 Audio Source

3.1 Audio Source 就是音源,可播放的音乐clip 分类

3.2 创建Audio Source

3.3 各种属性

3.4  3D sound Settings

4 使用脚本来播放声音

4.1 声明AudioClip 并进行外部绑定

4.2 GetComponent() 

4.3 AudioSource对应的控制

4.4 用按键去控制

4.4.1 控制

4.4.2 实际代码

5 播放音效


1 音乐相关必须要有 Audio listener 和Source

  • Audio listener : 负责听到声音
  • Audio Source : 负责发出声音,声音源

2 Scene里必须要有 Audio listener

  • Scene里必须要有 Audio listener
  • Audio listener 也不需要单独创建,一般场景里会自动创建
  • 每个场景Scene创建时,会自动创建1个camera,每个camera都会默认带一个 audio listener
  • 如果有多个camera,就会有多个audio listener,保留1个即可

3 Audio Source

3.1 Audio Source 就是音源,可播放的音乐clip 分类

  • Audio Source 就是音源,有一个喇叭符号
  • 音效, 一般就是短时的,一次性播放的音效文件 clip
  • 音乐,一般是背景音乐等,比较长,循环或单次等

3.2 创建Audio Source

  • 比如在一个gameObject上创建一个 Audio Source
  • 然后把 Asset shop 下载,导入的文件,拖到这里
  • 开始运行就可以测试了

3.3 各种属性

  • output
  • mute: //静音
  • bypass Effects :  //绕过音响
  • bypass listener Effects : // 绕过监听器效果
  • play on awake
  • loop        

3.4  3D sound Settings

  • 小圆球 : 声音发出的最小距离
  • 大圆球: 声音发出的最小距离, 一个超级大球
  • 3D曲线:
  • 3D 声音,还是远了听了就变小,符合现实世界原理

4 使用脚本来播放声音

  • 外面的各种勾选,比如loop可以不勾选
  • 可以脚本里控制

4.1 声明AudioClip 并进行外部绑定

  • public AudioClip m1;  //绑定外部clip
  • public AudioClip m2;
  • 脚本里声明public 变量后, unity编辑器可以进行资源绑定

    public AudioClip m1;  //绑定外部clip
    public AudioClip m2;

//大概就相当于  其他语言里 path="" 这种指定外部资源吧

4.2 GetComponent<AudioSource>() 

  • GetComponent<>()
  • GetComponent<AudioSource>() 返回1个AudioSource对象
  • 所以需要这么定义

直接一句话定义和赋值

  • AudioSource player1=GetComponent<AudioSource>();

或者分开定义和赋值

  • private AudioSource player1;       
  • player1=GetComponent<AudioSource>();

4.3 AudioSource对应的控制

// 把外部获得的clip文件,赋值给player1.clip

  • player1.clip=m1; 

//设置循环

  • player1.loop=true

// 控制声音

  • player1.volume=0.5f

// 播放

  • player1.Play()

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestMusic : MonoBehaviour
{
    //声明AudioClip
    public AudioClip m1;  //绑定外部clip
    public AudioClip m2;

    //定义播放器组件
    private AudioSource player1;

    // Start is called before the first frame update
    void Start()
    {
        player1=GetComponent<AudioSource>();
        //
        player1.clip=m1;
        player1.loop=true;
        player1.volume=0.5f;   
        player1.Play();    

    }

    // Update is called once per frame
    void Update()
    {

    }
}

4.4 用按键去控制

4.4.1 控制

  • player1.Pause();
  • player1.Stop();
  • player1.UnPause();
  • player1.play();

4.4.2 实际代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestMusic : MonoBehaviour
{
    //声明AudioClip
    public AudioClip m1;  //绑定外部clip
    public AudioClip m2;

    //定义播放器组件
    private AudioSource player1;

    // Start is called before the first frame update
    void Start()
    {
        player1=GetComponent<AudioSource>();
        //
        player1.clip=m1;
        player1.loop=true;
        player1.volume=0.5f;   
        player1.Play();    

    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            if(player1.isPlaying==true)
            {
                //暂停播放
                player1.Pause();
                //player1.Stop();

            }
            else
            {
                //继续播放
                player1.UnPause();
                //player1.play();
            }
        }
    }
}

5 播放音效

  • 音效的播放方式
  • player1.PlayOneShot()
  • 不循环,
  • 每次只执行一次
  • 可以反复执行

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class TestMusic : MonoBehaviour
    {
        //声明AudioClip
        public AudioClip m1;  //绑定外部clip
        public AudioClip m2;
    
        //定义播放器组件
        private AudioSource player1;
    
        // Start is called before the first frame update
        void Start()
        {
            player1=GetComponent<AudioSource>();
            //
            player1.clip=m1;
            player1.loop=true;
            player1.volume=0.5f;   
            player1.Play();    
    
        }
    
        // Update is called once per frame
        void Update()
        {
            if(Input.GetKeyDown(KeyCode.Space))
            {
                if(player1.isPlaying==true)
                {
                    //暂停播放
                    player1.Pause();
                    //player1.Stop();
    
                }
                else
                {
                    //继续播放
                    player1.UnPause();
                    //player1.play();
                }
            }
    
            if(Input.GetMouseButtonDown(0))
            {
             player1.PlayOneShot(m2);
            }
    
    
        }
    }