2016-07-13 09:52:41 CSDN_xin_L 阅读数 2865

Unity3d如何制作声音开关按钮

声音开关按钮既是将有声音的图标修改为无图标的,也就是修改按钮的Source Image或者修改按钮的Image组件中的图片

由于很简单所以我就只贴代码了,先将按钮添加点击事件,后在点击事件中加如下代码即可,用Button_music.image.overrideSprite即可。

    if (UI_bianliang.Panel_Settings_music) {
        UI_bianliang.Panel_Settings_music=false;
        Button_music.image.overrideSprite=Resources.Load("meigong/MusicOff", typeof(Sprite)) as Sprite;
     } else {
        UI_bianliang.Panel_Settings_music = true;
        Button_music.image.overrideSprite=Resources.Load("meigong/MusicOn", typeof(Sprite)) as Sprite;
}
2014-06-11 16:50:52 zhengkangchen 阅读数 23460

网上大多数Unity教程只讲述了如何在Unity里播放音乐,如何通过拖拽添加音频文件之后就没有继续了
但在游戏中有时候一个对象需要播放好几种声音,这个时候我们就需要用代码进行控制,教程上推拽给AudioClip赋值的方法就显得不是那么实用了
所以本篇将重点讲述如何在Unity中创建一个最简化的音频播放器,并通过代码进行动态加载与播放

①创建一个Empty对象 点击菜单栏[GameObject]–>Create Empty 命名为Audio

②选取这个空对象 点击菜单栏[Component]–>Audio–>Audio Source 这样就在场景里创建了如图所示的一个喇叭

③创建资源文件夹命名为Resources,并把BeiTown.mp3文件拖入其中,注意一定要将资源文件夹名设为Resources,否则Resources.Load方法将无法找到资源文件

④创建脚本
接下来开始创建脚本

MusicPlayer.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using UnityEngine;
using System.Collections;

public class MusicPlayer : MonoBehaviour {

    public AudioSource Sound;

    public void Play(string str)
    {
        Sound.clip = (AudioClip)Resources.Load(str, typeof(AudioClip));//调用Resources方法加载AudioClip资源
        Sound.Play();
    }

}

MusicTest.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using UnityEngine;
using System.Collections;

public class MusicTest : MonoBehaviour {

    private MusicPlayer music;

    void Start () {
    
        music = (GetComponent("MusicPlayer") as MusicPlayer);//获取播放器对象

    }

    void OnGUI()
    {
        if(GUI.Button(new Rect(101010050)"PLAY")){

            music.Play("BeiTown");//调用播放器Play方法

        }

    }

}

⑤将脚步绑定到AudioSource音源对象上,并将Audio对象赋给MusicPlayer脚本里的Sound对象,以便MusicPlayer对其进行操作

⑥点击播放按钮

这个时候就能听到声音了,但是细心的朋友会发现左右耳朵的声音并不是一样大的,这是因为我们的声音监听绑定在了主摄像机上,这就照成了声音可能是从一个方向传来的3D效果,如果不想要这个效果也好办
选取Audio对象,点击菜单栏[Commponent]–>Audio–>Audio Listener
为Audio对象创建一个声音监听,并勾选它

重新点击播放按钮,这个时候发现依然没有改变,控制台出现如下警告:There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene.
不要着急,Main Camera 主摄像机上的Audio Listen 取消勾选了么
Unity默认一个scene里同时只能有一个声音监听,其实这也很好理解,在自然情况下,人类也不可能做到两只耳朵听取不同范围的声音(借助设备除外)
将其他的Audio Listener取消后,只保留Audio上的Audio Listener,点击Play按钮,一切正常!

其他的暂停,停止,等等操作这里就不再添加了,感兴趣的朋友可以自己参考API进行操作,本文主要描述如何动态加载一首音乐,并将该类进行封装,同时最简化的代码也利于大家观看理解。
今天就到这里吧,意在分享,与君共勉之。

2017-07-02 22:34:47 wathp 阅读数 2677

Unity3D一共支持4种格式的文件

.AIFF  .WAV :适用于较短的音乐,可用作音效

.MP3  .OGG:适用于较长的音乐,可用作背景音乐


