Exemple #1
0
        private void _playImpactSound(int key, int subKey, short volume, short pitch, VRC.Player instigator)
        {
            if (VRC.Network.GetOwner(base.gameObject) != instigator)
            {
                return;
            }
            PhysSoundAudioSet physSoundAudioSet = null;

            if (!this.SoundMaterial.audioSetDic.TryGetValue(key, out physSoundAudioSet) || physSoundAudioSet.Impacts.Count < subKey)
            {
                return;
            }
            AudioClip clip   = physSoundAudioSet.Impacts[subKey];
            float     num    = Mathf.HalfToFloat((ushort)volume);
            float     pitch2 = Mathf.HalfToFloat((ushort)pitch);

            if (this.PlayClipAtPoint)
            {
                if (!PhysSoundTempAudioPool.Instance.ClipIsPlaying(clip))
                {
                    PhysSoundTempAudioPool.Instance.PlayClip(clip, base.transform.position, this.ImpactAudio, (!this.SoundMaterial.ScaleImpactVolume) ? this.ImpactAudio.volume : num, pitch2);
                }
            }
            else
            {
                this.ImpactAudio.pitch = pitch2;
                if (this.SoundMaterial.ScaleImpactVolume)
                {
                    this.ImpactAudio.volume = num;
                }
                this.ImpactAudio.clip = clip;
                this.ImpactAudio.Play();
            }
        }
Exemple #2
0
        bool hasDuplicate(PhysSoundAudioSet aud)
        {
            foreach (PhysSoundAudioSet audSet in mat.AudioSets)
            {
                if (audSet != aud && audSet.Key == aud.Key)
                {
                    return(true);
                }
            }

            return(false);
        }
