private void CreateAssetAndComponent(float spawnCountValue, string playEventName, out VFXGraph graph, out VisualEffect vfxComponent, out GameObject gameObj, out GameObject cameraObj) { EditorApplication.ExecuteMenuItem("Window/General/Game"); graph = MakeTemporaryGraph(); var eventStart = ScriptableObject.CreateInstance <VFXBasicEvent>(); eventStart.eventName = playEventName; var spawnerContext = ScriptableObject.CreateInstance <VFXBasicSpawner>(); var blockConstantRate = ScriptableObject.CreateInstance <VFXSpawnerConstantRate>(); var slotCount = blockConstantRate.GetInputSlot(0); var spawnerInit = ScriptableObject.CreateInstance <VFXBasicInitialize>(); var spawnerOutput = ScriptableObject.CreateInstance <VFXPlanarPrimitiveOutput>(); slotCount.value = spawnCountValue; spawnerContext.AddChild(blockConstantRate); graph.AddChild(eventStart); graph.AddChild(spawnerContext); graph.AddChild(spawnerInit); graph.AddChild(spawnerOutput); spawnerContext.LinkFrom(eventStart, 0, 0); spawnerInit.LinkFrom(spawnerContext); spawnerOutput.LinkFrom(spawnerInit); graph.RecompileIfNeeded(); gameObj = new GameObject("CreateAssetAndComponentSpawner"); vfxComponent = gameObj.AddComponent <VisualEffect>(); vfxComponent.visualEffectAsset = graph.visualEffectResource.asset; cameraObj = new GameObject("CreateAssetAndComponentSpawner_Camera"); var camera = cameraObj.AddComponent <Camera>(); camera.transform.localPosition = Vector3.one; camera.transform.LookAt(vfxComponent.transform); }
public override void OnInspectorGUI() { resourceObject.Update(); bool enable = GUI.enabled; //Everything in external asset is disabled by default GUI.enabled = true; EditorGUI.BeginChangeCheck(); EditorGUI.showMixedValue = resourceUpdateModeProperty.hasMultipleDifferentValues; VFXUpdateMode newUpdateMode = (VFXUpdateMode)EditorGUILayout.EnumPopup(EditorGUIUtility.TrTextContent("Update Mode"), (VFXUpdateMode)resourceUpdateModeProperty.intValue); if (EditorGUI.EndChangeCheck()) { resourceUpdateModeProperty.intValue = (int)newUpdateMode; resourceObject.ApplyModifiedProperties(); } EditorGUILayout.BeginHorizontal(); EditorGUI.showMixedValue = cullingFlagsProperty.hasMultipleDifferentValues; EditorGUILayout.PrefixLabel(EditorGUIUtility.TrTextContent("Culling Flags")); EditorGUI.BeginChangeCheck(); int newOption = EditorGUILayout.Popup(Array.IndexOf(k_CullingOptionsValue, (VFXCullingFlags)cullingFlagsProperty.intValue), k_CullingOptionsContents); if (EditorGUI.EndChangeCheck()) { cullingFlagsProperty.intValue = (int)k_CullingOptionsValue[newOption]; resourceObject.ApplyModifiedProperties(); } EditorGUILayout.EndHorizontal(); bool needRecompile = false; EditorGUI.BeginChangeCheck(); EditorGUI.showMixedValue = motionVectorRenderModeProperty.hasMultipleDifferentValues; EditorGUI.BeginChangeCheck(); bool motionVector = EditorGUILayout.Toggle(EditorGUIUtility.TrTextContent("Use Motion Vectors"), motionVectorRenderModeProperty.intValue == (int)MotionVectorGenerationMode.Object); if (EditorGUI.EndChangeCheck()) { motionVectorRenderModeProperty.intValue = motionVector ? (int)MotionVectorGenerationMode.Object : (int)MotionVectorGenerationMode.Camera; resourceObject.ApplyModifiedProperties(); needRecompile = true; } if (needRecompile) { foreach (VisualEffectResource resource in resourceObject.targetObjects) { VFXGraph graph = resource.GetOrCreateGraph() as VFXGraph; if (graph != null) { graph.SetExpressionGraphDirty(); graph.RecompileIfNeeded(); } } } if (!serializedObject.isEditingMultipleObjects) { VisualEffectEditor.ShowHeader(EditorGUIUtility.TrTextContent("Shaders"), true, true, false, false); VisualEffectAsset asset = (VisualEffectAsset)target; VisualEffectResource resource = asset.GetResource(); var shaderSources = resource.shaderSources; string assetPath = AssetDatabase.GetAssetPath(asset); UnityObject[] objects = AssetDatabase.LoadAllAssetsAtPath(assetPath); string directory = Path.GetDirectoryName(assetPath) + "/" + VFXExternalShaderProcessor.k_ShaderDirectory + "/" + asset.name + "/"; foreach (var shader in objects) { if (shader is Shader || shader is ComputeShader) { GUILayout.BeginHorizontal(); GUILayout.Label(shader.name, GUILayout.ExpandWidth(true)); int index = resource.GetShaderIndex(shader); if (index >= 0 && index < shaderSources.Length) { if (VFXExternalShaderProcessor.allowExternalization) { string externalPath = directory + shaderSources[index].name; if (!shaderSources[index].compute) { externalPath = directory + shaderSources[index].name.Replace('/', '_') + VFXExternalShaderProcessor.k_ShaderExt; } else { externalPath = directory + shaderSources[index].name + VFXExternalShaderProcessor.k_ShaderExt; } if (System.IO.File.Exists(externalPath)) { if (GUILayout.Button("Reveal External")) { EditorUtility.RevealInFinder(externalPath); } } else { if (GUILayout.Button("Externalize", GUILayout.Width(80))) { Directory.CreateDirectory(directory); File.WriteAllText(externalPath, "//" + shaderSources[index].name + "," + index.ToString() + "\n//Don't delete the previous line or this one\n" + shaderSources[index].source); } } } if (GUILayout.Button("Show Generated", GUILayout.Width(110))) { resource.ShowGeneratedShaderFile(index); } } if (GUILayout.Button("Select", GUILayout.Width(50))) { Selection.activeObject = shader; } GUILayout.EndHorizontal(); } } } GUI.enabled = false; }