zoukankan      html  css  js  c++  java
  • Unity中在非运行状态中播放AudioClip

    这里用到反射,会用到AudioUtil,源码调用如下:

    https://github.com/jamesjlinden/unity-decompiled/blob/master/UnityEditor/UnityEditor/AudioUtil.cs 

    思路如下:

    http://baba-s.hatenablog.com/entry/2017/12/04/173920

    这里放一下拓展类:

     1 #if UNITY_EDITOR
     2 using System;
     3 using UnityEditor;
     4 #endif
     5 using System.Reflection;
     6 using UnityEngine;
     7 
     8 //生成配置文件
     9 [CreateAssetMenu(fileName = "AudioClipPlayWithOutRunning", menuName = "AudioClipPlayWithOutRunning", order = 0)]
    10 [Serializable]
    11 public class AudioClipPlayWithOutRunning : ScriptableObject
    12 {
    13     //存储数据
    14     [SerializeField] private AudioClip soundData;
    15 
    16     //自动绑定脚本
    17     [CustomEditor(typeof(AudioClipPlayWithOutRunning))]
    18     class AudioClipPlayWithOutRunningEditor : Editor
    19     {
    20         public override void OnInspectorGUI()
    21         {
    22             var tempData = target as AudioClipPlayWithOutRunning;
    23             tempData.soundData =
    24                 (AudioClip) EditorGUILayout.ObjectField("AudioClip", tempData.soundData, typeof(AudioClip));
    25             if (GUILayout.Button("PlayClip"))
    26             {
    27                 PlayClip(tempData.soundData);
    28             }
    29 
    30             if (GUILayout.Button("StopClip"))
    31             {
    32                 StopClip(tempData.soundData);
    33             }
    34         }
    35 
    36         void PlayClip(AudioClip clip)
    37         {
    38             if (clip == null)
    39             {
    40                 Debug.LogError("SampleContainer PlayClip clip is null");
    41                 return;
    42             }
    43 
    44             var unityEditorAssembly = typeof(AudioImporter).Assembly;
    45             //获取dll
    46             var audioUtil = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
    47             //获取反射方法
    48             var method = audioUtil.GetMethod
    49             (
    50                 "PlayClip",
    51                 BindingFlags.Default | BindingFlags.Static | BindingFlags.Public,
    52                 null,
    53                 new[] {typeof(AudioClip)},
    54                 null
    55             );
    56             //调用
    57             method.Invoke(null, new[] {clip});
    58         }
    59 
    60         void StopClip(AudioClip clip)
    61         {
    62             if (clip == null)
    63             {
    64                 Debug.LogError("SampleContainer StopClip clip is null");
    65                 return;
    66             }
    67 
    68             var unityEditorAssembly = typeof(AudioImporter).Assembly;
    69             var audioUtil = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
    70             var method = audioUtil.GetMethod
    71             (
    72                 "StopClip",
    73                 BindingFlags.Default | BindingFlags.Static | BindingFlags.Public,
    74                 null,
    75                 new[] {typeof(AudioClip)},
    76                 null
    77             );
    78             method.Invoke(null, new[] {clip});
    79         }
    80     }
    81 }
    AudioClipPlayWithOutRunning

    这个时候在Unity中点击Asset -> AudioClipPlayWithOutRunning 生成该配置文件.

    将音效资源放入进去即可.. ..

    这样

  • 相关阅读:
    [转]android Intent机制详解
    [转]Android进程与线程基本知识
    HTML背景图片自适应
    边框边界填充理解
    [转]Android 代码自动提示功能
    [转]Windows7:Visual Studio 2008试用版的评估期已经结束解决方法
    eclipse安装、汉化、搭建安卓开发环境
    asp.net控件拖不动。控件错误
    opengl 入门浅学(一)
    opengl 无法定位程序输入点_glutInitWithExit于动态链接库glut32.dll上
  • 原文地址:https://www.cnblogs.com/jbw752746541/p/12022600.html
Copyright © 2011-2022 走看看