Exemple #3
0
        public override void OnInspectorGUI()
        {
            mat = target as PhysSoundMaterial;
            bool dupeFound = false;
            bool nullFound = false;

            pitchRand     = serializedObject.FindProperty("PitchRandomness");
            scaleMod      = serializedObject.FindProperty("ScaleMod");
            slidePitchMod = serializedObject.FindProperty("SlidePitchMod");
            slideVolMult  = serializedObject.FindProperty("SlideVolMultiplier");
            useColVel     = serializedObject.FindProperty("UseCollisionVelocity");
            scImpVol      = serializedObject.FindProperty("ScaleImpactVolume");
            relVelThr     = serializedObject.FindProperty("RelativeVelocityThreshold");
            impNormBias   = serializedObject.FindProperty("ImpactNormalBias");
            collMask      = serializedObject.FindProperty("CollisionMask");

            serializedObject.Update();

            EditorGUILayout.LabelField("General Properties:", EditorStyles.boldLabel);

            mat.MaterialTypeKey = EditorGUILayout.Popup("Material Type", mat.MaterialTypeKey, PhysSoundTypeList.PhysSoundTypes);
            EditorGUILayout.Separator();

            EditorGUILayout.PropertyField(relVelThr, true);

            EditorGUILayout.Separator();

            EditorGUILayout.PropertyField(pitchRand);
            EditorGUILayout.Slider(scaleMod, 0, 1, "Object Scale Mod");
            EditorGUILayout.Slider(impNormBias, 0, 1, "Impact Normal Bias");

            EditorGUILayout.Separator();

            EditorGUILayout.PropertyField(slidePitchMod);
            EditorGUILayout.PropertyField(slideVolMult);

            EditorGUILayout.Separator();

            EditorGUILayout.PropertyField(collMask);

            EditorGUILayout.Separator();

            EditorGUILayout.PropertyField(useColVel);
            EditorGUILayout.PropertyField(scImpVol);

            EditorGUILayout.Separator();
            GUILayout.Box("", GUILayout.MaxWidth(Screen.width - 25f), GUILayout.Height(dividerHeight));

            EditorGUILayout.LabelField("Audio Sets:", EditorStyles.boldLabel);

            if (mat.AudioSets.Count == 0)
            {
                GUILayout.BeginHorizontal();
                GUILayout.FlexibleSpace();

                GUILayout.Label("The Audio Set List is Empty.", EditorStyles.boldLabel);

                GUILayout.FlexibleSpace();
                GUILayout.EndHorizontal();
            }
            else
            {
                mat.FallbackTypeIndex = EditorGUILayout.Popup("Fallback Audio Set", mat.FallbackTypeIndex, mat.GetFallbackAudioSets());

                if (mat.UseCollisionVelocity)
                {
                    EditorGUILayout.HelpBox("You are using Collision Velocity. Remember that Impact clips must be ordered from least forceful to most forceful.", MessageType.Info);
                }

                EditorGUILayout.Separator();

                audioSetFoldout.Update(mat.AudioSets.Count, false);
                impactsFoldout.Update(mat.AudioSets.Count, false);

                for (int i = 0; i < mat.AudioSets.Count; i++)
                {
                    PhysSoundAudioSet aud = mat.AudioSets[i];
                    Color             c   = GUI.color;

                    if (hasDuplicate(aud))
                    {
                        dupeFound = true;
                        GUI.color = new Color(1, 0.5f, 0.5f);
                    }

                    if (!PhysSoundTypeList.HasKey(aud.Key))
                    {
                        nullFound = true;
                        GUI.color = new Color(1, 0.5f, 0.5f);
                    }

                    EditorGUILayout.BeginHorizontal();

                    audioSetFoldout[i] = EditorGUILayout.Foldout(audioSetFoldout[i], "Material Type:");
                    GUILayout.Space(35);
                    aud.Key = EditorGUILayout.Popup(aud.Key, PhysSoundTypeList.PhysSoundTypes);

                    GUILayout.FlexibleSpace();

                    GUI.color = c * new Color(1, 1, 0.5f);

                    if (GUILayout.Button("Remove", GUILayout.MaxWidth(75), GUILayout.MaxHeight(17)))
                    {
                        mat.AudioSets.RemoveAt(i);
                        i--;
                        continue;
                    }

                    GUI.color = c;

                    EditorGUILayout.EndHorizontal();

                    if (audioSetFoldout[i])
                    {
                        GUILayout.BeginVertical(EditorStyles.textField);
                        GUILayout.Space(3);

                        EditorGUI.indentLevel++;
                        impactsFoldout[i] = EditorGUILayout.Foldout(impactsFoldout[i], "Impact Clips");

                        if (impactsFoldout[i])
                        {
                            AudioClip newClip = null;
                            newClip = EditorGUILayout.ObjectField("Add Clip", newClip, typeof(AudioClip), true) as AudioClip;

                            if (newClip != null)
                            {
                                aud.Impacts.Add(newClip);
                            }

                            for (int j = 0; j < aud.Impacts.Count; j++)
                            {
                                GUILayout.BeginHorizontal();
                                aud.Impacts[j] = EditorGUILayout.ObjectField(aud.Impacts[j], typeof(AudioClip), true) as AudioClip;

                                if (GUILayout.Button("X", GUILayout.MaxWidth(18), GUILayout.MaxHeight(15)))
                                {
                                    aud.Impacts.RemoveAt(j);
                                    i--;
                                }

                                GUILayout.EndHorizontal();
                            }
                            EditorGUILayout.Separator();
                        }
                        EditorGUI.indentLevel--;

                        aud.Slide = EditorGUILayout.ObjectField("Slide Clip", aud.Slide, typeof(AudioClip), true) as AudioClip;

                        GUILayout.Space(3);
                        GUILayout.EndVertical();
                    }

                    GUILayout.Space(2);
                }
            }
            GUILayout.Space(2);
            EditorGUILayout.BeginHorizontal();
            GUILayout.FlexibleSpace();

            if (GUILayout.Button("Add New Audio Set", GUILayout.MaxWidth(150), GUILayout.Height(25)))
            {
                mat.AudioSets.Add(new PhysSoundAudioSet());
            }

            GUILayout.FlexibleSpace();
            EditorGUILayout.EndHorizontal();

            if (dupeFound)
            {
                EditorGUILayout.HelpBox("You have multiple Audio Sets with for the same Material Type! Any duplicate sets will not be used during runtime.", MessageType.Error);
            }
            if (nullFound)
            {
                EditorGUILayout.HelpBox("You have Audio Sets with invalid material types!", MessageType.Error);
            }

            EditorUtility.SetDirty(mat);

            serializedObject.ApplyModifiedProperties();
        }
        bool hasDuplicate(PhysSoundAudioSet aud)
        {
            foreach (PhysSoundAudioSet audSet in mat.AudioSets)
            {
                if (audSet != aud && audSet.Key == aud.Key)
                    return true;
            }

            return false;
        }