Added Unity project files
This commit is contained in:
@ -0,0 +1,230 @@
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
using UnityEditor;
|
||||
using VRC.SDKBase;
|
||||
|
||||
[InitializeOnLoad]
|
||||
public class AutoAddSpatialAudioComponents
|
||||
{
|
||||
|
||||
public static bool Enabled = true;
|
||||
|
||||
static AutoAddSpatialAudioComponents()
|
||||
{
|
||||
EditorApplication.hierarchyChanged += OnHierarchyWindowChanged;
|
||||
EditorApplication.projectChanged += OnProjectWindowChanged;
|
||||
RegisterCallbacks();
|
||||
}
|
||||
|
||||
static void OnHierarchyWindowChanged()
|
||||
{
|
||||
if (!Enabled)
|
||||
{
|
||||
EditorApplication.hierarchyChanged -= OnHierarchyWindowChanged;
|
||||
return;
|
||||
}
|
||||
|
||||
// check for proper use of VRCSP, and warn
|
||||
//TryToAddSpatializationToAllAudioSources(true, false);
|
||||
}
|
||||
|
||||
static void OnProjectWindowChanged()
|
||||
{
|
||||
RegisterCallbacks();
|
||||
}
|
||||
|
||||
static void RegisterCallbacks()
|
||||
{
|
||||
VRCSdkControlPanel._EnableSpatialization = VRCSDKControlPanel_EnableSpatialization;
|
||||
}
|
||||
|
||||
// callback from VrcSdkControlPanel in dll
|
||||
public static void VRCSDKControlPanel_EnableSpatialization()
|
||||
{
|
||||
Debug.Log("Enabling spatialization on 3D AudioSources...");
|
||||
TryToAddSpatializationToAllAudioSources(false, true);
|
||||
}
|
||||
|
||||
static bool ApplyDefaultSpatializationToAudioSource(AudioSource audioSrc, bool force = false)
|
||||
{
|
||||
if (audioSrc == null)
|
||||
return false;
|
||||
|
||||
var vrcsp = audioSrc.gameObject.GetComponent<VRC.SDKBase.VRC_SpatialAudioSource>();
|
||||
|
||||
// don't make changes if we already have a vrcsp and we aren't forcing
|
||||
if (vrcsp != null && !force)
|
||||
return false;
|
||||
|
||||
if (force)
|
||||
audioSrc.spatialBlend = 1;
|
||||
|
||||
bool initValues = force;
|
||||
|
||||
// is audio source set to be 2D?
|
||||
bool is2D = audioSrc.spatialBlend == 0;
|
||||
|
||||
if (vrcsp == null)
|
||||
{
|
||||
// no onsp and no vrcsp, so add
|
||||
vrcsp = audioSrc.gameObject.AddComponent<VRC.SDKBase.VRC_SpatialAudioSource>();
|
||||
if (is2D)
|
||||
{
|
||||
// this audio source was marked as 2D, leave the vrcsp disabled
|
||||
vrcsp.EnableSpatialization = false;
|
||||
}
|
||||
initValues = true;
|
||||
}
|
||||
|
||||
audioSrc.spatialize = vrcsp.EnableSpatialization;
|
||||
vrcsp.enabled = true;
|
||||
|
||||
if (initValues)
|
||||
{
|
||||
bool isAvatar = audioSrc.GetComponentInParent<VRC.SDKBase.VRC_AvatarDescriptor>();
|
||||
|
||||
vrcsp.Gain = isAvatar ? AudioManagerSettings.AvatarAudioMaxGain : AudioManagerSettings.RoomAudioGain;
|
||||
vrcsp.Near = 0;
|
||||
vrcsp.Far = isAvatar ? AudioManagerSettings.AvatarAudioMaxRange : AudioManagerSettings.RoomAudioMaxRange;
|
||||
vrcsp.UseAudioSourceVolumeCurve = false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void TryToAddSpatializationToAllAudioSources(bool newAudioSourcesOnly, bool includeInactive)
|
||||
{
|
||||
AudioSource[] allAudioSources = includeInactive ? Resources.FindObjectsOfTypeAll<AudioSource>() : Object.FindObjectsByType<AudioSource>(FindObjectsSortMode.None);
|
||||
foreach (AudioSource src in allAudioSources)
|
||||
{
|
||||
if (src == null || src.gameObject == null || src.gameObject.scene != UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (newAudioSourcesOnly)
|
||||
{
|
||||
if (!IsNewAudioSource(src))
|
||||
continue;
|
||||
|
||||
UnityEngine.Audio.AudioMixerGroup mixer = AssetDatabase.LoadAssetAtPath<UnityEngine.Audio.AudioMixerGroup>("Assets/VRCSDK/Dependencies/OSPNative/scenes/mixers/SpatializerMixer.mixer");
|
||||
if (mixer != null)
|
||||
{
|
||||
src.outputAudioMixerGroup = mixer;
|
||||
}
|
||||
}
|
||||
|
||||
if (ApplyDefaultSpatializationToAudioSource(src, false))
|
||||
{
|
||||
Debug.Log("Automatically added VRC_SpatialAudioSource component to " + GetGameObjectPath(src.gameObject) + "!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static bool IsNewAudioSource(AudioSource src)
|
||||
{
|
||||
var vrcsp = src.GetComponent<VRC_SpatialAudioSource>();
|
||||
if (vrcsp != null)
|
||||
return false;
|
||||
|
||||
if (src.clip != null)
|
||||
return false;
|
||||
if (src.outputAudioMixerGroup != null)
|
||||
return false;
|
||||
|
||||
if (src.mute || src.bypassEffects || src.bypassReverbZones || !src.playOnAwake || src.loop)
|
||||
return false;
|
||||
|
||||
if (src.priority != 128 ||
|
||||
!Mathf.Approximately(src.volume, 1.0f) ||
|
||||
!Mathf.Approximately(src.pitch, 1.0f) ||
|
||||
!Mathf.Approximately(src.panStereo, 0.0f) ||
|
||||
!Mathf.Approximately(src.spatialBlend, 0.0f) ||
|
||||
!Mathf.Approximately(src.reverbZoneMix, 1.0f))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!Mathf.Approximately(src.dopplerLevel, 1.0f) ||
|
||||
!Mathf.Approximately(src.spread, 0.0f) ||
|
||||
src.rolloffMode != AudioRolloffMode.Logarithmic ||
|
||||
!Mathf.Approximately(src.minDistance, 1.0f) ||
|
||||
!Mathf.Approximately(src.maxDistance, 500.0f))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static string GetGameObjectPath(GameObject obj)
|
||||
{
|
||||
string path = "/" + obj.name;
|
||||
while (obj.transform.parent != null)
|
||||
{
|
||||
obj = obj.transform.parent.gameObject;
|
||||
path = "/" + obj.name + path;
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
public static void ConvertONSPAudioSource(AudioSource src)
|
||||
{
|
||||
if (src == null) return;
|
||||
|
||||
var onsp = src.GetComponent<ONSPAudioSource>();
|
||||
if (onsp != null)
|
||||
{
|
||||
var vrcsp = src.gameObject.GetComponent<VRC.SDKBase.VRC_SpatialAudioSource>();
|
||||
if (vrcsp == null)
|
||||
{
|
||||
// copy the values from deprecated component
|
||||
vrcsp = src.gameObject.AddComponent<VRC.SDKBase.VRC_SpatialAudioSource>();
|
||||
vrcsp.Gain = onsp.Gain;
|
||||
vrcsp.Near = onsp.Near;
|
||||
vrcsp.Far = onsp.Far;
|
||||
vrcsp.UseAudioSourceVolumeCurve = !onsp.UseInvSqr;
|
||||
vrcsp.EnableSpatialization = onsp.EnableSpatialization;
|
||||
}
|
||||
// remove deprecated component
|
||||
Component.DestroyImmediate(onsp);
|
||||
}
|
||||
}
|
||||
|
||||
public static void AddVRCSpatialToBareAudioSource(AudioSource src)
|
||||
{
|
||||
if (src == null) return;
|
||||
|
||||
var vrcsp = src.gameObject.GetComponent<VRC.SDKBase.VRC_SpatialAudioSource>();
|
||||
if (vrcsp != null) return;
|
||||
|
||||
#if VRC_SDK_VRCSDK2
|
||||
vrcsp = src.gameObject.AddComponent<VRCSDK2.VRC_SpatialAudioSource>();
|
||||
#elif UDON
|
||||
vrcsp = src.gameObject.AddComponent<VRC.SDK3.Components.VRCSpatialAudioSource>();
|
||||
#endif
|
||||
|
||||
// add default values
|
||||
bool isAvatar = src.gameObject.GetComponentInParent<VRC.SDKBase.VRC_AvatarDescriptor>();
|
||||
|
||||
vrcsp.Gain = isAvatar ? AudioManagerSettings.AvatarAudioMaxGain : AudioManagerSettings.RoomAudioGain;
|
||||
vrcsp.Near = 0;
|
||||
vrcsp.Far = isAvatar ? AudioManagerSettings.AvatarAudioMaxRange : AudioManagerSettings.RoomAudioMaxRange;
|
||||
vrcsp.UseAudioSourceVolumeCurve = false;
|
||||
|
||||
// enable spatialization if src is not 2D
|
||||
vrcsp.EnableSpatialization = false;
|
||||
AnimationCurve curve = src.GetCustomCurve(AudioSourceCurveType.SpatialBlend);
|
||||
if (curve != null)
|
||||
{
|
||||
foreach (var key in curve.keys)
|
||||
{
|
||||
if (key.value != 0 || key.inTangent != 0)
|
||||
{
|
||||
vrcsp.EnableSpatialization = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0a364ece829b6234888c59987a305a00
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,62 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using Object = UnityEngine.Object;
|
||||
|
||||
public class EditorCoroutine
|
||||
{
|
||||
public static EditorCoroutine Start( IEnumerator _routine )
|
||||
{
|
||||
EditorCoroutine coroutine = new EditorCoroutine(_routine);
|
||||
coroutine.start();
|
||||
return coroutine;
|
||||
}
|
||||
|
||||
|
||||
public static EditorCoroutine Start(System.Action _action)
|
||||
{
|
||||
EditorCoroutine coroutine = new EditorCoroutine(_action);
|
||||
coroutine.start();
|
||||
return coroutine;
|
||||
}
|
||||
|
||||
readonly IEnumerator routine;
|
||||
EditorCoroutine( IEnumerator _routine )
|
||||
{
|
||||
routine = _routine;
|
||||
}
|
||||
|
||||
readonly System.Action action;
|
||||
EditorCoroutine(System.Action _action)
|
||||
{
|
||||
action = _action;
|
||||
}
|
||||
|
||||
void start()
|
||||
{
|
||||
EditorApplication.update += update;
|
||||
}
|
||||
public void stop()
|
||||
{
|
||||
EditorApplication.update -= update;
|
||||
}
|
||||
|
||||
void update()
|
||||
{
|
||||
if (routine != null)
|
||||
{
|
||||
if (!routine.MoveNext())
|
||||
stop();
|
||||
}
|
||||
else if (action != null)
|
||||
{
|
||||
action();
|
||||
stop();
|
||||
}
|
||||
else
|
||||
stop();
|
||||
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 89005ebc9543e0a4284893c09ca19b1d
|
||||
timeCreated: 1473271738
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,17 @@
|
||||
using UnityEditor;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
[InitializeOnLoad]
|
||||
public static class EditorHandling
|
||||
{
|
||||
static EditorHandling()
|
||||
{
|
||||
UnityEditor.SceneManagement.EditorSceneManager.sceneOpened += SceneOpenedCallback;
|
||||
}
|
||||
|
||||
static void SceneOpenedCallback( Scene scene, UnityEditor.SceneManagement.OpenSceneMode mode)
|
||||
{
|
||||
// refresh window when scene is opened to display content images correctly
|
||||
if (null != VRCSdkControlPanel.window) VRCSdkControlPanel.window.Reset();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3d6c2e367eaa9564ebf6267ec163cfbd
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,358 @@
|
||||
#if UNITY_EDITOR
|
||||
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using UnityEditor.SceneManagement;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using VRC.SDKBase;
|
||||
|
||||
namespace VRCSDK2
|
||||
{
|
||||
#if VRC_SDK_VRCSDK2
|
||||
[CustomEditor(typeof(VRCSDK2.VRC_EventHandler))]
|
||||
public class EventHandlerEditor : UnityEditor.Editor
|
||||
{
|
||||
bool showDeferredEvents = false;
|
||||
|
||||
static VRCSDK2.VRC_EventHandler.VrcEventType lastAddedEventType = VRCSDK2.VRC_EventHandler.VrcEventType.SendMessage;
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
VRCSDK2.VRC_EventHandler myTarget = (VRCSDK2.VRC_EventHandler)target;
|
||||
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("ID:");
|
||||
EditorGUILayout.EndHorizontal();
|
||||
|
||||
if (myTarget.GetComponent<VRCSDK2.VRC_Trigger>() != null)
|
||||
{
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Add Events via the VRC_Trigger on this object.");
|
||||
EditorGUILayout.EndHorizontal();
|
||||
}
|
||||
else
|
||||
{
|
||||
EditorGUI.BeginChangeCheck();
|
||||
|
||||
RenderOldEditor(myTarget);
|
||||
|
||||
if (EditorGUI.EndChangeCheck())
|
||||
EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
|
||||
}
|
||||
|
||||
if (myTarget.deferredEvents.Count > 0)
|
||||
{
|
||||
showDeferredEvents = EditorGUILayout.Foldout(showDeferredEvents, "Deferred Events");
|
||||
if (showDeferredEvents)
|
||||
RenderEvents(myTarget.deferredEvents);
|
||||
}
|
||||
}
|
||||
|
||||
int[] sendMessageMethodIndicies;
|
||||
private void RenderOldEditor(VRCSDK2.VRC_EventHandler myTarget)
|
||||
{
|
||||
EditorGUILayout.HelpBox("Please use a VRC_Trigger in the future.", MessageType.Error);
|
||||
|
||||
if (GUILayout.Button("Add Event Handler"))
|
||||
myTarget.Events.Add(new VRCSDK2.VRC_EventHandler.VrcEvent());
|
||||
|
||||
bool first = true;
|
||||
int deleteEventIndex = -1;
|
||||
if (sendMessageMethodIndicies == null || sendMessageMethodIndicies.Length != myTarget.Events.Count)
|
||||
sendMessageMethodIndicies = new int[myTarget.Events.Count + 1];
|
||||
|
||||
for (int i = 0; i < myTarget.Events.Count; ++i)
|
||||
{
|
||||
if (!first)
|
||||
EditorGUILayout.Separator();
|
||||
first = false;
|
||||
|
||||
EditorGUILayout.LabelField("Event " + (i + 1).ToString());
|
||||
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Event Name");
|
||||
myTarget.Events[i].Name = EditorGUILayout.TextField(myTarget.Events[i].Name);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Event Type");
|
||||
myTarget.Events[i].EventType = (VRCSDK2.VRC_EventHandler.VrcEventType)EditorGUILayout.EnumPopup(myTarget.Events[i].EventType);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
|
||||
switch (myTarget.Events[i].EventType)
|
||||
{
|
||||
case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationBool:
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Variable");
|
||||
myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Operation");
|
||||
myTarget.Events[i].ParameterBoolOp = (VRCSDK2.VRC_EventHandler.VrcBooleanOp)EditorGUILayout.EnumPopup(myTarget.Events[i].ParameterBoolOp);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
break;
|
||||
case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationFloat:
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Variable");
|
||||
myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Value");
|
||||
myTarget.Events[i].ParameterFloat = EditorGUILayout.FloatField(myTarget.Events[i].ParameterFloat);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
break;
|
||||
case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationTrigger:
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Trigger");
|
||||
myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
break;
|
||||
case VRCSDK2.VRC_EventHandler.VrcEventType.AudioTrigger:
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("AudioSource");
|
||||
myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
break;
|
||||
case VRCSDK2.VRC_EventHandler.VrcEventType.MeshVisibility:
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Mesh");
|
||||
myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Operation");
|
||||
myTarget.Events[i].ParameterBoolOp = (VRCSDK2.VRC_EventHandler.VrcBooleanOp)EditorGUILayout.EnumPopup(myTarget.Events[i].ParameterBoolOp);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
break;
|
||||
case VRCSDK2.VRC_EventHandler.VrcEventType.PlayAnimation:
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Target");
|
||||
myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Animation");
|
||||
myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
break;
|
||||
case VRCSDK2.VRC_EventHandler.VrcEventType.RunConsoleCommand:
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Command");
|
||||
myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
break;
|
||||
case VRCSDK2.VRC_EventHandler.VrcEventType.SendMessage:
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Receiver");
|
||||
myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Message");
|
||||
|
||||
// sorry for this shit show. Below allows us to show a list of public methods, but also allow custom messages
|
||||
var methods = VRC_EditorTools.GetAccessibleMethodsOnGameObject(myTarget.Events[i].ParameterObject);
|
||||
List<string> methodList = methods.Values.Aggregate(new List<string>(), (acc, lst) => { acc.AddRange(lst.Select(mi => mi.Name)); return acc; });
|
||||
methodList.Add("Custom Message");
|
||||
|
||||
string[] _choices = methodList.ToArray();
|
||||
|
||||
int currentIndex = methodList.Count - 1;
|
||||
|
||||
if (methodList.Contains(myTarget.Events[i].ParameterString))
|
||||
currentIndex = methodList.IndexOf(myTarget.Events[i].ParameterString);
|
||||
|
||||
sendMessageMethodIndicies[i] = EditorGUILayout.Popup(currentIndex, _choices);
|
||||
|
||||
if (sendMessageMethodIndicies[i] != methodList.Count - 1)
|
||||
{
|
||||
myTarget.Events[i].ParameterString = _choices[sendMessageMethodIndicies[i]];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (methodList.Contains(myTarget.Events[i].ParameterString))
|
||||
myTarget.Events[i].ParameterString = "";
|
||||
|
||||
myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString);
|
||||
}
|
||||
|
||||
EditorGUILayout.EndHorizontal();
|
||||
break;
|
||||
case VRCSDK2.VRC_EventHandler.VrcEventType.SetGameObjectActive:
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("GameObject");
|
||||
myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Operation");
|
||||
myTarget.Events[i].ParameterBoolOp = (VRCSDK2.VRC_EventHandler.VrcBooleanOp)EditorGUILayout.EnumPopup(myTarget.Events[i].ParameterBoolOp);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
break;
|
||||
case VRCSDK2.VRC_EventHandler.VrcEventType.SetParticlePlaying:
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Target");
|
||||
myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Operation");
|
||||
myTarget.Events[i].ParameterBoolOp = (VRCSDK2.VRC_EventHandler.VrcBooleanOp)EditorGUILayout.EnumPopup(myTarget.Events[i].ParameterBoolOp);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
break;
|
||||
case VRCSDK2.VRC_EventHandler.VrcEventType.TeleportPlayer:
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Location");
|
||||
myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Align Room To Destination");
|
||||
myTarget.Events[i].ParameterBoolOp = (VRCSDK2.VRC_EventHandler.VrcBooleanOp)EditorGUILayout.EnumPopup(myTarget.Events[i].ParameterBoolOp);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
break;
|
||||
case VRCSDK2.VRC_EventHandler.VrcEventType.SetWebPanelURI:
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("URI");
|
||||
myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Panel");
|
||||
myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
break;
|
||||
case VRCSDK2.VRC_EventHandler.VrcEventType.SetWebPanelVolume:
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Volume");
|
||||
myTarget.Events[i].ParameterFloat = EditorGUILayout.FloatField(myTarget.Events[i].ParameterFloat);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Panel");
|
||||
myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
break;
|
||||
default:
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
GUIStyle redText = new GUIStyle();
|
||||
redText.normal.textColor = Color.red;
|
||||
EditorGUILayout.LabelField("Unsupported event type", redText);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
break;
|
||||
}
|
||||
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("Delete " + myTarget.Events[i].Name + "?");
|
||||
if (GUILayout.Button("delete"))
|
||||
deleteEventIndex = i;
|
||||
EditorGUILayout.EndHorizontal();
|
||||
|
||||
if (myTarget.Events[i].ParameterObject == null)
|
||||
myTarget.Events[i].ParameterObject = myTarget.gameObject;
|
||||
}
|
||||
|
||||
|
||||
if (deleteEventIndex != -1)
|
||||
myTarget.Events.RemoveAt(deleteEventIndex);
|
||||
}
|
||||
|
||||
private void RenderEvents(IEnumerable<VRCSDK2.VRC_EventHandler.EventInfo> entries)
|
||||
{
|
||||
foreach (VRCSDK2.VRC_EventHandler.EventInfo entry in entries)
|
||||
{
|
||||
EditorGUILayout.PrefixLabel("Target");
|
||||
EditorGUILayout.ObjectField(entry.evt.ParameterObject, typeof(GameObject), true);
|
||||
|
||||
EditorGUILayout.LabelField(string.Format("Name: {0}", entry.evt.Name));
|
||||
EditorGUILayout.LabelField(string.Format("Type: {0}", entry.evt.EventType));
|
||||
EditorGUILayout.LabelField(string.Format("Bool: {0}", entry.evt.ParameterBool));
|
||||
EditorGUILayout.LabelField(string.Format("Float: {0}", entry.evt.ParameterFloat));
|
||||
EditorGUILayout.LabelField(string.Format("Int: {0}", entry.evt.ParameterInt));
|
||||
EditorGUILayout.LabelField(string.Format("String: {0}", entry.evt.ParameterString));
|
||||
|
||||
EditorGUILayout.Space();
|
||||
}
|
||||
}
|
||||
|
||||
public static void RenderEditor(VRCSDK2.VRC_EventHandler myTarget)
|
||||
{
|
||||
bool first = true;
|
||||
int deleteEventIndex = -1;
|
||||
|
||||
for (int i = 0; i < myTarget.Events.Count; ++i)
|
||||
{
|
||||
if (!first)
|
||||
EditorGUILayout.Separator();
|
||||
first = false;
|
||||
|
||||
if (RenderEventHeader(myTarget, myTarget.Events[i]))
|
||||
deleteEventIndex = i;
|
||||
|
||||
RenderEventHeader(myTarget, myTarget.Events[i]);
|
||||
|
||||
if (myTarget.Events[i].ParameterObject == null)
|
||||
myTarget.Events[i].ParameterObject = myTarget.gameObject;
|
||||
}
|
||||
|
||||
if (deleteEventIndex != -1)
|
||||
myTarget.Events.RemoveAt(deleteEventIndex);
|
||||
}
|
||||
|
||||
public static VRCSDK2.VRC_EventHandler.VrcEvent RenderAddEvent(VRCSDK2.VRC_EventHandler myTarget)
|
||||
{
|
||||
VRCSDK2.VRC_EventHandler.VrcEvent newEvent = null;
|
||||
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
lastAddedEventType = VRC_EditorTools.FilteredEnumPopup("New Event Type", lastAddedEventType, (v) => v != VRCSDK2.VRC_EventHandler.VrcEventType.SpawnObject && v != VRCSDK2.VRC_EventHandler.VrcEventType.SendMessage);
|
||||
if (GUILayout.Button("Add"))
|
||||
{
|
||||
newEvent = new VRCSDK2.VRC_EventHandler.VrcEvent
|
||||
{
|
||||
EventType = lastAddedEventType,
|
||||
ParameterObject = myTarget.gameObject
|
||||
};
|
||||
myTarget.Events.Add(newEvent);
|
||||
EditorUtility.SetDirty(myTarget);
|
||||
}
|
||||
EditorGUILayout.EndHorizontal();
|
||||
|
||||
return newEvent;
|
||||
}
|
||||
|
||||
public static bool RenderEventHeader(VRCSDK2.VRC_EventHandler myTarget, VRCSDK2.VRC_EventHandler.VrcEvent evt)
|
||||
{
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
evt.EventType = VRC_EditorTools.FilteredEnumPopup("New Event Type", evt.EventType, (v) => v != VRCSDK2.VRC_EventHandler.VrcEventType.SpawnObject && v != VRCSDK2.VRC_EventHandler.VrcEventType.SendMessage);
|
||||
bool delete = GUILayout.Button("Remove");
|
||||
EditorGUILayout.EndHorizontal();
|
||||
|
||||
return delete;
|
||||
}
|
||||
}
|
||||
|
||||
[CustomEditor(typeof(VRC.SDKBase.VRC_EventHandler))]
|
||||
public class SDKBaseEventHandlerEditor : UnityEditor.Editor
|
||||
{
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
EditorGUILayout.LabelField("Event Handlers are not supported in VRCSDK3.");
|
||||
if (GUILayout.Button("replace me with the correct VRC_EventHandler"))
|
||||
{
|
||||
var go = ((VRC.SDKBase.VRC_EventHandler)target).gameObject;
|
||||
DestroyImmediate(target);
|
||||
go.AddComponent<VRCSDK2.VRC_EventHandler>();
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
||||
[CustomEditor(typeof(VRC.SDKBase.VRC_EventHandler))]
|
||||
public class SDKBaseEventHandlerEditor : UnityEditor.Editor
|
||||
{
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
EditorGUILayout.LabelField("Event Handlers are not supported in VRCSDK3.");
|
||||
if( GUILayout.Button("delete me") )
|
||||
DestroyImmediate(target);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4810e652e8242384c834320970702290
|
||||
timeCreated: 1454469344
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,48 @@
|
||||
#if VRC_SDK_VRCSDK2 && UNITY_EDITOR
|
||||
|
||||
#pragma warning disable 0618
|
||||
|
||||
using UnityEditor;
|
||||
using System.Collections;
|
||||
|
||||
namespace VRCSDK2
|
||||
{
|
||||
[CustomEditor(typeof(VRCSDK2.VRC_KeyEvents))]
|
||||
public class VRC_KeyEventsEditor : UnityEditor.Editor
|
||||
{
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
EditorGUILayout.HelpBox("Obsolete. Please use a VRC_Trigger instead.", MessageType.Error);
|
||||
}
|
||||
}
|
||||
|
||||
[CustomEditor(typeof(VRCSDK2.VRC_UseEvents))]
|
||||
public class VRC_UseEventsEditor : UnityEditor.Editor
|
||||
{
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
EditorGUILayout.HelpBox("Obsolete. Please use a VRC_Trigger instead.", MessageType.Error);
|
||||
}
|
||||
}
|
||||
|
||||
[CustomEditor(typeof(VRCSDK2.VRC_TriggerColliderEventTrigger))]
|
||||
public class VRC_TriggerColliderEventTriggerEditor : UnityEditor.Editor
|
||||
{
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
EditorGUILayout.HelpBox("Obsolete. Please use a VRC_Trigger instead.", MessageType.Error);
|
||||
}
|
||||
}
|
||||
|
||||
[CustomEditor(typeof(VRCSDK2.VRC_TimedEvents))]
|
||||
public class VRC_TimedEventsEditor : UnityEditor.Editor
|
||||
{
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
EditorGUILayout.HelpBox("Obsolete. Please use a VRC_Trigger instead.", MessageType.Error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma warning restore 0618
|
||||
#endif
|
||||
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 482185bf29f12074dada194ffef6a682
|
||||
timeCreated: 1475877803
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,225 @@
|
||||
#if VRC_SDK_VRCSDK2 && !VRC_CLIENT
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using VRC.SDK3.Editor;
|
||||
using VRC.SDKBase.Editor;
|
||||
|
||||
[CustomEditor(typeof(VRCSDK2.VRC_AvatarDescriptor))]
|
||||
public class AvatarDescriptorEditor : Editor
|
||||
{
|
||||
VRCSDK2.VRC_AvatarDescriptor avatarDescriptor;
|
||||
VRC.Core.PipelineManager pipelineManager;
|
||||
|
||||
SkinnedMeshRenderer selectedMesh;
|
||||
List<string> blendShapeNames = null;
|
||||
|
||||
bool shouldRefreshVisemes = false;
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
if (avatarDescriptor == null)
|
||||
avatarDescriptor = (VRCSDK2.VRC_AvatarDescriptor)target;
|
||||
|
||||
if (pipelineManager == null)
|
||||
{
|
||||
pipelineManager = avatarDescriptor.GetComponent<VRC.Core.PipelineManager>();
|
||||
if (pipelineManager == null)
|
||||
avatarDescriptor.gameObject.AddComponent<VRC.Core.PipelineManager>();
|
||||
}
|
||||
|
||||
// DrawDefaultInspector();
|
||||
|
||||
if(VRCSdkControlPanel.window != null)
|
||||
{
|
||||
if( GUILayout.Button( "Select this avatar in the SDK control panel" ) )
|
||||
VRCSdkControlPanelAvatarBuilder.SelectAvatar(avatarDescriptor);
|
||||
}
|
||||
|
||||
avatarDescriptor.ViewPosition = EditorGUILayout.Vector3Field("View Position", avatarDescriptor.ViewPosition);
|
||||
//avatarDescriptor.Name = EditorGUILayout.TextField("Avatar Name", avatarDescriptor.Name);
|
||||
avatarDescriptor.Animations = (VRCSDK2.VRC_AvatarDescriptor.AnimationSet)EditorGUILayout.EnumPopup("Default Animation Set", avatarDescriptor.Animations);
|
||||
avatarDescriptor.CustomStandingAnims = (AnimatorOverrideController)EditorGUILayout.ObjectField("Custom Standing Anims", avatarDescriptor.CustomStandingAnims, typeof(AnimatorOverrideController), true, null);
|
||||
avatarDescriptor.CustomSittingAnims = (AnimatorOverrideController)EditorGUILayout.ObjectField("Custom Sitting Anims", avatarDescriptor.CustomSittingAnims, typeof(AnimatorOverrideController), true, null);
|
||||
avatarDescriptor.ScaleIPD = EditorGUILayout.Toggle("Scale IPD", avatarDescriptor.ScaleIPD);
|
||||
|
||||
avatarDescriptor.lipSync = (VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle)EditorGUILayout.EnumPopup("Lip Sync", avatarDescriptor.lipSync);
|
||||
switch (avatarDescriptor.lipSync)
|
||||
{
|
||||
case VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.Default:
|
||||
if (GUILayout.Button("Auto Detect!"))
|
||||
AutoDetectLipSync();
|
||||
break;
|
||||
|
||||
case VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.JawFlapBlendShape:
|
||||
avatarDescriptor.VisemeSkinnedMesh = (SkinnedMeshRenderer)EditorGUILayout.ObjectField("Face Mesh", avatarDescriptor.VisemeSkinnedMesh, typeof(SkinnedMeshRenderer), true);
|
||||
if (avatarDescriptor.VisemeSkinnedMesh != null)
|
||||
{
|
||||
DetermineBlendShapeNames();
|
||||
|
||||
int current = -1;
|
||||
for (int b = 0; b < blendShapeNames.Count; ++b)
|
||||
if (avatarDescriptor.MouthOpenBlendShapeName == blendShapeNames[b])
|
||||
current = b;
|
||||
|
||||
string title = "Jaw Flap Blend Shape";
|
||||
int next = EditorGUILayout.Popup(title, current, blendShapeNames.ToArray());
|
||||
if (next >= 0)
|
||||
avatarDescriptor.MouthOpenBlendShapeName = blendShapeNames[next];
|
||||
}
|
||||
break;
|
||||
|
||||
case VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.JawFlapBone:
|
||||
avatarDescriptor.lipSyncJawBone = (Transform)EditorGUILayout.ObjectField("Jaw Bone", avatarDescriptor.lipSyncJawBone, typeof(Transform), true);
|
||||
break;
|
||||
|
||||
case VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.VisemeBlendShape:
|
||||
SkinnedMeshRenderer prev = avatarDescriptor.VisemeSkinnedMesh;
|
||||
avatarDescriptor.VisemeSkinnedMesh = (SkinnedMeshRenderer)EditorGUILayout.ObjectField("Face Mesh", avatarDescriptor.VisemeSkinnedMesh, typeof(SkinnedMeshRenderer), true);
|
||||
if (avatarDescriptor.VisemeSkinnedMesh != prev)
|
||||
shouldRefreshVisemes = true;
|
||||
if (avatarDescriptor.VisemeSkinnedMesh != null)
|
||||
{
|
||||
DetermineBlendShapeNames();
|
||||
|
||||
if (avatarDescriptor.VisemeBlendShapes == null || avatarDescriptor.VisemeBlendShapes.Length != (int)VRCSDK2.VRC_AvatarDescriptor.Viseme.Count)
|
||||
avatarDescriptor.VisemeBlendShapes = new string[(int)VRCSDK2.VRC_AvatarDescriptor.Viseme.Count];
|
||||
for (int i = 0; i < (int)VRCSDK2.VRC_AvatarDescriptor.Viseme.Count; ++i)
|
||||
{
|
||||
int current = -1;
|
||||
for (int b = 0; b < blendShapeNames.Count; ++b)
|
||||
if (avatarDescriptor.VisemeBlendShapes[i] == blendShapeNames[b])
|
||||
current = b;
|
||||
|
||||
string title = "Viseme: " + ((VRCSDK2.VRC_AvatarDescriptor.Viseme)i).ToString();
|
||||
int next = EditorGUILayout.Popup(title, current, blendShapeNames.ToArray());
|
||||
if (next >= 0)
|
||||
avatarDescriptor.VisemeBlendShapes[i] = blendShapeNames[next];
|
||||
}
|
||||
|
||||
if (shouldRefreshVisemes)
|
||||
AutoDetectVisemes();
|
||||
}
|
||||
break;
|
||||
}
|
||||
EditorGUILayout.LabelField("Unity Version", avatarDescriptor.unityVersion);
|
||||
}
|
||||
|
||||
void DetermineBlendShapeNames()
|
||||
{
|
||||
if (avatarDescriptor.VisemeSkinnedMesh != null &&
|
||||
avatarDescriptor.VisemeSkinnedMesh != selectedMesh)
|
||||
{
|
||||
blendShapeNames = new List<string>();
|
||||
blendShapeNames.Add("-none-");
|
||||
selectedMesh = avatarDescriptor.VisemeSkinnedMesh;
|
||||
if ((selectedMesh != null) && (selectedMesh.sharedMesh != null))
|
||||
{
|
||||
for (int i = 0; i < selectedMesh.sharedMesh.blendShapeCount; ++i)
|
||||
blendShapeNames.Add(selectedMesh.sharedMesh.GetBlendShapeName(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AutoDetectVisemes()
|
||||
{
|
||||
|
||||
// prioritize strict - but fallback to looser - naming and don't touch user-overrides
|
||||
|
||||
List<string> blendShapes = new List<string>(blendShapeNames);
|
||||
blendShapes.Remove("-none-");
|
||||
|
||||
for (int v = 0; v < avatarDescriptor.VisemeBlendShapes.Length; v++)
|
||||
{
|
||||
if (string.IsNullOrEmpty(avatarDescriptor.VisemeBlendShapes[v]))
|
||||
{
|
||||
string viseme = ((VRCSDK2.VRC_AvatarDescriptor.Viseme)v).ToString().ToLowerInvariant();
|
||||
|
||||
foreach (string s in blendShapes)
|
||||
{
|
||||
if (s.ToLowerInvariant() == "vrc.v_" + viseme)
|
||||
{
|
||||
avatarDescriptor.VisemeBlendShapes[v] = s;
|
||||
goto next;
|
||||
}
|
||||
}
|
||||
foreach (string s in blendShapes)
|
||||
{
|
||||
if (s.ToLowerInvariant() == "v_" + viseme)
|
||||
{
|
||||
avatarDescriptor.VisemeBlendShapes[v] = s;
|
||||
goto next;
|
||||
}
|
||||
}
|
||||
foreach (string s in blendShapes)
|
||||
{
|
||||
if (s.ToLowerInvariant().EndsWith(viseme))
|
||||
{
|
||||
avatarDescriptor.VisemeBlendShapes[v] = s;
|
||||
goto next;
|
||||
}
|
||||
}
|
||||
foreach (string s in blendShapes)
|
||||
{
|
||||
if (s.ToLowerInvariant() == viseme)
|
||||
{
|
||||
avatarDescriptor.VisemeBlendShapes[v] = s;
|
||||
goto next;
|
||||
}
|
||||
}
|
||||
foreach (string s in blendShapes)
|
||||
{
|
||||
if (s.ToLowerInvariant().Contains(viseme))
|
||||
{
|
||||
avatarDescriptor.VisemeBlendShapes[v] = s;
|
||||
goto next;
|
||||
}
|
||||
}
|
||||
next: { }
|
||||
}
|
||||
}
|
||||
|
||||
shouldRefreshVisemes = false;
|
||||
|
||||
}
|
||||
|
||||
void AutoDetectLipSync()
|
||||
{
|
||||
var smrs = avatarDescriptor.GetComponentsInChildren<SkinnedMeshRenderer>();
|
||||
foreach (var smr in smrs)
|
||||
{
|
||||
if (smr.sharedMesh.blendShapeCount > 0)
|
||||
{
|
||||
avatarDescriptor.lipSyncJawBone = null;
|
||||
|
||||
if (smr.sharedMesh.blendShapeCount > 1)
|
||||
{
|
||||
avatarDescriptor.lipSync = VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.VisemeBlendShape;
|
||||
avatarDescriptor.VisemeSkinnedMesh = smr;
|
||||
shouldRefreshVisemes = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
avatarDescriptor.lipSync = VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.JawFlapBlendShape;
|
||||
avatarDescriptor.VisemeSkinnedMesh = null;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Animator a = avatarDescriptor.GetComponent<Animator>();
|
||||
if (!a)
|
||||
EditorUtility.DisplayDialog("Ooops", "This avatar has no Animator and can have no lipsync.", "OK");
|
||||
else if (a.GetBoneTransform(HumanBodyBones.Jaw) != null)
|
||||
{
|
||||
avatarDescriptor.lipSync = VRCSDK2.VRC_AvatarDescriptor.LipSyncStyle.JawFlapBone;
|
||||
avatarDescriptor.lipSyncJawBone = avatarDescriptor.GetComponent<Animator>().GetBoneTransform(HumanBodyBones.Jaw);
|
||||
avatarDescriptor.VisemeSkinnedMesh = null;
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5e83254bb97e84795ac882692ae124ba
|
||||
timeCreated: 1450462624
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,23 @@
|
||||
#if VRC_SDK_VRCSDK2
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
using UnityEditor;
|
||||
using System;
|
||||
|
||||
[CustomEditor(typeof(VRCSDK2.VRC_ObjectSpawn))]
|
||||
public class VRCObjectSpawnEditor : Editor
|
||||
{
|
||||
VRCSDK2.VRC_ObjectSpawn spawn;
|
||||
|
||||
void OnEnable()
|
||||
{
|
||||
if (spawn == null)
|
||||
spawn = (VRCSDK2.VRC_ObjectSpawn)target;
|
||||
}
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
DrawDefaultInspector();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 26a75599848adb449b7aceed5090e35c
|
||||
timeCreated: 1463516633
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,25 @@
|
||||
#if VRC_SDK_VRCSDK2
|
||||
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
using UnityEditor;
|
||||
using System;
|
||||
|
||||
[CustomEditor(typeof(VRCSDK2.VRC_ObjectSync))]
|
||||
public class VRCObjectSyncEditor : Editor
|
||||
{
|
||||
VRCSDK2.VRC_ObjectSync sync;
|
||||
|
||||
void OnEnable()
|
||||
{
|
||||
if (sync == null)
|
||||
sync = (VRCSDK2.VRC_ObjectSync)target;
|
||||
}
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
sync.SynchronizePhysics = EditorGUILayout.Toggle("Synchronize Physics",sync.SynchronizePhysics);
|
||||
sync.AllowCollisionTransfer = EditorGUILayout.Toggle("Allow Collision Transfer", sync.AllowCollisionTransfer);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ed4aad2698d3b62408e69b57c7748791
|
||||
timeCreated: 1463516212
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,37 @@
|
||||
#if VRC_SDK_VRCSDK2
|
||||
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
|
||||
public class VRCPlayerModEditorWindow : EditorWindow {
|
||||
|
||||
public delegate void AddModCallback();
|
||||
public static AddModCallback addModCallback;
|
||||
|
||||
private static VRCSDK2.VRC_PlayerMods myTarget;
|
||||
|
||||
private static VRCSDK2.VRCPlayerModFactory.PlayerModType type;
|
||||
|
||||
public static void Init (VRCSDK2.VRC_PlayerMods target, AddModCallback callback)
|
||||
{
|
||||
// Get existing open window or if none, make a new one:
|
||||
EditorWindow.GetWindow (typeof (VRCPlayerModEditorWindow));
|
||||
addModCallback = callback;
|
||||
myTarget = target;
|
||||
|
||||
type = VRCSDK2.VRCPlayerModFactory.PlayerModType.Jump;
|
||||
}
|
||||
|
||||
void OnGUI ()
|
||||
{
|
||||
type = (VRCSDK2.VRCPlayerModFactory.PlayerModType)EditorGUILayout.EnumPopup("Mods", type);
|
||||
if(GUILayout.Button("Add Mod"))
|
||||
{
|
||||
VRCSDK2.VRCPlayerMod mod = VRCSDK2.VRCPlayerModFactory.Create(type);
|
||||
myTarget.AddMod(mod);
|
||||
addModCallback();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,10 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8986a640e24a0754ea0aded12234b808
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,109 @@
|
||||
#if VRC_SDK_VRCSDK2
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using System;
|
||||
|
||||
namespace VRCSDK2
|
||||
{
|
||||
[CustomEditor(typeof(VRCSDK2.VRC_PlayerMods))]
|
||||
public class VRCPlayerModsEditor : UnityEditor.Editor
|
||||
{
|
||||
VRCSDK2.VRC_PlayerMods myTarget;
|
||||
|
||||
void OnEnable()
|
||||
{
|
||||
if(myTarget == null)
|
||||
myTarget = (VRCSDK2.VRC_PlayerMods)target;
|
||||
}
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
myTarget.isRoomPlayerMods = EditorGUILayout.Toggle("isRoomPlayerMods", myTarget.isRoomPlayerMods);
|
||||
|
||||
List<VRCSDK2.VRCPlayerMod> playerMods = myTarget.playerMods;
|
||||
for(int i=0; i<playerMods.Count; ++i)
|
||||
{
|
||||
VRCSDK2.VRCPlayerMod mod = playerMods[i];
|
||||
EditorGUILayout.BeginVertical("box");
|
||||
EditorGUILayout.LabelField(mod.name, EditorStyles.boldLabel);
|
||||
if( mod.allowNameEdit )
|
||||
mod.name = EditorGUILayout.TextField( "Mod Name: ", mod.name );
|
||||
for(int j=0; j<mod.properties.Count; ++j)
|
||||
{
|
||||
VRCSDK2.VRCPlayerModProperty prop = mod.properties[j];
|
||||
myTarget.playerMods[i].properties[j] = DrawFieldForProp(prop);
|
||||
}
|
||||
if(GUILayout.Button ("Remove Mod"))
|
||||
{
|
||||
myTarget.RemoveMod(mod);
|
||||
break;
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
}
|
||||
if(GUILayout.Button("Add Mods"))
|
||||
{
|
||||
VRCPlayerModEditorWindow.AddModCallback adcb = OnInspectorGUI;
|
||||
VRCPlayerModEditorWindow.Init(myTarget, adcb);
|
||||
}
|
||||
}
|
||||
|
||||
VRCSDK2.VRCPlayerModProperty DrawFieldForProp(VRCSDK2.VRCPlayerModProperty property)
|
||||
{
|
||||
if(property.type.SystemType == typeof(int))
|
||||
{
|
||||
property.intValue = EditorGUILayout.IntField(property.name, property.intValue);
|
||||
}
|
||||
else if(property.type.SystemType == typeof(float))
|
||||
{
|
||||
property.floatValue = EditorGUILayout.FloatField(property.name, property.floatValue);
|
||||
}
|
||||
else if(property.type.SystemType == typeof(string))
|
||||
{
|
||||
property.stringValue = EditorGUILayout.TextField(property.name, property.stringValue);
|
||||
}
|
||||
else if(property.type.SystemType == typeof(bool))
|
||||
{
|
||||
property.boolValue = EditorGUILayout.Toggle(property.name, property.boolValue);
|
||||
}
|
||||
else if(property.type.SystemType == typeof(GameObject))
|
||||
{
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField( property.name );
|
||||
property.gameObjectValue = (GameObject) EditorGUILayout.ObjectField( property.gameObjectValue, typeof( GameObject ), true );
|
||||
EditorGUILayout.EndHorizontal();
|
||||
}
|
||||
else if(property.type.SystemType == typeof(KeyCode))
|
||||
{
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField( property.name );
|
||||
property.keyCodeValue = (KeyCode) EditorGUILayout.EnumPopup( property.keyCodeValue );
|
||||
EditorGUILayout.EndHorizontal();
|
||||
}
|
||||
else if(property.type.SystemType == typeof(VRCSDK2.VRC_EventHandler.VrcBroadcastType))
|
||||
{
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField( property.name );
|
||||
property.broadcastValue = (VRCSDK2.VRC_EventHandler.VrcBroadcastType) EditorGUILayout.EnumPopup( property.broadcastValue );
|
||||
EditorGUILayout.EndHorizontal();
|
||||
}
|
||||
else if(property.type.SystemType == typeof(VRCSDK2.VRCPlayerModFactory.HealthOnDeathAction))
|
||||
{
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField( property.name );
|
||||
property.onDeathActionValue = (VRCSDK2.VRCPlayerModFactory.HealthOnDeathAction) EditorGUILayout.EnumPopup( property.onDeathActionValue);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
}
|
||||
else if(property.type.SystemType == typeof(RuntimeAnimatorController))
|
||||
{
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField( property.name );
|
||||
property.animationController = (RuntimeAnimatorController) EditorGUILayout.ObjectField( property.animationController, typeof( RuntimeAnimatorController ), false );
|
||||
EditorGUILayout.EndHorizontal();
|
||||
}
|
||||
return property;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,10 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 792e7964a56e51f4188e1221751642e9
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,46 @@
|
||||
#if VRC_SDK_VRCSDK2
|
||||
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using System;
|
||||
|
||||
[CustomEditor(typeof(VRCSDK2.VRC_Station))]
|
||||
public class VRCPlayerStationEditor : Editor
|
||||
{
|
||||
VRCSDK2.VRC_Station myTarget;
|
||||
|
||||
SerializedProperty onRemoteEnter;
|
||||
SerializedProperty onRemoteExit;
|
||||
SerializedProperty onLocalEnter;
|
||||
SerializedProperty onLocalExit;
|
||||
|
||||
void OnEnable()
|
||||
{
|
||||
if(myTarget == null)
|
||||
myTarget = (VRCSDK2.VRC_Station)target;
|
||||
onRemoteEnter = serializedObject.FindProperty("OnRemotePlayerEnterStation");
|
||||
onRemoteExit = serializedObject.FindProperty("OnRemotePlayerExitStation");
|
||||
onLocalEnter = serializedObject.FindProperty("OnLocalPlayerEnterStation");
|
||||
onLocalExit = serializedObject.FindProperty("OnLocalPlayerExitStation");
|
||||
}
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
myTarget.PlayerMobility = (VRC.SDKBase.VRCStation.Mobility)EditorGUILayout.EnumPopup("Player Mobility", myTarget.PlayerMobility);
|
||||
myTarget.canUseStationFromStation = EditorGUILayout.Toggle("Can Use Station From Station", myTarget.canUseStationFromStation);
|
||||
myTarget.animatorController = (RuntimeAnimatorController)EditorGUILayout.ObjectField("Animator Controller", myTarget.animatorController, typeof(RuntimeAnimatorController), false);
|
||||
myTarget.disableStationExit = EditorGUILayout.Toggle("Disable Station Exit", myTarget.disableStationExit);
|
||||
myTarget.seated = EditorGUILayout.Toggle("Seated", myTarget.seated);
|
||||
myTarget.stationEnterPlayerLocation = (Transform)EditorGUILayout.ObjectField("Player Enter Location", myTarget.stationEnterPlayerLocation, typeof(Transform), true);
|
||||
myTarget.stationExitPlayerLocation = (Transform)EditorGUILayout.ObjectField("Player Exit Location", myTarget.stationExitPlayerLocation, typeof(Transform), true);
|
||||
myTarget.controlsObject = (VRC.SDKBase.VRC_ObjectApi)EditorGUILayout.ObjectField("API Object", myTarget.controlsObject, typeof(VRC.SDKBase.VRC_ObjectApi), false);
|
||||
|
||||
EditorGUILayout.PropertyField(onRemoteEnter, new GUIContent("On Remote Player Enter"));
|
||||
EditorGUILayout.PropertyField(onRemoteExit, new GUIContent("On Remote Player Exit"));
|
||||
EditorGUILayout.PropertyField(onLocalEnter, new GUIContent("On Local Player Enter"));
|
||||
EditorGUILayout.PropertyField(onLocalExit, new GUIContent("On Local Player Exit"));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,10 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5262a02c32e41e047bdfdfc3b63db8ff
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,29 @@
|
||||
#if VRC_SDK_VRCSDK2
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using System.Collections;
|
||||
|
||||
[CustomEditor (typeof(VRCSDK2.VRC_SceneDescriptor))]
|
||||
public class VRCSceneDescriptorEditor : Editor
|
||||
{
|
||||
VRCSDK2.VRC_SceneDescriptor sceneDescriptor;
|
||||
VRC.Core.PipelineManager pipelineManager;
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
if(sceneDescriptor == null)
|
||||
sceneDescriptor = (VRCSDK2.VRC_SceneDescriptor)target;
|
||||
|
||||
if(pipelineManager == null)
|
||||
{
|
||||
pipelineManager = sceneDescriptor.GetComponent<VRC.Core.PipelineManager>();
|
||||
if(pipelineManager == null)
|
||||
sceneDescriptor.gameObject.AddComponent<VRC.Core.PipelineManager>();
|
||||
}
|
||||
|
||||
DrawDefaultInspector();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e9cbc493bbbc443fb92898aa84d221ec
|
||||
timeCreated: 1450463561
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,130 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
|
||||
namespace VRCSDK2
|
||||
{
|
||||
//[CustomPropertyDrawer(typeof(VRC_AvatarVariations.VariationCategory))]
|
||||
//public class PropertyDrawer_AvatarVariation_VariationCategory : PropertyDrawer
|
||||
//{
|
||||
// public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label)
|
||||
// {
|
||||
// //EditorGUILayout.Label("blah");
|
||||
|
||||
// if (property == null)
|
||||
// return;
|
||||
|
||||
// SerializedProperty nameProperty = property.FindPropertyRelative("name");
|
||||
// //SerializedProperty mirrorProperty = property.FindPropertyRelative("mirror");
|
||||
// //SerializedProperty typeProperty = property.FindPropertyRelative("type");
|
||||
// //SerializedProperty valueProperty = null;
|
||||
// //switch (typeProperty.enumValueIndex)
|
||||
// //{
|
||||
// // case (int)VRC_DataStorage.VrcDataType.Bool:
|
||||
// // valueProperty = property.FindPropertyRelative("valueBool");
|
||||
// // break;
|
||||
// // case (int)VRC_DataStorage.VrcDataType.Float:
|
||||
// // valueProperty = property.FindPropertyRelative("valueFloat");
|
||||
// // break;
|
||||
// // case (int)VRC_DataStorage.VrcDataType.Int:
|
||||
// // valueProperty = property.FindPropertyRelative("valueInt");
|
||||
// // break;
|
||||
// // case (int)VRC_DataStorage.VrcDataType.String:
|
||||
// // valueProperty = property.FindPropertyRelative("valueString");
|
||||
// // break;
|
||||
// // case (int)VRC_DataStorage.VrcDataType.SerializeObject:
|
||||
// // valueProperty = property.FindPropertyRelative("serializeComponent");
|
||||
// // break;
|
||||
// // case (int)VRC_DataStorage.VrcDataType.None:
|
||||
// // case (int)VRC_DataStorage.VrcDataType.SerializeBytes:
|
||||
// // break;
|
||||
// //}
|
||||
|
||||
// EditorGUI.BeginProperty(rect, label, property);
|
||||
|
||||
// int baseWidth = (int)(rect.width / 4);
|
||||
// Rect nameRect = new Rect(rect.x, rect.y, baseWidth, rect.height);
|
||||
// //Rect mirrorRect = new Rect(rect.x + baseWidth, rect.y, baseWidth, rect.height);
|
||||
// //Rect typeRect = new Rect(rect.x + baseWidth * 2, rect.y, baseWidth, rect.height);
|
||||
// //Rect valueRect = new Rect(rect.x + baseWidth * 3, rect.y, baseWidth, rect.height);
|
||||
// //Rect typeValueRect = new Rect(rect.x + baseWidth * 2, rect.y, baseWidth * 2, rect.height);
|
||||
|
||||
// EditorGUI.PropertyField(nameRect, nameProperty, GUIContent.none);
|
||||
// //EditorGUI.PropertyField(mirrorRect, mirrorProperty, GUIContent.none);
|
||||
|
||||
// //switch (mirrorProperty.enumValueIndex)
|
||||
// //{
|
||||
// // case (int)VRC_DataStorage.VrcDataMirror.None:
|
||||
// // if (valueProperty == null)
|
||||
// // VRC_EditorTools.FilteredEnumPopup<VRC_DataStorage.VrcDataType>(typeValueRect, typeProperty, t => true);
|
||||
// // else
|
||||
// // {
|
||||
// // VRC_EditorTools.FilteredEnumPopup<VRC_DataStorage.VrcDataType>(typeRect, typeProperty, t => true);
|
||||
// // EditorGUI.PropertyField(valueRect, valueProperty, GUIContent.none);
|
||||
// // }
|
||||
// // break;
|
||||
// // case (int)VRC_DataStorage.VrcDataMirror.SerializeComponent:
|
||||
// // typeProperty.enumValueIndex = (int)VRC_DataStorage.VrcDataType.SerializeObject;
|
||||
// // EditorGUI.PropertyField(typeValueRect, valueProperty, GUIContent.none);
|
||||
// // break;
|
||||
// // default:
|
||||
// // VRC_EditorTools.FilteredEnumPopup<VRC_DataStorage.VrcDataType>(typeValueRect, typeProperty, t => true);
|
||||
// // break;
|
||||
// //}
|
||||
|
||||
// EditorGUI.EndProperty();
|
||||
// }
|
||||
//}
|
||||
|
||||
//[CustomEditor(typeof(VRC_AvatarVariations))]
|
||||
//public class VRC_AvatarVariationsEditor : Editor
|
||||
//{
|
||||
// SerializedProperty categories;
|
||||
|
||||
// void OnEnable()
|
||||
// {
|
||||
// categories = serializedObject.FindProperty("categories");
|
||||
// }
|
||||
|
||||
// public override void OnInspectorGUI()
|
||||
// {
|
||||
// //serializedObject.Update();
|
||||
// // EditorGUILayout.PropertyField(categories);
|
||||
// //serializedObject.ApplyModifiedProperties();
|
||||
|
||||
|
||||
|
||||
// //if (target == null)
|
||||
// // return;
|
||||
|
||||
// ////var prop = serializedObject.FindProperty("root");
|
||||
// ////EditorGUILayout.PropertyField(prop, new GUIContent("Show Help"));
|
||||
// //VRCSDK2.VRC_AvatarVariations variations = target as VRCSDK2.VRC_AvatarVariations;
|
||||
// //if (variations.categories == null)
|
||||
// // variations.categories = new VRC_AvatarVariations.VariationCategory[0];
|
||||
|
||||
// //foreach ( var vc in variations.categories )
|
||||
// //{
|
||||
// // vc.name = EditorGUILayout.TextField("Variation Name", vc.name);
|
||||
// //// SerializedProperty triggers = triggersProperty.Copy();
|
||||
// //// int triggersLength = triggers.arraySize;
|
||||
|
||||
// //// List<int> to_remove = new List<int>();
|
||||
// //// for (int idx = 0; idx < triggersLength; ++idx)
|
||||
// //// {
|
||||
// //// SerializedProperty triggerProperty = triggers.GetArrayElementAtIndex(idx);
|
||||
// //// }
|
||||
|
||||
// //// EditorGUILayout.LabelField("");
|
||||
// ////// helpProperty = serializedObject.FindProperty("ShowHelp");
|
||||
// ////// EditorGUILayout.PropertyField(helpProperty, new GUIContent("Show Help"));
|
||||
// //}
|
||||
|
||||
// ////EditorGUILayout.
|
||||
|
||||
// DrawDefaultInspector();
|
||||
// }
|
||||
//}
|
||||
|
||||
}
|
||||
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: eeda995d0ceac6443a54716996eab52e
|
||||
timeCreated: 1511373338
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,91 @@
|
||||
#if VRC_SDK_VRCSDK2 && UNITY_EDITOR
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using VRC.SDKBase;
|
||||
|
||||
namespace VRCSDK2
|
||||
{
|
||||
[CustomPropertyDrawer(typeof(VRCSDK2.VRC_DataStorage.VrcDataElement))]
|
||||
public class CustomDataElementDrawer : PropertyDrawer
|
||||
{
|
||||
public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label)
|
||||
{
|
||||
if (property == null)
|
||||
return;
|
||||
|
||||
SerializedProperty nameProperty = property.FindPropertyRelative("name");
|
||||
SerializedProperty mirrorProperty = property.FindPropertyRelative("mirror");
|
||||
SerializedProperty typeProperty = property.FindPropertyRelative("type");
|
||||
SerializedProperty valueProperty = null;
|
||||
switch (typeProperty.enumValueIndex)
|
||||
{
|
||||
case (int)VRCSDK2.VRC_DataStorage.VrcDataType.Bool:
|
||||
valueProperty = property.FindPropertyRelative("valueBool");
|
||||
break;
|
||||
case (int)VRCSDK2.VRC_DataStorage.VrcDataType.Float:
|
||||
valueProperty = property.FindPropertyRelative("valueFloat");
|
||||
break;
|
||||
case (int)VRCSDK2.VRC_DataStorage.VrcDataType.Int:
|
||||
valueProperty = property.FindPropertyRelative("valueInt");
|
||||
break;
|
||||
case (int)VRCSDK2.VRC_DataStorage.VrcDataType.String:
|
||||
valueProperty = property.FindPropertyRelative("valueString");
|
||||
break;
|
||||
case (int)VRCSDK2.VRC_DataStorage.VrcDataType.SerializeObject:
|
||||
valueProperty = property.FindPropertyRelative("serializeComponent");
|
||||
break;
|
||||
case (int)VRCSDK2.VRC_DataStorage.VrcDataType.None:
|
||||
case (int)VRCSDK2.VRC_DataStorage.VrcDataType.SerializeBytes:
|
||||
break;
|
||||
}
|
||||
|
||||
EditorGUI.BeginProperty(rect, label, property);
|
||||
|
||||
int baseWidth = (int)(rect.width / 4);
|
||||
Rect nameRect = new Rect(rect.x, rect.y, baseWidth, rect.height);
|
||||
Rect mirrorRect = new Rect(rect.x + baseWidth, rect.y, baseWidth, rect.height);
|
||||
Rect typeRect = new Rect(rect.x + baseWidth * 2, rect.y, baseWidth, rect.height);
|
||||
Rect valueRect = new Rect(rect.x + baseWidth * 3, rect.y, baseWidth, rect.height);
|
||||
Rect typeValueRect = new Rect(rect.x + baseWidth * 2, rect.y, baseWidth * 2, rect.height);
|
||||
|
||||
EditorGUI.PropertyField(nameRect, nameProperty, GUIContent.none);
|
||||
EditorGUI.PropertyField(mirrorRect, mirrorProperty, GUIContent.none);
|
||||
|
||||
switch (mirrorProperty.enumValueIndex)
|
||||
{
|
||||
case (int)VRCSDK2.VRC_DataStorage.VrcDataMirror.None:
|
||||
if (valueProperty == null)
|
||||
VRC_EditorTools.FilteredEnumPopup<VRCSDK2.VRC_DataStorage.VrcDataType>(typeValueRect, typeProperty, t => true);
|
||||
else
|
||||
{
|
||||
VRC_EditorTools.FilteredEnumPopup<VRCSDK2.VRC_DataStorage.VrcDataType>(typeRect, typeProperty, t => true);
|
||||
EditorGUI.PropertyField(valueRect, valueProperty, GUIContent.none);
|
||||
}
|
||||
break;
|
||||
case (int)VRCSDK2.VRC_DataStorage.VrcDataMirror.SerializeComponent:
|
||||
typeProperty.enumValueIndex = (int)VRCSDK2.VRC_DataStorage.VrcDataType.SerializeObject;
|
||||
EditorGUI.PropertyField(typeValueRect, valueProperty, GUIContent.none);
|
||||
break;
|
||||
default:
|
||||
VRC_EditorTools.FilteredEnumPopup<VRCSDK2.VRC_DataStorage.VrcDataType>(typeValueRect, typeProperty, t => true);
|
||||
break;
|
||||
}
|
||||
|
||||
EditorGUI.EndProperty();
|
||||
}
|
||||
}
|
||||
|
||||
[CustomEditor(typeof(VRCSDK2.VRC_DataStorage)), CanEditMultipleObjects]
|
||||
public class VRC_DataStorageEditor : UnityEditor.Editor
|
||||
{
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
VRCSDK2.VRC_ObjectSync os = ((VRCSDK2.VRC_DataStorage)target).GetComponent<VRCSDK2.VRC_ObjectSync>();
|
||||
if (os != null && os.SynchronizePhysics)
|
||||
EditorGUILayout.HelpBox("Consider either removing the VRC_ObjectSync or disabling SynchronizePhysics.", MessageType.Warning);
|
||||
|
||||
DrawDefaultInspector();
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0ac7998a36f085844847acbc046d4e27
|
||||
timeCreated: 1478191469
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,57 @@
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using VRC_DestructibleStandard = VRC.SDKBase.VRC_DestructibleStandard;
|
||||
using VRC.SDKBase;
|
||||
|
||||
[CustomEditor(typeof(VRC_DestructibleStandard))]
|
||||
[CanEditMultipleObjects]
|
||||
public class VRC_DestructibleStandardEditor : Editor
|
||||
{
|
||||
VRC_DestructibleStandard ds;
|
||||
|
||||
SerializedProperty maxHealth;
|
||||
SerializedProperty currentHealth;
|
||||
SerializedProperty healable;
|
||||
SerializedProperty onDamagedTrigger;
|
||||
SerializedProperty onDestroyedTrigger;
|
||||
SerializedProperty onHealedTrigger;
|
||||
SerializedProperty onFullHealedTrigger;
|
||||
|
||||
void OnEnable()
|
||||
{
|
||||
maxHealth = serializedObject.FindProperty("maxHealth");
|
||||
currentHealth = serializedObject.FindProperty("currentHealth");
|
||||
healable = serializedObject.FindProperty("healable");
|
||||
onDamagedTrigger = serializedObject.FindProperty("onDamagedTrigger");
|
||||
onDestroyedTrigger = serializedObject.FindProperty("onDestructedTrigger");
|
||||
onHealedTrigger = serializedObject.FindProperty("onHealedTrigger");
|
||||
onFullHealedTrigger = serializedObject.FindProperty("onFullHealedTrigger");
|
||||
}
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
ds = (VRC_DestructibleStandard)target;
|
||||
|
||||
// Update the serializedProperty - always do this in the beginning of OnInspectorGUI.
|
||||
serializedObject.Update ();
|
||||
|
||||
EditorGUILayout.PropertyField(maxHealth, new GUIContent("Max Health"));
|
||||
EditorGUILayout.PropertyField(currentHealth, new GUIContent("Current Health"));
|
||||
EditorGUILayout.PropertyField(healable, new GUIContent("Is Healable"));
|
||||
|
||||
EditorGUILayout.PropertyField(onDamagedTrigger, new GUIContent("On Damaged Trigger"));
|
||||
VRC_EditorTools.DrawTriggerActionCallback("On Damaged Action", ds.onDamagedTrigger, ds.onDamagedEvent);
|
||||
|
||||
EditorGUILayout.PropertyField(onDestroyedTrigger, new GUIContent("On Destructed Trigger"));
|
||||
VRC_EditorTools.DrawTriggerActionCallback("On Destructed Action", ds.onDestructedTrigger, ds.onDestructedEvent);
|
||||
|
||||
EditorGUILayout.PropertyField(onHealedTrigger, new GUIContent("On Healed Trigger"));
|
||||
VRC_EditorTools.DrawTriggerActionCallback("On Healed Action", ds.onHealedTrigger, ds.onHealedEvent);
|
||||
|
||||
EditorGUILayout.PropertyField(onFullHealedTrigger, new GUIContent("On Full Healed Trigger"));
|
||||
VRC_EditorTools.DrawTriggerActionCallback("On Full Healed Action", ds.onFullHealedTrigger, ds.onFullHealedEvent);
|
||||
|
||||
// Apply changes to the serializedProperty - always do this in the end of OnInspectorGUI.
|
||||
serializedObject.ApplyModifiedProperties ();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3b63b118c0591b548ba1797e6be4292e
|
||||
timeCreated: 1477161996
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,19 @@
|
||||
#if VRC_SDK_VRCSDK2
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
[CustomEditor(typeof(VRCSDK2.VRC_ObjectSync))]
|
||||
public class VRC_ObjectSyncEditor : Editor {
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
VRCSDK2.VRC_ObjectSync c = ((VRCSDK2.VRC_ObjectSync)target);
|
||||
if ((c.gameObject.GetComponent<Animator>() != null || c.gameObject.GetComponent<Animation>() != null) && c.SynchronizePhysics)
|
||||
EditorGUILayout.HelpBox("If the Animator or Animation moves the root position of this object then it will conflict with physics synchronization.", MessageType.Warning);
|
||||
if (c.GetComponent<VRCSDK2.VRC_DataStorage>() != null && c.SynchronizePhysics)
|
||||
EditorGUILayout.HelpBox("Consider either removing the VRC_DataStorage or disabling SynchronizePhysics.", MessageType.Warning);
|
||||
DrawDefaultInspector();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e19a7147a2386554a8e4d6e414f190a2
|
||||
timeCreated: 1504908295
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,70 @@
|
||||
#if VRC_SDK_VRCSDK2 && UNITY_EDITOR
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace VRCSDK2
|
||||
{
|
||||
[CustomEditor(typeof(VRCSDK2.VRC_Pickup))]
|
||||
public class VRC_PickupEditor : UnityEditor.Editor
|
||||
{
|
||||
private void InspectorField(string propertyName, string humanName)
|
||||
{
|
||||
SerializedProperty propertyField = serializedObject.FindProperty(propertyName);
|
||||
EditorGUILayout.PropertyField(propertyField, new GUIContent(humanName), true);
|
||||
}
|
||||
|
||||
private SerializedProperty momentumTransferMethodProperty;
|
||||
private SerializedProperty disallowTheftProperty;
|
||||
private SerializedProperty exactGunProperty;
|
||||
private SerializedProperty exactGripProperty;
|
||||
private SerializedProperty allowManipulationWhenEquippedProperty;
|
||||
private SerializedProperty orientationProperty;
|
||||
private SerializedProperty autoHoldProperty;
|
||||
private SerializedProperty interactionTextProperty;
|
||||
private SerializedProperty useTextProperty;
|
||||
private SerializedProperty throwVelocityBoostMinSpeedProperty;
|
||||
private SerializedProperty throwVelocityBoostScaleProperty;
|
||||
private SerializedProperty pickupableProperty;
|
||||
private SerializedProperty proximityProperty;
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
momentumTransferMethodProperty = serializedObject.FindProperty("MomentumTransferMethod");
|
||||
disallowTheftProperty = serializedObject.FindProperty("DisallowTheft");
|
||||
exactGunProperty = serializedObject.FindProperty("ExactGun");
|
||||
exactGripProperty = serializedObject.FindProperty("ExactGrip");
|
||||
allowManipulationWhenEquippedProperty = serializedObject.FindProperty("allowManipulationWhenEquipped");
|
||||
orientationProperty = serializedObject.FindProperty("orientation");
|
||||
autoHoldProperty = serializedObject.FindProperty("AutoHold");
|
||||
interactionTextProperty = serializedObject.FindProperty("InteractionText");
|
||||
useTextProperty = serializedObject.FindProperty("UseText");
|
||||
throwVelocityBoostMinSpeedProperty = serializedObject.FindProperty("ThrowVelocityBoostMinSpeed");
|
||||
throwVelocityBoostScaleProperty = serializedObject.FindProperty("ThrowVelocityBoostScale");
|
||||
pickupableProperty = serializedObject.FindProperty("pickupable");
|
||||
proximityProperty = serializedObject.FindProperty("proximity");
|
||||
|
||||
EditorGUILayout.BeginVertical(GUILayout.MaxWidth(EditorGUIUtility.currentViewWidth - 30));
|
||||
|
||||
EditorGUILayout.PropertyField(momentumTransferMethodProperty, new GUIContent("Momentum Transfer Method"));
|
||||
EditorGUILayout.PropertyField(disallowTheftProperty, new GUIContent("Disallow Theft"));
|
||||
EditorGUILayout.PropertyField(exactGunProperty, new GUIContent("Exact Gun"));
|
||||
EditorGUILayout.PropertyField(exactGripProperty, new GUIContent("Exact Grip"));
|
||||
EditorGUILayout.PropertyField(allowManipulationWhenEquippedProperty, new GUIContent("Allow Manipulation When Equipped"));
|
||||
EditorGUILayout.PropertyField(orientationProperty, new GUIContent("Orientation"));
|
||||
EditorGUILayout.PropertyField(autoHoldProperty, new GUIContent("AutoHold", "If the pickup is supposed to be aligned to the hand (i.e. orientation field is set to Gun or Grip), auto-detect means that it will be Equipped(not dropped when they release trigger), otherwise just hold as a normal pickup."));
|
||||
EditorGUILayout.PropertyField(interactionTextProperty, new GUIContent("Interaction Text","Text displayed when user hovers over the pickup."));
|
||||
if (autoHoldProperty.enumValueIndex != (int)VRCSDK2.VRC_Pickup.AutoHoldMode.No)
|
||||
EditorGUILayout.PropertyField(useTextProperty, new GUIContent("Use Text", "Text to display describing action for clicking button, when this pickup is already being held."));
|
||||
EditorGUILayout.PropertyField(throwVelocityBoostMinSpeedProperty, new GUIContent("Throw Velocity Boost Min Speed"));
|
||||
EditorGUILayout.PropertyField(throwVelocityBoostScaleProperty, new GUIContent("Throw Velocity Boost Scale"));
|
||||
EditorGUILayout.PropertyField(pickupableProperty, new GUIContent("Pickupable"));
|
||||
EditorGUILayout.PropertyField(proximityProperty, new GUIContent("Proximity"));
|
||||
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4aff4e5c0d600c845b29d7b8b7965d68
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,106 @@
|
||||
#if VRC_SDK_VRCSDK2
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UnityEditor;
|
||||
using System;
|
||||
|
||||
namespace VRCSDK2
|
||||
{
|
||||
[CustomEditor(typeof(VRCSDK2.VRC_PlayerAudioOverride))]
|
||||
public class VRC_PlayerAudioOverrideEditor : UnityEditor.Editor
|
||||
{
|
||||
private bool voShow = true;
|
||||
private bool voAdv = false;
|
||||
private bool avShow = true;
|
||||
private bool avAdv = false;
|
||||
private SerializedProperty prioProperty;
|
||||
private SerializedProperty globalProperty;
|
||||
private SerializedProperty regionProperty;
|
||||
private SerializedProperty voGainProperty;
|
||||
private SerializedProperty voNearProperty;
|
||||
private SerializedProperty voFarProperty;
|
||||
private SerializedProperty voRadiusProperty;
|
||||
private SerializedProperty voDisableLpProperty;
|
||||
private SerializedProperty avGainProperty;
|
||||
private SerializedProperty avNearProperty;
|
||||
private SerializedProperty avFarProperty;
|
||||
private SerializedProperty avRadiusProperty;
|
||||
private SerializedProperty avForceSpatialProperty;
|
||||
private SerializedProperty avAllowCustomProperty;
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
globalProperty = serializedObject.FindProperty("global");
|
||||
regionProperty = serializedObject.FindProperty("region");
|
||||
prioProperty = serializedObject.FindProperty("regionPriority");
|
||||
|
||||
voGainProperty = serializedObject.FindProperty("VoiceGain");
|
||||
voNearProperty = serializedObject.FindProperty("VoiceNear");
|
||||
voFarProperty = serializedObject.FindProperty("VoiceFar");
|
||||
voRadiusProperty = serializedObject.FindProperty("VoiceVolumetricRadius");
|
||||
voDisableLpProperty = serializedObject.FindProperty("VoiceDisableLowpass");
|
||||
|
||||
avGainProperty = serializedObject.FindProperty("AvatarGainLimit");
|
||||
avNearProperty = serializedObject.FindProperty("AvatarNearLimit");
|
||||
avFarProperty = serializedObject.FindProperty("AvatarFarLimit");
|
||||
avRadiusProperty = serializedObject.FindProperty("AvatarVolumetricRadiusLimit");
|
||||
avForceSpatialProperty = serializedObject.FindProperty("AvatarForceSpatial");
|
||||
avAllowCustomProperty = serializedObject.FindProperty("AvatarAllowCustomCurve");
|
||||
|
||||
serializedObject.Update();
|
||||
|
||||
EditorGUILayout.BeginVertical();
|
||||
|
||||
var ovr = serializedObject.targetObject as VRCSDK2.VRC_PlayerAudioOverride;
|
||||
|
||||
EditorGUILayout.PropertyField(globalProperty, new GUIContent("Global"));
|
||||
if (!ovr.global)
|
||||
{
|
||||
EditorGUILayout.PropertyField(regionProperty, new GUIContent("Region"));
|
||||
EditorGUILayout.PropertyField(prioProperty, new GUIContent("Priority"));
|
||||
}
|
||||
|
||||
voShow = EditorGUILayout.Foldout(voShow, "Voice Settings");
|
||||
|
||||
if (voShow)
|
||||
{
|
||||
EditorGUILayout.PropertyField(voGainProperty, new GUIContent("Gain"));
|
||||
EditorGUILayout.PropertyField(voFarProperty, new GUIContent("Far"));
|
||||
|
||||
EditorGUI.indentLevel++;
|
||||
voAdv = EditorGUILayout.Foldout(voAdv, "Advanced Options");
|
||||
if (voAdv)
|
||||
{
|
||||
EditorGUILayout.PropertyField(voNearProperty, new GUIContent("Near"));
|
||||
EditorGUILayout.PropertyField(voRadiusProperty, new GUIContent("Volumetric Radius"));
|
||||
EditorGUILayout.PropertyField(voDisableLpProperty, new GUIContent("Disable Lowpass Filter"));
|
||||
}
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
|
||||
avShow = EditorGUILayout.Foldout(avShow, "Avatar Audio Limits");
|
||||
|
||||
if (avShow)
|
||||
{
|
||||
EditorGUILayout.PropertyField(avGainProperty, new GUIContent("Gain Limit"));
|
||||
EditorGUILayout.PropertyField(avFarProperty, new GUIContent("Far Limit"));
|
||||
|
||||
EditorGUI.indentLevel++;
|
||||
avAdv = EditorGUILayout.Foldout(avAdv, "Advanced Options");
|
||||
if (avAdv)
|
||||
{
|
||||
EditorGUILayout.PropertyField(avNearProperty, new GUIContent("Near Limit"));
|
||||
EditorGUILayout.PropertyField(avRadiusProperty, new GUIContent("Volumetric Radius Limit"));
|
||||
EditorGUILayout.PropertyField(avForceSpatialProperty, new GUIContent("Force Spatial"));
|
||||
EditorGUILayout.PropertyField(avAllowCustomProperty, new GUIContent("Allow Custom Curve"));
|
||||
}
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5c545625e0bf93045ac1c5864141c5c1
|
||||
timeCreated: 1474315179
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,58 @@
|
||||
#if VRC_SDK_VRCSDK2 && UNITY_EDITOR
|
||||
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UnityEditor;
|
||||
using System;
|
||||
|
||||
namespace VRCSDK2
|
||||
{
|
||||
[CustomEditor(typeof(VRCSDK2.VRC_SpatialAudioSource))]
|
||||
public class VRC_SpatialAudioSourceEditor : UnityEditor.Editor
|
||||
{
|
||||
private bool showAdvancedOptions = false;
|
||||
private SerializedProperty gainProperty;
|
||||
private SerializedProperty nearProperty;
|
||||
private SerializedProperty farProperty;
|
||||
private SerializedProperty volRadiusProperty;
|
||||
private SerializedProperty enableSpatialProperty;
|
||||
private SerializedProperty useCurveProperty;
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
gainProperty = serializedObject.FindProperty("Gain");
|
||||
nearProperty = serializedObject.FindProperty("Near");
|
||||
farProperty = serializedObject.FindProperty("Far");
|
||||
volRadiusProperty = serializedObject.FindProperty("VolumetricRadius");
|
||||
enableSpatialProperty = serializedObject.FindProperty("EnableSpatialization");
|
||||
useCurveProperty = serializedObject.FindProperty("UseAudioSourceVolumeCurve");
|
||||
|
||||
serializedObject.Update();
|
||||
|
||||
VRCSDK2.VRC_SpatialAudioSource target = serializedObject.targetObject as VRCSDK2.VRC_SpatialAudioSource;
|
||||
AudioSource source = target.GetComponent<AudioSource>();
|
||||
|
||||
EditorGUILayout.BeginVertical();
|
||||
|
||||
EditorGUILayout.PropertyField(gainProperty, new GUIContent("Gain"));
|
||||
EditorGUILayout.PropertyField(farProperty, new GUIContent("Far"));
|
||||
showAdvancedOptions = EditorGUILayout.Foldout(showAdvancedOptions, "Advanced Options");
|
||||
bool enableSp = enableSpatialProperty.boolValue;
|
||||
if (showAdvancedOptions)
|
||||
{
|
||||
EditorGUILayout.PropertyField(nearProperty, new GUIContent("Near"));
|
||||
EditorGUILayout.PropertyField(volRadiusProperty, new GUIContent("Volumetric Radius"));
|
||||
EditorGUILayout.PropertyField(enableSpatialProperty, new GUIContent("Enable Spatialization"));
|
||||
if (enableSp)
|
||||
EditorGUILayout.PropertyField(useCurveProperty, new GUIContent("Use AudioSource Volume Curve"));
|
||||
}
|
||||
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
if (source != null)
|
||||
source.spatialize = enableSp;
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0d2d4cba733f5eb4ba170368e67710d2
|
||||
timeCreated: 1474315179
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,105 @@
|
||||
#if VRC_SDK_VRCSDK2
|
||||
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using UnityEditorInternal;
|
||||
using VRC.SDKBase;
|
||||
|
||||
[CustomPropertyDrawer(typeof(VRCSDK2.VRC_SyncVideoPlayer.VideoEntry))]
|
||||
public class CustomVideoEntryDrawer : PropertyDrawer
|
||||
{
|
||||
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
|
||||
{
|
||||
SerializedProperty source = property.FindPropertyRelative("Source");
|
||||
SerializedProperty ratio = property.FindPropertyRelative("AspectRatio");
|
||||
SerializedProperty speed = property.FindPropertyRelative("PlaybackSpeed");
|
||||
SerializedProperty clip = property.FindPropertyRelative("VideoClip");
|
||||
SerializedProperty url = property.FindPropertyRelative("URL");
|
||||
|
||||
return EditorGUI.GetPropertyHeight(source, new GUIContent("Source"), true) + EditorGUIUtility.standardVerticalSpacing
|
||||
+ EditorGUI.GetPropertyHeight(ratio, new GUIContent("Aspect Ratio"), true) + EditorGUIUtility.standardVerticalSpacing
|
||||
+ EditorGUI.GetPropertyHeight(speed, new GUIContent("Playback Speed"), true) + EditorGUIUtility.standardVerticalSpacing
|
||||
+ Mathf.Max(EditorGUI.GetPropertyHeight(clip, new GUIContent("VideoClip"), true), EditorGUI.GetPropertyHeight(url, new GUIContent("URL"), true)) + EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
|
||||
public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label)
|
||||
{
|
||||
SerializedProperty source = property.FindPropertyRelative("Source");
|
||||
SerializedProperty ratio = property.FindPropertyRelative("AspectRatio");
|
||||
SerializedProperty speed = property.FindPropertyRelative("PlaybackSpeed");
|
||||
SerializedProperty clip = property.FindPropertyRelative("VideoClip");
|
||||
SerializedProperty url = property.FindPropertyRelative("URL");
|
||||
|
||||
EditorGUI.BeginProperty(rect, label, property);
|
||||
float x = rect.x;
|
||||
float y = rect.y;
|
||||
float w = rect.width;
|
||||
float h = EditorGUI.GetPropertyHeight(source, new GUIContent("Source"), true) + EditorGUIUtility.standardVerticalSpacing;
|
||||
VRC_EditorTools.FilteredEnumPopup<UnityEngine.Video.VideoSource>(new Rect(x, y, w, h), source, (e) => e == UnityEngine.Video.VideoSource.Url);
|
||||
y += h;
|
||||
|
||||
if (source.enumValueIndex == (int)UnityEngine.Video.VideoSource.Url)
|
||||
{
|
||||
h = EditorGUI.GetPropertyHeight(url, new GUIContent("URL"), true) + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(new Rect(x, y, w, h), url);
|
||||
y += h;
|
||||
}
|
||||
else
|
||||
{
|
||||
h = EditorGUI.GetPropertyHeight(clip, new GUIContent("VideoClip"), true) + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(new Rect(x, y, w, h), clip);
|
||||
y += h;
|
||||
}
|
||||
|
||||
h = EditorGUI.GetPropertyHeight(ratio, new GUIContent("AspectRatio"), true) + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(new Rect(x, y, w, h), ratio);
|
||||
y += h;
|
||||
|
||||
h = EditorGUI.GetPropertyHeight(ratio, new GUIContent("Playback Speed"), true) + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(new Rect(x, y, w, h), speed);
|
||||
if (speed.floatValue == 0f)
|
||||
speed.floatValue = 1f;
|
||||
y += h;
|
||||
|
||||
EditorGUI.EndProperty();
|
||||
}
|
||||
}
|
||||
|
||||
[CustomEditor(typeof(VRCSDK2.VRC_SyncVideoPlayer))]
|
||||
public class SyncVideoPlayerEditor : Editor
|
||||
{
|
||||
ReorderableList sourceList;
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
SerializedProperty searchRoot = serializedObject.FindProperty("VideoSearchRoot");
|
||||
EditorGUILayout.PropertyField(searchRoot);
|
||||
SerializedProperty maxQual = serializedObject.FindProperty("MaxStreamQuality");
|
||||
EditorGUILayout.PropertyField(maxQual);
|
||||
|
||||
EditorGUILayout.Space();
|
||||
|
||||
sourceList.DoLayoutList();
|
||||
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
SerializedProperty videos = serializedObject.FindProperty("Videos");
|
||||
sourceList = new ReorderableList(serializedObject, videos);
|
||||
sourceList.drawElementCallback += (Rect rect, int index, bool active, bool focused) =>
|
||||
{
|
||||
EditorGUI.PropertyField(rect, serializedObject.FindProperty("Videos").GetArrayElementAtIndex(index));
|
||||
};
|
||||
sourceList.elementHeightCallback += (int index) =>
|
||||
{
|
||||
SerializedProperty element = serializedObject.FindProperty("Videos").GetArrayElementAtIndex(index);
|
||||
return EditorGUI.GetPropertyHeight(element);
|
||||
};
|
||||
sourceList.drawHeaderCallback = (Rect rect) => EditorGUI.LabelField(rect, "Videos");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ae0e74693b7899f47bd98864f94b9311
|
||||
timeCreated: 1499468412
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,117 @@
|
||||
#if VRC_SDK_VRCSDK2
|
||||
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using UnityEditorInternal;
|
||||
using VRC.SDKBase;
|
||||
|
||||
[CustomPropertyDrawer(typeof(VRCSDK2.VRC_SyncVideoStream.VideoEntry))]
|
||||
public class CustomVideoStreamEntryDrawer : PropertyDrawer
|
||||
{
|
||||
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
|
||||
{
|
||||
SerializedProperty source = property.FindPropertyRelative("Source");
|
||||
SerializedProperty speed = property.FindPropertyRelative("PlaybackSpeed");
|
||||
SerializedProperty clip = property.FindPropertyRelative("VideoClip");
|
||||
SerializedProperty url = property.FindPropertyRelative("URL");
|
||||
SerializedProperty live = property.FindPropertyRelative("SyncType");
|
||||
SerializedProperty sync = property.FindPropertyRelative("SyncMinutes");
|
||||
|
||||
return EditorGUI.GetPropertyHeight(source, new GUIContent("Source"), true) + EditorGUIUtility.standardVerticalSpacing
|
||||
+ EditorGUI.GetPropertyHeight(speed, new GUIContent("Playback Speed"), true) + EditorGUIUtility.standardVerticalSpacing
|
||||
+ Mathf.Max(EditorGUI.GetPropertyHeight(clip, new GUIContent("VideoClip"), true), EditorGUI.GetPropertyHeight(url, new GUIContent("URL"), true)) + EditorGUIUtility.standardVerticalSpacing
|
||||
+ EditorGUI.GetPropertyHeight(live, new GUIContent("SyncType"), true) + EditorGUIUtility.standardVerticalSpacing
|
||||
+ EditorGUI.GetPropertyHeight(sync, new GUIContent("SyncMinutes"), true) + EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
|
||||
public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label)
|
||||
{
|
||||
SerializedProperty source = property.FindPropertyRelative("Source");
|
||||
SerializedProperty speed = property.FindPropertyRelative("PlaybackSpeed");
|
||||
SerializedProperty clip = property.FindPropertyRelative("VideoClip");
|
||||
SerializedProperty url = property.FindPropertyRelative("URL");
|
||||
SerializedProperty live = property.FindPropertyRelative("SyncType");
|
||||
SerializedProperty sync = property.FindPropertyRelative("SyncMinutes");
|
||||
|
||||
EditorGUI.BeginProperty(rect, label, property);
|
||||
float x = rect.x;
|
||||
float y = rect.y;
|
||||
float w = rect.width;
|
||||
float h = EditorGUI.GetPropertyHeight(source, new GUIContent("Source"), true) + EditorGUIUtility.standardVerticalSpacing;
|
||||
VRC_EditorTools.FilteredEnumPopup<UnityEngine.Video.VideoSource>(new Rect(x, y, w, h), source, (e) => e == UnityEngine.Video.VideoSource.Url);
|
||||
y += h;
|
||||
|
||||
if (source.enumValueIndex == (int)UnityEngine.Video.VideoSource.Url)
|
||||
{
|
||||
h = EditorGUI.GetPropertyHeight(url, new GUIContent("URL"), true) + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(new Rect(x, y, w, h), url);
|
||||
y += h;
|
||||
}
|
||||
else
|
||||
{
|
||||
h = EditorGUI.GetPropertyHeight(clip, new GUIContent("VideoClip"), true) + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(new Rect(x, y, w, h), clip);
|
||||
y += h;
|
||||
}
|
||||
|
||||
h = EditorGUI.GetPropertyHeight(speed, new GUIContent("Playback Speed"), true) + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(new Rect(x, y, w, h), speed);
|
||||
if (speed.floatValue == 0f)
|
||||
speed.floatValue = 1f;
|
||||
y += h;
|
||||
|
||||
h = EditorGUI.GetPropertyHeight(live, new GUIContent("SyncType"), true) + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(new Rect(x, y, w, h), live);
|
||||
y += h;
|
||||
|
||||
h = EditorGUI.GetPropertyHeight(sync, new GUIContent("SyncMinutes"), true) + EditorGUIUtility.standardVerticalSpacing;
|
||||
EditorGUI.PropertyField(new Rect(x, y, w, h), sync);
|
||||
if (sync.floatValue < 1f)
|
||||
sync.floatValue = 0;
|
||||
y += h;
|
||||
|
||||
EditorGUI.EndProperty();
|
||||
}
|
||||
}
|
||||
|
||||
[CustomEditor(typeof(VRCSDK2.VRC_SyncVideoStream))]
|
||||
public class SyncVideoStreamEditor : Editor
|
||||
{
|
||||
ReorderableList sourceList;
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
SerializedProperty searchRoot = serializedObject.FindProperty("VideoSearchRoot");
|
||||
EditorGUILayout.PropertyField(searchRoot);
|
||||
SerializedProperty maxQual = serializedObject.FindProperty("MaxStreamQuality");
|
||||
EditorGUILayout.PropertyField(maxQual);
|
||||
SerializedProperty autoStart = serializedObject.FindProperty("AutoStart");
|
||||
EditorGUILayout.PropertyField(autoStart);
|
||||
|
||||
EditorGUILayout.Space();
|
||||
|
||||
sourceList.DoLayoutList();
|
||||
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
SerializedProperty videos = serializedObject.FindProperty("Videos");
|
||||
sourceList = new ReorderableList(serializedObject, videos);
|
||||
sourceList.drawElementCallback += (Rect rect, int index, bool active, bool focused) =>
|
||||
{
|
||||
EditorGUI.PropertyField(rect, serializedObject.FindProperty("Videos").GetArrayElementAtIndex(index));
|
||||
};
|
||||
sourceList.elementHeightCallback += (int index) =>
|
||||
{
|
||||
SerializedProperty element = serializedObject.FindProperty("Videos").GetArrayElementAtIndex(index);
|
||||
return EditorGUI.GetPropertyHeight(element);
|
||||
};
|
||||
sourceList.drawHeaderCallback = (Rect rect) => EditorGUI.LabelField(rect, "Videos");
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3f9dccfed0b072f49a307b3f20a7e768
|
||||
timeCreated: 1528745185
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3aecd666943878944a811acb9db2ace7
|
||||
timeCreated: 1474315179
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,215 @@
|
||||
#if VRC_SDK_VRCSDK2 && UNITY_EDITOR
|
||||
using System.IO;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using UnityEditor.Build;
|
||||
using System;
|
||||
using ZLinq;
|
||||
using VRC.SDKBase.Editor;
|
||||
|
||||
namespace VRCSDK2
|
||||
{
|
||||
[CustomEditor(typeof(VRCSDK2.VRC_WebPanel))]
|
||||
public class VRC_WebPanelEditor : UnityEditor.Editor
|
||||
{
|
||||
private void InspectorField(string propertyName, string humanName)
|
||||
{
|
||||
SerializedProperty propertyField = serializedObject.FindProperty(propertyName);
|
||||
EditorGUILayout.PropertyField(propertyField, new GUIContent(humanName), true);
|
||||
}
|
||||
|
||||
bool showFiles = false;
|
||||
System.Collections.Generic.List<string> directories = null;
|
||||
System.Collections.Generic.List<string> files = null;
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
serializedObject.Update();
|
||||
EditorGUI.BeginChangeCheck();
|
||||
|
||||
EditorGUILayout.BeginVertical();
|
||||
|
||||
EditorGUILayout.HelpBox("Do not play any videos with Web Panels, use VRC_SyncVideoPlayer instead!", MessageType.Error);
|
||||
|
||||
EditorGUILayout.Space();
|
||||
|
||||
InspectorField("proximity", "Proximity for Interactivity");
|
||||
EditorGUILayout.Space();
|
||||
|
||||
VRCSDK2.VRC_WebPanel web = (VRCSDK2.VRC_WebPanel)target;
|
||||
|
||||
if (Application.isPlaying)
|
||||
{
|
||||
InspectorField("webRoot", "Web Root");
|
||||
InspectorField("defaultUrl", "URI");
|
||||
|
||||
showFiles = web.webData != null && EditorGUILayout.Foldout(showFiles, web.webData.Count.ToString() + " files imported");
|
||||
if (showFiles)
|
||||
foreach (var file in web.webData)
|
||||
{
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.PrefixLabel(file.path);
|
||||
EditorGUILayout.LabelField(file.data.Length.ToString());
|
||||
EditorGUILayout.EndHorizontal();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SerializedProperty webRoot = serializedObject.FindProperty("webRoot");
|
||||
RenderDirectoryList(serializedObject, "webRoot", "Path To Web Content");
|
||||
|
||||
if (string.IsNullOrEmpty(webRoot.stringValue))
|
||||
{
|
||||
InspectorField("defaultUrl", "Start URI");
|
||||
}
|
||||
else
|
||||
{
|
||||
RenderWebRootSelector(serializedObject, "defaultUrl", "Start Page");
|
||||
|
||||
if (VRCSettings.DisplayHelpBoxes)
|
||||
{
|
||||
EditorGUILayout.HelpBox("Javascript API bindings are called with engine.call('methodName', ...), which returns a promise-like object.", MessageType.Info);
|
||||
EditorGUILayout.HelpBox("Javascript may call ListBindings() to discover available API bindings.", MessageType.Info);
|
||||
EditorGUILayout.HelpBox("Javascript may listen for the 'onBindingsReady' event to execute script when the page is fully loaded and API bindings are available.", MessageType.Info);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EditorGUILayout.Space();
|
||||
|
||||
InspectorField("cookiesEnabled", "Enable Cookies");
|
||||
|
||||
InspectorField("interactive", "Is Interactive");
|
||||
|
||||
InspectorField("localOnly", "Only Visible Locally");
|
||||
|
||||
if (!web.localOnly)
|
||||
{
|
||||
InspectorField("syncURI", "Synchronize URI");
|
||||
InspectorField("syncInput", "Synchronize Mouse Position");
|
||||
}
|
||||
|
||||
InspectorField("transparent", "Transparent Background");
|
||||
|
||||
InspectorField("autoFormSubmit", "Input should Submit Forms");
|
||||
|
||||
EditorGUILayout.Space();
|
||||
|
||||
InspectorField("station", "Interaction Station");
|
||||
EditorGUILayout.Space();
|
||||
|
||||
InspectorField("cursor", "Mouse Cursor Object");
|
||||
|
||||
EditorGUILayout.Space();
|
||||
|
||||
InspectorField("resolutionWidth", "Resolution Width");
|
||||
InspectorField("resolutionHeight", "Resolution Height");
|
||||
InspectorField("displayRegion", "Display Region");
|
||||
|
||||
EditorGUILayout.Space();
|
||||
|
||||
InspectorField("extraVideoScreens", "Duplicate Screens");
|
||||
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
if (EditorGUI.EndChangeCheck())
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
|
||||
private void AddSubDirectories(ref System.Collections.Generic.List<string> l, string root)
|
||||
{
|
||||
if (!Directory.Exists(root))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!root.StartsWith(Application.dataPath + Path.DirectorySeparatorChar + "VRCSDK")
|
||||
|| root == Application.dataPath + Path.DirectorySeparatorChar + "VRCSDK" + Path.DirectorySeparatorChar + "Examples" + Path.DirectorySeparatorChar + "Sample Assets" + Path.DirectorySeparatorChar + "WebRoot")
|
||||
l.Add(root.Substring(Application.dataPath.Length));
|
||||
|
||||
string[] subdirectories = Directory.GetDirectories(root);
|
||||
foreach (string dir in subdirectories)
|
||||
AddSubDirectories(ref l, dir);
|
||||
}
|
||||
|
||||
private void RenderDirectoryList(SerializedObject obj, string propertyName, string humanName)
|
||||
{
|
||||
if (directories == null)
|
||||
{
|
||||
directories = new System.Collections.Generic.List<string>();
|
||||
directories.Add("No Web Content Directory");
|
||||
|
||||
AddSubDirectories(ref directories, Application.dataPath + Path.DirectorySeparatorChar);
|
||||
}
|
||||
|
||||
SerializedProperty target = serializedObject.FindProperty(propertyName);
|
||||
|
||||
int selectedIdx = target.stringValue == null ? 0 : directories.IndexOf(target.stringValue);
|
||||
if (selectedIdx < 0 || selectedIdx >= directories.Count)
|
||||
selectedIdx = 0;
|
||||
|
||||
selectedIdx = EditorGUILayout.Popup(humanName, selectedIdx, directories.ToArray());
|
||||
if (selectedIdx > 0 && selectedIdx < directories.Count)
|
||||
target.stringValue = directories[selectedIdx];
|
||||
else
|
||||
target.stringValue = null;
|
||||
}
|
||||
|
||||
private void AddSubDirectoryFiles(ref System.Collections.Generic.List<string> l, string root)
|
||||
{
|
||||
if (!Directory.Exists(root))
|
||||
return;
|
||||
|
||||
string[] files = Directory.GetFiles(root);
|
||||
foreach (string file in files.Where(f => f.ToLower().EndsWith(".html") || f.ToLower().EndsWith(".htm")))
|
||||
l.Add(file.Substring(Application.dataPath.Length));
|
||||
|
||||
string[] subdirectories = Directory.GetDirectories(root);
|
||||
foreach (string dir in subdirectories)
|
||||
AddSubDirectoryFiles(ref l, dir);
|
||||
}
|
||||
|
||||
private void RenderWebRootSelector(SerializedObject obj, string propertyName, string humanName)
|
||||
{
|
||||
SerializedProperty webRoot = obj.FindProperty("webRoot");
|
||||
SerializedProperty target = serializedObject.FindProperty(propertyName);
|
||||
|
||||
if (files == null)
|
||||
{
|
||||
files = new System.Collections.Generic.List<string>();
|
||||
|
||||
AddSubDirectoryFiles(ref files, Application.dataPath + webRoot.stringValue);
|
||||
if (files.Count == 0)
|
||||
{
|
||||
EditorGUILayout.HelpBox("No suitable html files found in Web Content path.", MessageType.Error);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
int selectedIdx = 0;
|
||||
|
||||
try
|
||||
{
|
||||
System.Uri uri = string.IsNullOrEmpty(target.stringValue) ? null : new Uri(target.stringValue);
|
||||
|
||||
selectedIdx = uri == null ? 0 : files.IndexOf(uri.AbsolutePath.Replace('/', System.IO.Path.DirectorySeparatorChar));
|
||||
if (selectedIdx < 0 || selectedIdx >= files.Count)
|
||||
selectedIdx = 0;
|
||||
}
|
||||
catch { }
|
||||
|
||||
selectedIdx = EditorGUILayout.Popup(humanName, selectedIdx, files.ToArray());
|
||||
if (selectedIdx >= 0 && selectedIdx < files.Count)
|
||||
{
|
||||
System.UriBuilder builder = new UriBuilder()
|
||||
{
|
||||
Scheme = "file",
|
||||
Path = files[selectedIdx].Replace(System.IO.Path.DirectorySeparatorChar, '/'),
|
||||
Host = ""
|
||||
};
|
||||
target.stringValue = builder.Uri.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d09b36020f697be4d9a0f5a6a48cfa83
|
||||
timeCreated: 1457992191
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,20 @@
|
||||
#if UNITY_EDITOR && VRC_SDK_VRCSDK2
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.IO;
|
||||
|
||||
namespace VRCSDK2
|
||||
{
|
||||
[CustomEditor(typeof(VRC_YouTubeSync))]
|
||||
public class VRC_YouTubeSyncEditor : UnityEditor.Editor
|
||||
{
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
EditorGUILayout.HelpBox("This component is deprecated, please use the VRC_SyncVideoPlayer component instead.", MessageType.Error);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 764e26c1ca28e2e45a30c778c1955a47
|
||||
timeCreated: 1474675311
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user