1
1
#if UNITY_EDITOR
2
2
using OdinNative . Unity ;
3
3
using OdinNative . Unity . Audio ;
4
- using System . Collections ;
5
- using System . Collections . Generic ;
6
4
using System . Linq ;
7
5
using UnityEditor ;
8
6
using UnityEngine ;
11
9
public class OdinAssetContext : Editor
12
10
{
13
11
internal const string MenuTag = "Assets/Create/4Players ODIN" ;
14
- private static GameObject NewOdinManager ( string guid = "a421abe223e2dee45b89e686a84e5545" )
12
+ internal const string MenuEditorTag = MenuTag + "/OdinEditor Helper" ;
13
+ internal const string ContextTag = "Audio/4Players ODIN" ;
14
+ private static GameObject NewOdinInstance ( string guid = "f7d24aee5ad24a646a7b72d963a24b6a" )
15
15
{
16
16
string assetPath = AssetDatabase . GUIDToAssetPath ( guid ) ;
17
- if ( ! assetPath . EndsWith ( "OdinManager .prefab" ) )
17
+ if ( ! assetPath . EndsWith ( "OdinInstance .prefab" ) )
18
18
{
19
- Debug . LogError ( $ "No OdinManager prefab! { assetPath } ") ;
19
+ Debug . LogError ( $ "No OdinRoom prefab! { assetPath } ") ;
20
20
return null ;
21
21
}
22
22
23
23
Object asset = AssetDatabase . LoadAssetAtPath ( assetPath , typeof ( GameObject ) ) ;
24
24
return PrefabUtility . InstantiatePrefab ( asset ) as GameObject ;
25
25
}
26
26
27
- [ MenuItem ( MenuTag + "/OdinManager/Prefab/Default " ) ]
27
+ [ MenuItem ( MenuEditorTag + "/Prefabs/Room " ) ]
28
28
public static GameObject CreateDefault ( )
29
29
{
30
- GameObject odin = NewOdinManager ( ) ;
30
+ GameObject odin = NewOdinInstance ( ) ;
31
31
if ( odin == null ) return null ;
32
32
33
- OdinEditorConfig config = odin . GetComponent < OdinEditorConfig > ( ) ;
34
- if ( config != null ) config . DeviceSampleRate = OdinNative . Core . MediaSampleRate . Hz48000 ;
35
-
36
33
return odin ;
37
34
}
38
35
39
- [ MenuItem ( MenuTag + "/OdinManager/Prefab/Advanced" ) ]
36
+ [ ContextMenu ( "OdinRoom" ) ]
37
+ public OdinRoom CreateRoom ( )
38
+ {
39
+ GameObject selected = Selection . activeGameObject ;
40
+ if ( selected == null )
41
+ {
42
+ Debug . LogError ( $ "Selection must be a gameobject!") ;
43
+ return null ;
44
+ }
45
+ return selected . AddComponent < OdinRoom > ( ) ;
46
+ }
47
+
48
+ [ MenuItem ( MenuEditorTag + "/Template/Advanced (Room, Mic, MixerGroup)" ) ]
40
49
public static GameObject CreateAdvanced ( )
41
50
{
51
+ Debug . Log ( $ "Create Prefab...") ;
42
52
GameObject odin = CreateDefault ( ) ;
43
53
if ( odin == null ) return null ;
44
54
45
- OdinHandler handler = odin . GetComponent < OdinHandler > ( ) ;
55
+ OdinRoom handler = odin . GetComponent < OdinRoom > ( ) ;
46
56
if ( handler != null )
47
57
{
48
- handler . Use3DAudio = true ;
49
- handler . CreatePlayback = false ;
50
-
51
58
Object obj = Selection . activeObject ;
59
+ Debug . Log ( "Set playback mixer settings..." ) ;
52
60
if ( obj is AudioMixer )
53
61
{
54
62
AudioMixer mixer = obj as AudioMixer ;
55
- handler . PlaybackAudioMixer = mixer ;
63
+ Debug . Log ( "Looking for \" Odin \" -group..." ) ;
56
64
var groups = mixer . FindMatchingGroups ( "Odin" ) ;
57
- if ( groups . Length <= 0 ) groups = mixer . FindMatchingGroups ( "Master" ) ;
58
- handler . PlaybackAudioMixerGroup = groups . FirstOrDefault ( ) ;
65
+ if ( groups . Length <= 0 )
66
+ {
67
+ Debug . Log ( "Looking for \" Master\" -group..." ) ;
68
+ groups = mixer . FindMatchingGroups ( "Master" ) ;
69
+ }
70
+ handler . AudioMixerGroup = groups . FirstOrDefault ( ) ;
59
71
}
60
72
else if ( obj is AudioMixerGroup )
61
73
{
62
74
AudioMixerGroup group = obj as AudioMixerGroup ;
63
- handler . PlaybackAudioMixer = group . audioMixer ;
64
- handler . PlaybackAudioMixerGroup = group ;
75
+ Debug . Log ( $ "Set \" { group . name } \" -group..." ) ;
76
+ handler . AudioMixerGroup = group ;
65
77
}
66
78
else
67
79
Debug . LogWarning ( "Selection has to be an AudioMixer or AudioMixerGroup! Skip playback mixer settings." ) ;
80
+
81
+ var mic = odin . AddComponent < OdinMicrophoneReader > ( ) ;
82
+ if ( mic . OnAudioData == null ) mic . OnAudioData = new OdinNative . Unity . Events . UnityAudioData ( ) ;
83
+ if ( mic . OnAudioData . GetPersistentEventCount ( ) <= 0 )
84
+ {
85
+ #if UNITY_EDITOR
86
+ UnityEditor . Events . UnityEventTools . AddPersistentListener ( mic . OnAudioData , handler . ProxyAudio ) ;
87
+ #else
88
+ mic . OnAudioData . AddListener ( handler . ProxyAudio ) ;
89
+ #endif
90
+ }
91
+ else
92
+ Debug . LogWarning ( "Persistent event is already set! Skip microphone reader listener." ) ;
68
93
}
69
94
70
95
return odin ;
71
96
}
72
97
73
- [ MenuItem ( MenuTag + "/OdinManager/ Components/Basic" ) ]
98
+ [ MenuItem ( MenuEditorTag + "/Components/Basic (OdinRoom) " ) ]
74
99
public static GameObject CreateComponents ( )
75
100
{
76
101
GameObject obj = Selection . activeGameObject ;
@@ -80,77 +105,56 @@ public static GameObject CreateComponents()
80
105
return null ;
81
106
}
82
107
83
- #if UNITY_6000_0_OR_NEWER
84
- OdinEditorConfig config = FindFirstObjectByType < OdinEditorConfig > ( ) ;
85
- #else
86
- OdinEditorConfig [ ] configs = FindObjectsOfType < OdinEditorConfig > ( ) ;
87
- OdinEditorConfig config = configs . Length <= 0 ? obj . AddComponent < OdinEditorConfig > ( ) : configs [ 0 ] ;
88
- #endif
89
- if ( config != null ) config . DeviceSampleRate = OdinNative . Core . MediaSampleRate . Hz48000 ;
90
-
91
- OdinHandler handler = obj . GetComponent < OdinHandler > ( ) ;
92
- if ( handler == null ) handler = obj . AddComponent < OdinHandler > ( ) ;
93
- if ( handler != null )
94
- {
95
- handler . Use3DAudio = true ;
96
- handler . CreatePlayback = false ;
97
- }
108
+ OdinRoom [ ] rooms = FindObjectsOfType < OdinRoom > ( ) ;
109
+ OdinRoom room = rooms . Length <= 0 ? obj . AddComponent < OdinRoom > ( ) : rooms [ 0 ] ;
98
110
99
111
return obj ;
100
112
}
101
113
102
- [ MenuItem ( MenuTag + "/OdinManager/ Components/Extended" ) ]
114
+ [ MenuItem ( MenuEditorTag + "/Components/Extended (Room, Microphone) " ) ]
103
115
public static GameObject CreateFullComponents ( )
104
116
{
105
117
GameObject obj = CreateComponents ( ) ;
106
118
107
- OdinHandler handler = obj . GetComponent < OdinHandler > ( ) ;
108
-
109
- #if UNITY_6000_0_OR_NEWER
110
- MicrophoneReader [ ] micReaders = FindObjectsByType < MicrophoneReader > ( FindObjectsSortMode . None ) ;
111
- #else
112
- MicrophoneReader [ ] micReaders = FindObjectsOfType < MicrophoneReader > ( ) ;
113
- #endif
114
- if ( handler != null ) handler . Microphone = micReaders . Length <= 0 ? obj . AddComponent < MicrophoneReader > ( ) : micReaders [ 0 ] ;
119
+ OdinRoom handler = obj . GetComponent < OdinRoom > ( ) ;
120
+ OdinMicrophoneReader [ ] micReaders = FindObjectsOfType < OdinMicrophoneReader > ( ) ;
121
+ if ( handler != null )
122
+ {
123
+ var mic = micReaders . Length <= 0 ? obj . AddComponent < OdinMicrophoneReader > ( ) : micReaders [ 0 ] ;
124
+ if ( mic . OnAudioData == null ) mic . OnAudioData = new OdinNative . Unity . Events . UnityAudioData ( ) ;
125
+ if ( mic . OnAudioData . GetPersistentEventCount ( ) > 0 )
126
+ {
127
+ Debug . LogWarning ( "Skip listener! Persistent event is already set." ) ;
128
+ return obj ;
129
+ }
130
+
131
+ #if UNITY_EDITOR
132
+ UnityEditor . Events . UnityEventTools . AddPersistentListener ( mic . OnAudioData , handler . ProxyAudio ) ;
133
+ #else
134
+ mic . OnAudioData . AddListener ( handler . ProxyAudio ) ;
135
+ #endif
136
+ }
115
137
116
138
return obj ;
117
139
}
118
140
119
- [ MenuItem ( MenuTag + "/OdinManager/ Link AudioMixerGroup" ) ]
141
+ [ MenuItem ( MenuTag + "/Link AudioMixerGroup to OdinRoom " ) ]
120
142
public static void LinkAudioMixerGroup ( )
121
143
{
122
144
Object obj = Selection . activeObject ;
123
- #if UNITY_6000_0_OR_NEWER
124
- foreach ( OdinHandler handler in FindObjectsByType < OdinHandler > ( FindObjectsSortMode . None ) )
125
- {
126
- if ( obj is AudioMixerGroup )
127
- {
128
- AudioMixerGroup group = obj as AudioMixerGroup ;
129
- handler . PlaybackAudioMixer = group . audioMixer ;
130
- handler . PlaybackAudioMixerGroup = group ;
131
- }
132
- else
133
- {
134
- Debug . LogWarning ( "Selection has to be an AudioMixerGroup!" ) ;
135
- break ;
136
- }
137
- }
138
- #else
139
- foreach ( OdinHandler handler in FindObjectsOfType < OdinHandler > ( ) )
145
+ foreach ( OdinRoom handler in FindObjectsOfType < OdinRoom > ( ) )
140
146
{
141
147
if ( obj is AudioMixerGroup )
142
148
{
143
149
AudioMixerGroup group = obj as AudioMixerGroup ;
144
- handler . PlaybackAudioMixer = group . audioMixer ;
145
- handler . PlaybackAudioMixerGroup = group ;
150
+ handler . AudioMixerGroup = group ;
146
151
}
147
152
else
148
153
{
149
154
Debug . LogWarning ( "Selection has to be an AudioMixerGroup!" ) ;
150
155
break ;
151
156
}
152
157
}
153
- #endif
154
158
}
155
159
}
156
160
#endif
0 commit comments