// removes all entities from the game private void FlushEntities() { Enemies.Clear(); Eggs.Clear(); Player.Sensor.Dispose(); foreach (GameEntity entity in ActiveEntities) { CharacterEntity character = entity as CharacterEntity; if (character != null) { character.DynamicBody.Enabled = false; character.DynamicBody.Dispose(); } } ActiveEntities.Clear(); }
void UpdatePreview() { if (!this) return; #if BVH if (previewBvh) { if (!entityBuffer.IsCreated) RebuildEntityBuffers(); if (!bvhNodeBuffer.IsCreated) RebuildBvh(); } else { sphereBuffer.SafeDispose(); bvhNodeBuffer.SafeDispose(); entityBuffer.SafeDispose(); ActiveEntities.Clear(); } #endif // BVH if (scene) { Transform cameraTransform = targetCamera.transform; cameraTransform.position = scene.CameraPosition; cameraTransform.rotation = Quaternion.LookRotation(scene.CameraTarget - scene.CameraPosition); targetCamera.fieldOfView = scene.CameraFieldOfView; } Action updateDelegate = OnEditorUpdate; if (EditorApplication.update.GetInvocationList().All(x => x != (Delegate) updateDelegate)) EditorApplication.update += OnEditorUpdate; if (opaquePreviewCommandBuffer == null) opaquePreviewCommandBuffer = new CommandBuffer { name = "World Preview (Opaque)" }; if (transparentPreviewCommandBuffer == null) transparentPreviewCommandBuffer = new CommandBuffer { name = "World Preview (Transparent)" }; targetCamera.RemoveAllCommandBuffers(); targetCamera.AddCommandBuffer(CameraEvent.AfterForwardOpaque, opaquePreviewCommandBuffer); targetCamera.AddCommandBuffer(CameraEvent.AfterForwardAlpha, transparentPreviewCommandBuffer); opaquePreviewCommandBuffer.Clear(); transparentPreviewCommandBuffer.Clear(); foreach (UnityEngine.Material material in previewMaterials) DestroyImmediate(material); previewMaterials.Clear(); var skybox = targetCamera.GetComponent<Skybox>(); if (AssetDatabase.IsMainAsset(skybox.material)) RenderSettings.skybox = skybox.material = new UnityEngine.Material(skybox.material); skybox.material.SetColor("_Color1", scene.SkyBottomColor); skybox.material.SetColor("_Color2", scene.SkyTopColor); EnsurePreviewObjectExists(PrimitiveType.Sphere, ref previewSphere); EnsurePreviewObjectExists(PrimitiveType.Quad, ref previewRect); EnsurePreviewObjectExists(PrimitiveType.Cube, ref previewBox); var previewMeshRenderer = previewSphere.GetComponent<MeshRenderer>(); CollectActiveEntities(); opaquePreviewCommandBuffer.EnableShaderKeyword("LIGHTPROBE_SH"); transparentPreviewCommandBuffer.EnableShaderKeyword("LIGHTPROBE_SH"); foreach (EntityData entity in ActiveEntities) { if (!entity.Material) continue; bool transparent = entity.Material.Type == MaterialType.Dielectric; bool emissive = entity.Material.Type == MaterialType.DiffuseLight; Color albedoMainColor = entity.Material.Albedo ? entity.Material.Albedo.MainColor : Color.white; Color color = transparent ? albedoMainColor.GetAlphaReplaced(0.5f) : albedoMainColor; var material = new UnityEngine.Material(previewMeshRenderer.sharedMaterial) { color = color }; previewMaterials.Add(material); material.SetFloat("_Metallic", entity.Material.Type == MaterialType.Metal ? 1 : 0); material.SetFloat("_Glossiness", entity.Material.Type == MaterialType.Metal ? 1 - entity.Material.Roughness : transparent ? 1 : 0); material.SetTexture("_MainTex", entity.Material.Albedo ? entity.Material.Albedo.Image : null); if (transparent) { material.SetInt("_SrcBlend", (int) BlendMode.One); material.SetInt("_DstBlend", (int) BlendMode.OneMinusSrcAlpha); material.SetInt("_ZWrite", 0); material.EnableKeyword("_ALPHAPREMULTIPLY_ON"); material.renderQueue = 3000; } if (emissive) { material.EnableKeyword("_EMISSION"); material.SetColor("_EmissionColor", entity.Material.Emission ? entity.Material.Emission.MainColor : Color.black); } CommandBuffer previewCommandBuffer = transparent ? transparentPreviewCommandBuffer : opaquePreviewCommandBuffer; switch (entity.Type) { case EntityType.Sphere: SphereData s = entity.SphereData; previewCommandBuffer.DrawMesh(previewSphere.sharedMesh, Matrix4x4.TRS(entity.Position, entity.Rotation, s.Radius * 2 * Vector3.one), material, 0, material.FindPass("FORWARD")); break; case EntityType.Rect: RectData r = entity.RectData; previewCommandBuffer.DrawMesh(previewRect.sharedMesh, Matrix4x4.TRS(entity.Position, Quaternion.LookRotation(Vector3.forward) * entity.Rotation,float3(r.Size, 1)), material, 0, material.FindPass("FORWARD")); break; case EntityType.Box: BoxData b = entity.BoxData; previewCommandBuffer.DrawMesh(previewBox.sharedMesh, Matrix4x4.TRS(entity.Position, entity.Rotation, b.Size), material, 0, material.FindPass("FORWARD")); break; } } }