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 生成该配置文件.

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

    这样

  • 相关阅读:
    如何在ubuntu里面使用JNI?
    sql server 关键字一
    自己编写的 objectDataSource 配合 GridView 实现分页...
    委托和匿名委托的比较
    实现 IEnumerable IEnumator 接口的类,可直接用作 Gridivew 的数据源
    ASP.NET 中的页面事件执行顺序
    泛型,集合的根本区别
    匿名委托的示例,贴一下以供参考...
    ajax "Sys 未定义" 的问题解决方法
    抽象工厂模式(C#)
  • 原文地址:https://www.cnblogs.com/jbw752746541/p/12022600.html
Copyright © 2011-2022 走看看