第一种方法:可以通过添加AudioSource组件来播放声音文件,而AudioSource组件有很多属性:


常用属性:

AudioClip:声音片段。

Mute:是否静音

Bypass Effects:是否打开音频特效

Play On Awake:开始时自动播放

Loop:是否循环播放

Volume:声音大小,范围在0.0 到 1.0

Pitch:声音播放的速度,范围在 -3 到 3,当取值1时为正常播放,小于1时减慢播放,大于1时加速播放


第二种方法:static void PlayClipAtPoint (clip : AudioClipposition : Vector3volume : float = 1.0F)


unity圣典解释是:在指定位置播放剪辑。播放完成后自动消除音频源。正在播放声音的音频源被返回。

第一个参数是要播放的音频文件,第二个参数是播放的三维坐标位置,第三个参数是音量的大小(可不输入,默认为1)


这个方法比起添加AudioSource组件要简便得多,通过该方法你可以在一个物体上播放多个声音而相互之间不会被干扰。但是该方法不能设置循环也不能添加其他声音效果,只播放一次就会自动销毁。

2014-11-26 11:56:18 asd237241291 阅读数 44560

原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:【Unity3D(AR/VR) 334163814】【Unity3D(游戏) 119706192】 本文链接地址: 多种播放音效的方式


AudioListener组件默认绑定在主摄像机上,这个组件的功能相当于耳朵,用来听声音的。

1.背景音乐

选中音乐文件,建议不勾选3D Sound选项。
在Main Camera下创建一个空物体,添加AudioSound组件,AudioClip选择要播放的音乐。
Loop必须勾选,循环播放。
勾选PlayOnAwake,场景一进来就开始播放,如果不勾选找个合适时机Play()。

2.NGUI的UIPlaySound

在摄像机直接添加个AudioSource组件,这个组件不挂任何AudioClip。(UIPlaySound将在这个组件上播放音效,在这里调整Volume能控制所有UIPlaySound的音量大小。UIPlaySoundVolume属性只控制自己的音量,最后的音量是这两个音量值相乘。)

3.碰撞触发的音效

public AudioClip AC;
OnCollisionEnter(Collision collision)
//或者OnTriggerEnter(Collider collider)
{
    //被撞得物体原点发出声音(第二个参数用来设置发出声音的世界坐标,不要离AudioListener太远)
    AudioSource.PlayClipAtPoint(AC, transform.localPosition);
}

4.Animation动作回调的音效

public class AnimationCallSound : MonoBehaviour 
{
    //防止同一个动作多次注册回调
    public static List<string> isHaveevent = new List<string>();

    //调用事件
    public float EventTime;
    //要播放的音效(必须绑定一个AudioSource组件)
    public AudioSource AS;

	void Start () 
    {
        if (AS == null)
            Debug.LogError("没有绑定音效");
        AddEvent();
        //防止场景内动作相同的物体动作同步
        Invoke("PlayAnim",Random.Range(0.1f,5.5f));
	}
    void PlayAnim()
    {
        animation.Play();
    }

	
    //给Animation动画注册回调事件
    void AddEvent()
    {
        foreach (string name in isHaveevent)
        {
            if (animation.clip.name == name)
                return;
        }
        
        AnimationEvent auidoEvent = new AnimationEvent();
        auidoEvent.time = EventTime;
        auidoEvent.functionName = "PlayAudio";

        animation.clip.AddEvent(auidoEvent);
        isHaveevent.Add(animation.clip.name);
        Debug.Log("add " + animation.clip.name + " Event!");
    }

    public void PlayAudio()
    {
        AS.Play();
    }
}


