private static void InitAllAnimatableProperties()
        {
            AllProperties.Clear();
            Type type = typeof(JSkyProfile);

            PropertyInfo[] props = type.GetProperties();
            for (int i = 0; i < props.Length; ++i)
            {
                Attribute att = props[i].GetCustomAttribute(typeof(JAnimatableAttribute));
                if (att != null)
                {
                    JAnimatableAttribute animAtt = att as JAnimatableAttribute;
                    AllProperties.Add(JAnimatedProperty.Create(props[i].Name, animAtt.DisplayName, animAtt.CurveOrGradient));
                }
            }
        }
        private static void InitPropertyRemap()
        {
            PropertyRemap.Clear();
            Type type = typeof(JSkyProfile);

            PropertyInfo[] props = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
            foreach (PropertyInfo p in props)
            {
                JAnimatableAttribute animatable = p.GetCustomAttribute(typeof(JAnimatableAttribute), false) as JAnimatableAttribute;
                if (animatable == null)
                {
                    continue;
                }
                string name = p.Name;
                int    id   = Shader.PropertyToID("_" + name);
                PropertyRemap.Add(name, id);
            }
        }