查看: 1998|回复: 0

[经验分享] unity 通过更改系统方式调整全部声音的音量

[复制链接]

9903

主题

126

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
53448
精华
316

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

发表于 2019-8-22 09:02:40 |显示全部楼层
来自:1320494699
  1. using UnityEngine;
  2. using System.Runtime.Interopservices;
  3. using System;
  4. using DG.Tweening;
  5. using UnityEngine.UI;

  6. [DisallowMultipleComponent]
  7. public class SoundManger : MonoBehaviour
  8. {
  9.     #region System
  10.     [DllImport("user32.dll")]
  11.     static extern void keybd_event(byte bVk, byte bScan, UInt32 dwFlags, UInt32 dwExtraInfo);

  12.     [DllImport("user32.dll")]
  13.     static extern Byte MapVirtualKey(UInt32 uCode, UInt32 uMapType);

  14.     private const byte VK_VOLUME_MUTE = 0xAD;
  15.     private const byte VK_VOLUME_DOWN = 0xAE;
  16.     private const byte VK_VOLUME_UP = 0xAF;
  17.     private const UInt32 KEYEVENTF_EXTENDEDKEY = 0x0001;
  18.     private const UInt32 KEYEVENTF_KEYUP = 0x0002;

  19.     /// <summary>
  20.     /// 改变系统音量大小,增加
  21.     /// </summary>
  22.     public void SystemVolumeUp()
  23.     {
  24.         keybd_event(VK_VOLUME_UP, MapVirtualKey(VK_VOLUME_UP, 0), KEYEVENTF_EXTENDEDKEY, 0);
  25.         keybd_event(VK_VOLUME_UP, MapVirtualKey(VK_VOLUME_UP, 0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
  26.     }

  27.     /// <summary>
  28.     /// 改变系统音量大小,减小
  29.     /// </summary>
  30.     public void SystemVolumeDown()
  31.     {
  32.         keybd_event(VK_VOLUME_DOWN, MapVirtualKey(VK_VOLUME_DOWN, 0), KEYEVENTF_EXTENDEDKEY, 0);
  33.         keybd_event(VK_VOLUME_DOWN, MapVirtualKey(VK_VOLUME_DOWN, 0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
  34.     }

  35.     /// <summary>
  36.     /// 改变系统音量大小,静音
  37.     /// </summary>
  38.     public void SystemMute()
  39.     {
  40.         keybd_event(VK_VOLUME_MUTE, MapVirtualKey(VK_VOLUME_MUTE, 0), KEYEVENTF_EXTENDEDKEY, 0);
  41.         keybd_event(VK_VOLUME_MUTE, MapVirtualKey(VK_VOLUME_MUTE, 0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
  42.     }
  43.     #endregion

  44.     #region Program
  45.     [DllImport("Winmm.dll")]
  46.     private static extern int waveOutSetVolume(int hwo, System.UInt32 pdwVolume);

  47.     [DllImport("Winmm.dll")]
  48.     private static extern uint waveOutGetVolume(int hwo, out System.UInt32 pdwVolume);

  49.     private const int volumeMinScope = 0;
  50.     private const int volumeMaxScope = 100;

  51.     private int lastVolume = 0;
  52.     private int volume = 100;

  53.     public int Volume
  54.     {
  55.         get { return volume; }
  56.         set
  57.         {
  58.             volume = value;
  59.             AudioSlider.value = volume;
  60.             SetCurrentVolume();
  61.         }
  62.     }
  63.     private void SetCurrentVolume()
  64.     {
  65.         volume = volume < volumeMinScope ? volumeMinScope : volume;
  66.         volume = volume > volumeMaxScope ? volumeMaxScope : volume;
  67.         //先把trackbar的value值映射到0x0000~0xFFFF范围
  68.         System.UInt32 Value = (System.UInt32)((double)0xffff * volume / (volumeMaxScope - volumeMinScope));

  69.         //限制value的取值范围
  70.         Value = Value < 0 ? 0 : Value;
  71.         Value = Value > 0xffff ? 0xffff : Value;
  72.         print(volume);
  73.         System.UInt32 left = Value;     //左声道音量
  74.         System.UInt32 right = Value;        //右声道音量
  75.         waveOutSetVolume(0, left << 16 | right);        //"<<"左移,“|”逻辑或运算
  76.     }

  77.     /// <summary>
  78.     /// 改变程序音量,增加
  79.     /// </summary>
  80.     /// <param name="value">增加的幅度</param>
  81.     public void ProgramVolumeUp(int value = 2)
  82.     {
  83.         Volume += value;
  84.     }

  85.     /// <summary>
  86.     /// 改变程序音量,减少
  87.     /// </summary>
  88.     /// <param name="value">减少的幅度</param>
  89.     public void ProgramVolumeDown(int value = 2)
  90.     {
  91.         Volume -= value;
  92.     }

  93.     /// <summary>
  94.     /// 改成程序音量,静音
  95.     /// </summary>
  96.     public void ProgramMute()
  97.     {
  98.         int temp = lastVolume;
  99.         lastVolume = volume;
  100.         Volume = temp;
  101.     }
  102.     #endregion

  103.     public enum MangerType
  104.     {
  105.         Program,
  106.         System,
  107.     }

  108.     public MangerType mangerType = MangerType.Program;

  109.     public Slider AudioSlider;
  110.     uint i = 0;
  111.     void Start()
  112.     {
  113.         AudioSlider.maxValue = volumeMaxScope;
  114.         MessageManager.RecviveMessage("Audio", (kv) =>
  115.         {
  116.             if (kv.Key.Contains("add"))
  117.             {
  118.                 SystemVolumeUp();
  119.             }
  120.             else if (kv.Key.Contains("minish"))
  121.             {
  122.                 SystemVolumeDown();
  123.             }
  124.             //SliderUp();
  125.             //CancelInvoke();
  126.             //Invoke("SliderDown",3);
  127.         });
  128.     }

  129.     void SliderUp()
  130.     {
  131.         AudioSlider.GetComponent<RectTransform>().DOAnchorPosY(70, 2);
  132.     }
  133.     void SliderDown()
  134.     {
  135.         AudioSlider.GetComponent<RectTransform>().DOAnchorPosY(-70, 2);
  136.     }
  137.     private void Update()
  138.     {
  139.         switch (mangerType)
  140.         {
  141.             case MangerType.Program:
  142.                 if (Input.GetKeyDown(KeyCode.UpArrow))
  143.                     ProgramVolumeUp();
  144.                 if (Input.GetKeyDown(KeyCode.DownArrow))
  145.                     ProgramVolumeDown();
  146.                 if (Input.GetKeyDown(KeyCode.Space))
  147.                     ProgramMute();
  148.                 break;
  149.             case MangerType.System:
  150.                 if (Input.GetKeyDown(KeyCode.UpArrow))
  151.                     SystemVolumeUp();
  152.                 if (Input.GetKeyDown(KeyCode.DownArrow))
  153.                     SystemVolumeDown();
  154.                 if (Input.GetKeyDown(KeyCode.Space))
  155.                     SystemMute();
  156.                 break;
  157.         }
  158.     }
  159. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|纳金网 ( 闽ICP备08008928号

GMT+8, 2024-3-29 18:37 , Processed in 0.084268 second(s), 30 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部