2017-09-15 12:23:28 qq_40252539 阅读数 392
   这里我们首先就简易的制作一个非常简单的3D按钮![这里写图片描述](http://img.blog.csdn.net/20170915120955448?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfNDAyNTI1Mzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
  图中就一个cube 加个3DText,然后我们就编写代码
[RequireComponent(typeof(CompoundButton))]//特效用语
    public class CompoundButtonSounds : ProfileButtonBase<ButtonSoundProfile>//泛型类需求T必须符合 where T 的要求
    {
        //这里说明下 定义的ButtonSoundProfile就一个声音源数组和声音值float数组 - -!这里就是为了装b用的
        //CompoundButton 是摄像机检测用的组件(相当于事件源了)这个可以根据不同插件的事件源不同做处理
        //Button的事件详细 我也在研究。。 - -!很蛋疼 (不同的插件可以选择不同的事件接口)
        const float MinTimeBetweenSameClip = 0.1f;//常量最小按钮播放值

        [SerializeField]//序列化
        private AudioSource audioSource;
        private static string lastClipName = string.Empty;//全局变量
        private static float lastClipTime = 0f;
        private Button.ButtonStateEnum lastState = Button.ButtonStateEnum.Disabled;//表示按钮交互的状态

        void Start ()
        {
            Button button = GetComponent<Button>();
            //以下是定义的按钮事件
            button.OnButtonCancelled += OnButtonCancelled;
            button.OnButtonHeld += OnButtonHeld;
            button.OnButtonPressed += OnButtonPressed;
            button.OnButtonReleased += OnButtonReleased;
            button.StateChange += StateChange;

            audioSource = GetComponent<AudioSource>();
        }
        /// <summary>
        /// 状态改变
        /// </summary>
        /// <param name="newState"></param>
        void StateChange(Button.ButtonStateEnum newState)
        {
            // 不能在同一个状态重复多次
            if (lastState == newState)
                return;

            lastState = newState;

            // 不活跃的按钮 不播放声音
            if (!gameObject.activeSelf || !gameObject.activeInHierarchy)
                return;

            if (Profile == null)
            {
                Debug.LogError("Sound profile was null in button " + name);
                return;
            }

            switch (newState)
            {
                case Button.ButtonStateEnum.Observation:
                    PlayClip(Profile.ButtonObservation, Profile.ButtonObservationVolume);
                    break;

                case Button.ButtonStateEnum.ObservationTargeted:
                    PlayClip(Profile.ButtonObservationTargeted, Profile.ButtonObservationTargetedVolume);
                    break;

                case Button.ButtonStateEnum.Targeted:
                    PlayClip(Profile.ButtonTargeted, Profile.ButtonTargetedVolume);
                    break;

                default:
                    break;
            }
        }
        //按钮取消
        void OnButtonCancelled(GameObject go)
        {
            PlayClip(Profile.ButtonCancelled, Profile.ButtonCancelledVolume);
        }
        //按钮按住
        void OnButtonHeld(GameObject go)
        {
            PlayClip(Profile.ButtonHeld, Profile.ButtonHeldVolume);
        }
        //按钮按下
        void OnButtonPressed(GameObject go)
        {
            PlayClip(Profile.ButtonPressed, Profile.ButtonPressedVolume);
        }

        void OnButtonReleased (GameObject go)
        {
            PlayClip(Profile.ButtonReleased, Profile.ButtonReleasedVolume);
        }

        void PlayClip (AudioClip clip, float volume)
        {
            if (clip != null)
            {
                // 声音源是垃圾源,就不要做 Time.realtimeSinceStartup 静态属性表示 游戏开始实时时间
                if (clip.name == lastClipName && Time.realtimeSinceStartup < MinTimeBetweenSameClip)
                    return;

                lastClipName = clip.name;
                lastClipTime = Time.realtimeSinceStartup;
                if (audioSource != null)
                {
                    audioSource.PlayOneShot(clip, volume);//这个不陌生吧(适合播放小源声音)
                }
                else
                {
                    AudioSource.PlayClipAtPoint(clip, transform.position, volume);//这个是AudioSource的静态方法
                    //在transform.position位置创建一个空物体,并自动添加AudioSource组件,播放完成就会自动销毁
                }
            }
        }
    }

表述的也很明确了,最后就拖拽声音源到对应的属性中就行了,最后点击运行,点击按钮就ok了,下次带来动物(老鼠)和气球的动态Mesh按钮还有文本图片等3D交互UI。最后搭建一个功能完善的UI组件

U3D同时播放2个声音

阅读数 5414

unity3d,声音播放

阅读数 13509

没有更多推荐了,返回首页