Unity3D开发之3D按钮的声音播放_项目管理_非技术区_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 非技术区 > 项目管理 > Unity3D开发之3D按钮的声音播放

Unity3D开发之3D按钮的声音播放

 2017/9/15 14:26:48  DDCX  程序员俱乐部  我要评论(0)
  • 摘要:这里我们首先就简易的制作一个非常简单的3D按钮![图中就一个cube加个3DText,然后我们就编写代码[RequireComponent(typeof(CompoundButton))]//特效用语publicclassCompoundButtonSounds:ProfileButtonBase<ButtonSoundProfile>//泛型类需求T必须符合whereT的要求{//这里说明下定义的ButtonSoundProfile就一个声音源数组和声音值float数组--
  • 标签:开发

这里我们首先就简易的制作一个非常简单的3D按钮![

图中就一个cube 加个3DText,然后我们就编写代码

 

[RequireComponent(class="hljs-keyword">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组件

发表评论
用户名: 匿名