From 8579e8679011a91ad35eb65daa5309d64d70119f Mon Sep 17 00:00:00 2001 From: George Wu Date: Wed, 22 Jul 2020 00:28:50 +0200 Subject: [PATCH] 1) Fixed MP3 loading on Windows 2) Fixed model shadow casting 3) Scenes fix: Z-fighting, skybox 4) Use render texture for virtual screens --- Assets/Materials/SecondaryCameraView.mat | 77 ++++++++++++++++ Assets/Materials/SecondaryCameraView.mat.meta | 8 ++ .../SecondaryCameraView.renderTexture | 37 ++++++++ .../SecondaryCameraView.renderTexture.meta | 8 ++ Assets/Materials/UnlitDual.shader | 31 +++++++ Assets/Plugins/NLayer.meta | 8 ++ Assets/Plugins/NLayer/NLayer.dll | Bin 0 -> 71168 bytes Assets/Plugins/NLayer/NLayer.dll.meta | 76 ++++++++++++++++ Assets/Scenes/Template.unity | 82 +++++++++++++++++- .../Dancing/CommonResourceProperties.cs | 11 ++- .../LeadActress/Runtime/Dancing/ModelFixer.cs | 28 +++++- .../Runtime/Loaders/ExternalAudioLoader.cs | 21 +++++ .../Runtime/Loaders/ModelLoader.cs | 1 + .../Runtime/Loaders/SceneLoader.cs | 19 ++-- ProjectSettings/EditorBuildSettings.asset | 6 +- README.md | 6 +- 16 files changed, 404 insertions(+), 15 deletions(-) create mode 100644 Assets/Materials/SecondaryCameraView.mat create mode 100644 Assets/Materials/SecondaryCameraView.mat.meta create mode 100644 Assets/Materials/SecondaryCameraView.renderTexture create mode 100644 Assets/Materials/SecondaryCameraView.renderTexture.meta create mode 100644 Assets/Plugins/NLayer.meta create mode 100644 Assets/Plugins/NLayer/NLayer.dll create mode 100644 Assets/Plugins/NLayer/NLayer.dll.meta diff --git a/Assets/Materials/SecondaryCameraView.mat b/Assets/Materials/SecondaryCameraView.mat new file mode 100644 index 0000000..cb7993c --- /dev/null +++ b/Assets/Materials/SecondaryCameraView.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SecondaryCameraView + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 8400000, guid: 709a19ff731185a4ab279e4af1c6051f, type: 2} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Materials/SecondaryCameraView.mat.meta b/Assets/Materials/SecondaryCameraView.mat.meta new file mode 100644 index 0000000..77c34f1 --- /dev/null +++ b/Assets/Materials/SecondaryCameraView.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7d0b58a8846d54a47b4519a031e43e58 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/SecondaryCameraView.renderTexture b/Assets/Materials/SecondaryCameraView.renderTexture new file mode 100644 index 0000000..50a6bc4 --- /dev/null +++ b/Assets/Materials/SecondaryCameraView.renderTexture @@ -0,0 +1,37 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SecondaryCameraView + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + serializedVersion: 3 + m_Width: 1024 + m_Height: 1024 + m_AntiAliasing: 4 + m_MipCount: -1 + m_DepthFormat: 2 + m_ColorFormat: 8 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_UseDynamicScale: 0 + m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 0 + m_MipBias: 0 + m_WrapU: 1 + m_WrapV: 1 + m_WrapW: 1 + m_Dimension: 2 + m_VolumeDepth: 1 diff --git a/Assets/Materials/SecondaryCameraView.renderTexture.meta b/Assets/Materials/SecondaryCameraView.renderTexture.meta new file mode 100644 index 0000000..fa0308c --- /dev/null +++ b/Assets/Materials/SecondaryCameraView.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 709a19ff731185a4ab279e4af1c6051f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/UnlitDual.shader b/Assets/Materials/UnlitDual.shader index 204feca..91442b8 100644 --- a/Assets/Materials/UnlitDual.shader +++ b/Assets/Materials/UnlitDual.shader @@ -72,6 +72,37 @@ } ENDCG } + + // https://styly.cc/tips/unlitcastshadow-go-shader/ + Pass + { + Name "CastShadow" + Tags { "LightMode" = "ShadowCaster" } + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_shadowcaster + #include "UnityCG.cginc" + + struct v2f + { + V2F_SHADOW_CASTER; + }; + + v2f vert( appdata_base v ) + { + v2f o; + TRANSFER_SHADOW_CASTER(o) + return o; + } + + float4 frag( v2f i ) : COLOR + { + SHADOW_CASTER_FRAGMENT(i) + } + ENDCG + } } Fallback "Unlit/Texture" diff --git a/Assets/Plugins/NLayer.meta b/Assets/Plugins/NLayer.meta new file mode 100644 index 0000000..9593f8a --- /dev/null +++ b/Assets/Plugins/NLayer.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c38d0c8947efbe343b01b42ff0400ddb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/NLayer/NLayer.dll b/Assets/Plugins/NLayer/NLayer.dll new file mode 100644 index 0000000000000000000000000000000000000000..dbefd9789eb0283d9f73ee47392c51a84d5adfd5 GIT binary patch literal 71168 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

