Example #1
0
            public OnionSkinObject(GameObject go)
            {
                dummyObject = new DummyObject();
                dummyObject.Initialize(go);
                #region ChangeMaterials
                createdMaterials = new List <Material>();
                {
                    foreach (var pair in dummyObject.rendererDictionary)
                    {
                        bool changeShader = pair.Key is SkinnedMeshRenderer;
                        if (!changeShader && pair.Key is MeshRenderer)
                        {
                            changeShader = true;
                            foreach (var comp in pair.Key.GetComponents <Component>())
                            {
                                if (comp.GetType().Name.StartsWith("TextMesh"))
                                {
                                    changeShader = false;
                                    break;
                                }
                            }
                        }
                        if (changeShader)
                        {
                            Shader shader;
#if UNITY_2018_1_OR_NEWER
                            if (GraphicsSettings.renderPipelineAsset != null)
                            {
                                shader = Shader.Find("Very Animation/OnionSkin-1pass");
                            }
                            else
#endif
                            {
                                shader = Shader.Find("Very Animation/OnionSkin-2pass");
                            }
                            var materials = new Material[pair.Key.sharedMaterials.Length];
                            for (int i = 0; i < materials.Length; i++)
                            {
                                var keyMat = pair.Key.sharedMaterials[i];
                                if (keyMat == null)
                                {
                                    continue;
                                }
                                Material mat;
                                {
                                    mat            = new Material(shader);
                                    mat.hideFlags |= HideFlags.HideAndDontSave;
                                    #region SetTexture
                                    {
                                        Action <string> SetTexture = (name) =>
                                        {
                                            if (mat.mainTexture == null && keyMat.HasProperty(name))
                                            {
                                                mat.mainTexture = keyMat.GetTexture(name);
                                            }
                                        };
                                        SetTexture("_MainTex");
                                        SetTexture("_BaseColorMap");    //HDRP
                                        SetTexture("_BaseMap");         //LWRP
#if UNITY_2018_2_OR_NEWER
                                        if (mat.mainTexture == null)
                                        {
                                            foreach (var name in keyMat.GetTexturePropertyNames())
                                            {
                                                SetTexture(name);
                                            }
                                        }
#endif
                                    }
                                    #endregion
                                    createdMaterials.Add(mat);
                                }
                                materials[i] = mat;
                            }
                            pair.Key.sharedMaterials = materials;
                        }
                        else
                        {
                            var materials = new Material[pair.Key.sharedMaterials.Length];
                            for (int i = 0; i < materials.Length; i++)
                            {
                                var keyMat = pair.Key.sharedMaterials[i];
                                if (keyMat == null)
                                {
                                    continue;
                                }
                                Material mat;
                                {
                                    mat            = Material.Instantiate <Material>(keyMat);
                                    mat.hideFlags |= HideFlags.HideAndDontSave;
                                    createdMaterials.Add(mat);
                                }
                                materials[i] = mat;
                            }
                            pair.Key.sharedMaterials = materials;
                        }
                    }
                }
                #endregion
                dummyObject.gameObject.SetActive(false);
            }