extern private void SetValueSheet(VFXExpressionValuesSheetInternal sheet);
        private static VFXExpressionValuesSheetInternal CreateValueSheet(VFXExpressionValueContainerDesc[] values)
        {
            var internalSheet = new VFXExpressionValuesSheetInternal();

            foreach (var group in values.GroupBy(o => o.GetType()))
            {
                if (group.Key == typeof(VFXExpressionValueContainerDesc <int>))
                {
                    var v = group.Cast <VFXExpressionValueContainerDesc <int> >().ToArray();
                    internalSheet.intValues            = v.Select(o => o.value).ToArray();
                    internalSheet.intValuesExpressions = v.Select(o => o.expressionIndex).ToArray();
                }
                else if (group.Key == typeof(VFXExpressionValueContainerDesc <UInt32>))
                {
                    var v = group.Cast <VFXExpressionValueContainerDesc <UInt32> >().ToArray();
                    internalSheet.uintValues            = v.Select(o => o.value).ToArray();
                    internalSheet.uintValuesExpressions = v.Select(o => o.expressionIndex).ToArray();
                }
                else if (group.Key == typeof(VFXExpressionValueContainerDesc <float>))
                {
                    var v = group.Cast <VFXExpressionValueContainerDesc <float> >().ToArray();
                    internalSheet.floatValues            = v.Select(o => o.value).ToArray();
                    internalSheet.floatValuesExpressions = v.Select(o => o.expressionIndex).ToArray();
                }
                else if (group.Key == typeof(VFXExpressionValueContainerDesc <Vector2>))
                {
                    var v = group.Cast <VFXExpressionValueContainerDesc <Vector2> >().ToArray();
                    internalSheet.vector2Values            = v.Select(o => o.value).ToArray();
                    internalSheet.vector2ValuesExpressions = v.Select(o => o.expressionIndex).ToArray();
                }
                else if (group.Key == typeof(VFXExpressionValueContainerDesc <Vector3>))
                {
                    var v = group.Cast <VFXExpressionValueContainerDesc <Vector3> >().ToArray();
                    internalSheet.vector3Values            = v.Select(o => o.value).ToArray();
                    internalSheet.vector3ValuesExpressions = v.Select(o => o.expressionIndex).ToArray();
                }
                else if (group.Key == typeof(VFXExpressionValueContainerDesc <Vector4>))
                {
                    var v = group.Cast <VFXExpressionValueContainerDesc <Vector4> >().ToArray();
                    internalSheet.vector4Values            = v.Select(o => o.value).ToArray();
                    internalSheet.vector4ValuesExpressions = v.Select(o => o.expressionIndex).ToArray();
                }
                else if (group.Key == typeof(VFXExpressionValueContainerDesc <Matrix4x4>))
                {
                    var v = group.Cast <VFXExpressionValueContainerDesc <Matrix4x4> >().ToArray();
                    internalSheet.matrix4x4Values            = v.Select(o => o.value).ToArray();
                    internalSheet.matrix4x4ValuesExpressions = v.Select(o => o.expressionIndex).ToArray();
                }
                else if (group.Key == typeof(VFXExpressionValueContainerDesc <Texture>))
                {
                    var v = group.Cast <VFXExpressionValueContainerDesc <Texture> >().ToArray();
                    internalSheet.textureValues            = v.Select(o => o.value).ToArray();
                    internalSheet.textureValuesExpressions = v.Select(o => o.expressionIndex).ToArray();
                }
                else if (group.Key == typeof(VFXExpressionValueContainerDesc <Mesh>))
                {
                    var v = group.Cast <VFXExpressionValueContainerDesc <Mesh> >().ToArray();
                    internalSheet.meshValues            = v.Select(o => o.value).ToArray();
                    internalSheet.meshValuesExpressions = v.Select(o => o.expressionIndex).ToArray();
                }
                else if (group.Key == typeof(VFXExpressionValueContainerDesc <Gradient>))
                {
                    var v = group.Cast <VFXExpressionValueContainerDesc <Gradient> >().ToArray();
                    internalSheet.gradientValues            = v.Select(o => o.value).ToArray();
                    internalSheet.gradientValuesExpressions = v.Select(o => o.expressionIndex).ToArray();
                }
                else if (group.Key == typeof(VFXExpressionValueContainerDesc <AnimationCurve>))
                {
                    var v = group.Cast <VFXExpressionValueContainerDesc <AnimationCurve> >().ToArray();
                    internalSheet.animationCurveValues            = v.Select(o => o.value).ToArray();
                    internalSheet.animationCurveValuesExpressions = v.Select(o => o.expressionIndex).ToArray();
                }
                else if (group.Key == typeof(VFXExpressionValueContainerDesc <bool>))
                {
                    var v = group.Cast <VFXExpressionValueContainerDesc <bool> >().ToArray();
                    internalSheet.boolValues            = v.Select(o => o.value).ToArray();
                    internalSheet.boolValuesExpressions = v.Select(o => o.expressionIndex).ToArray();
                }
                else
                {
                    throw new Exception("Unknown VFXExpressionValueContainerDesc type : " + group.Key);
                }
            }
            return(internalSheet);
        }