X3-s@AcL<~p+^xP<+h%k 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 _songResourceName = value; } + public AppealType appealType { + get => _appealType; + set => _appealType = value; + } + [SerializeField] private string _songResourceName = "shtstr"; + [SerializeField] + private AppealType _appealType = AppealType.None; + } } diff --git a/Assets/Scripts/LeadActress/Runtime/Dancing/ModelFixer.cs b/Assets/Scripts/LeadActress/Runtime/Dancing/ModelFixer.cs index 73e08c6..c645f48 100644 --- a/Assets/Scripts/LeadActress/Runtime/Dancing/ModelFixer.cs +++ b/Assets/Scripts/LeadActress/Runtime/Dancing/ModelFixer.cs @@ -1,5 +1,7 @@ -using JetBrains.Annotations; +using System.Collections.Generic; +using JetBrains.Annotations; using UnityEngine; +using UnityEngine.Rendering; namespace LeadActress.Runtime.Dancing { [AddComponentMenu("MLTD/MLTD Model Fixer")] @@ -28,6 +30,30 @@ public static void FixGameObjectHierarchy([NotNull] ModelLoadResult loadResult) // BindHead(loadResult.Body, loadResult.Head); } + public static void FixMeshRenderers([NotNull] ModelLoadResult loadResult) { + var q = new Queue(); + + q.Enqueue(loadResult.Body); + + while (q.Count > 0) { + var obj = q.Dequeue(); + var t = obj.transform; + + var childCount = t.childCount; + + if (childCount > 0) { + for (var i = 0; i < childCount; i += 1) { + var childTransform = t.GetChild(i); + q.Enqueue(childTransform.gameObject); + } + } + + if (obj.TryGetComponent(out var renderer)) { + renderer.shadowCastingMode = ShadowCastingMode.TwoSided; + } + } + } + private static void AddBodyScaleNode([NotNull] GameObject body) { var t = body.transform; diff --git a/Assets/Scripts/LeadActress/Runtime/Loaders/ExternalAudioLoader.cs b/Assets/Scripts/LeadActress/Runtime/Loaders/ExternalAudioLoader.cs index 1611f67..ba3ba09 100644 --- a/Assets/Scripts/LeadActress/Runtime/Loaders/ExternalAudioLoader.cs +++ b/Assets/Scripts/LeadActress/Runtime/Loaders/ExternalAudioLoader.cs @@ -2,6 +2,7 @@ using System.IO; using Cysharp.Threading.Tasks; using LeadActress.Runtime.Dancing; +using NLayer; using UnityEngine; using UnityEngine.Networking; @@ -18,6 +19,25 @@ public async UniTask LoadAsync() { AudioClip clip; +#if UNITY_EDITOR || UNITY_STANDALONE + using (var www = new UnityWebRequest(uri)) { + www.downloadHandler = new DownloadHandlerBuffer(); + + await www.SendWebRequest(); + + var data = www.downloadHandler.data; + + using (var memoryStream = new MemoryStream(data, false)) { + using (var mpeg = new MpegFile(memoryStream)) { + var samples = new float[mpeg.Length]; + mpeg.ReadSamples(samples, 0, samples.Length); + + clip = AudioClip.Create(relativePath, samples.Length, mpeg.Channels, mpeg.SampleRate, false); + clip.SetData(samples, 0); + } + } + } +#else using (var www = new UnityWebRequest(uri)) { www.downloadHandler = new DownloadHandlerAudioClip(uri, AudioType.MPEG); @@ -27,6 +47,7 @@ public async UniTask LoadAsync() { } clip.name = relativePath; +#endif return clip; } diff --git a/Assets/Scripts/LeadActress/Runtime/Loaders/ModelLoader.cs b/Assets/Scripts/LeadActress/Runtime/Loaders/ModelLoader.cs index 3b5d5e5..cefd3f6 100644 --- a/Assets/Scripts/LeadActress/Runtime/Loaders/ModelLoader.cs +++ b/Assets/Scripts/LeadActress/Runtime/Loaders/ModelLoader.cs @@ -153,6 +153,7 @@ public async UniTask LoadAndInstantiateAsync() { var result = new ModelLoadResult(headInstance, bodyInstance, headSway, bodySway); ModelFixer.FixGameObjectHierarchy(result); + ModelFixer.FixMeshRenderers(result); physicsImporter.ImportPhysics(result); diff --git a/Assets/Scripts/LeadActress/Runtime/Loaders/SceneLoader.cs b/Assets/Scripts/LeadActress/Runtime/Loaders/SceneLoader.cs index fb0d1ba..29fb27b 100644 --- a/Assets/Scripts/LeadActress/Runtime/Loaders/SceneLoader.cs +++ b/Assets/Scripts/LeadActress/Runtime/Loaders/SceneLoader.cs @@ -17,6 +17,9 @@ public class SceneLoader : MonoBehaviour { [Tooltip("The skybox material used for open scenes.")] public Material skyboxMaterial; + [Tooltip("The material for screens.")] + public Material vjMaterial; + [Tooltip("Stage serial number, from 1 to 999.")] [Range(MltdSimulationConstants.MinStageSerial, MltdSimulationConstants.MaxStageSerial)] public int stageSerial = 1; @@ -97,7 +100,7 @@ private async UniTask LoadMainScene() { var rootObjects = scene.GetRootGameObjects(); foreach (var obj in rootObjects) { - FixShaders(obj); + FixMaterials(obj); } } @@ -132,17 +135,18 @@ private async UniTask LoadPropScene(int number) { var rootObjects = scene.GetRootGameObjects(); foreach (var obj in rootObjects) { - FixShaders(obj); + FixMaterials(obj); } } - private void FixShaders([NotNull] GameObject gameObject) { + private void FixMaterials([NotNull] GameObject gameObject) { if ( // gameObject.name.Contains("lt_glow_far") || // Disable texture-based gradient lights from the front of the stage // gameObject.name.Contains("lt_glow_beam") || // Disable texture-based gradient lights on stage // gameObject.name.Contains("lt_glow_center") || // Emitters on the lights on stage gameObject.name.Contains("lt_glow") || - gameObject.name.Contains("ltmap") // Disable light maps + gameObject.name.Contains("ltmap") || // Disable light maps + gameObject.name.Contains("pPlane") // Disable audience generation plates ) { gameObject.SetActive(false); return; @@ -160,6 +164,11 @@ private void FixShaders([NotNull] GameObject gameObject) { materials[i] = newMaterial; Destroy(material); materialReplaced = true; + } else if (material.name.Contains("_vj")) { + var newMaterial = vjMaterial; + materials[i] = newMaterial; + Destroy(material); + materialReplaced = true; } else { material.shader = Shader.Find("Custom/Standard"); } @@ -185,7 +194,7 @@ private void FixShaders([NotNull] GameObject gameObject) { for (var i = 0; i < count; i += 1) { var child = t.GetChild(i); - FixShaders(child.gameObject); + FixMaterials(child.gameObject); } } diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index 72a4765..c5ac231 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -5,9 +5,9 @@ EditorBuildSettings: m_ObjectHideFlags: 0 serializedVersion: 2 m_Scenes: - - enabled: 1 - path: Assets/Scenes/SampleScene.unity - guid: 9fc0d4010bbf28b4594072e72b8655ab + - enabled: 0 + path: + guid: 00000000000000000000000000000000 m_configObjects: com.unity.input.settings: {fileID: 11400000, guid: 9ee24003629bd6c419b46cbe16bc6870, type: 2} diff --git a/README.md b/README.md index 6dfb6cc..da9df19 100644 --- a/README.md +++ b/README.md @@ -34,9 +34,11 @@ Then, set corresponding properties on the components in the scene. The default s [Demo](https://www.bilibili.com/video/BV1Vf4y1R7Us/) -## Thanks +## Credits -[Santarh/MToon](https://github.com/Santarh/MToon) +- [Santarh/MToon](https://github.com/Santarh/MToon) +- [naudio/NLayer](https://github.com/naudio/NLayer) +- [Unlit shadowcaster](https://styly.cc/tips/unlitcastshadow-go-shader/) ## License