private static void ImportGameObject(CustomImporterArgs args)
        {
            if (args.value == null || !args.value.IsString)
            {
                return;
            }

            if (args.field.HasAttribute <PencilNode>())
            {
                var childNode = args.findNodeFunc((string)args.value);
                if (childNode == null)
                {
                    return;
                }

                args.SetValueByReflection(childNode);
                childNode.transform.parent = args.node.gameObject.transform;
            }
            else
            {
                var obj = GameObject.Find((string)args.value);
                if (obj == null)
                {
                    return;
                }

                args.SetValueByReflection(obj);
            }
        }
        private static void ImportUniversalCurve(CustomImporterArgs args)
        {
            if (args.value == null)
            {
                return;
            }

            // UniversalKeysの読み込み
            var curveValues = args.value[KeyName.UniversalCurveKeys];

            if (!curveValues.IsArray)
            {
                return;
            }

            var keyframes = curveValues.Cast <JsonData>()
                            .Where(p => p.IsArray || p.Count < 2)
                            .Select(p => new Keyframe(
                                        Convert.ToSingle((double)p[0]),
                                        Convert.ToSingle((double)p[1])));

            var animationCurve = new AnimationCurve(keyframes.ToArray());

            foreach (var i in Enumerable.Range(0, animationCurve.length))
            {
                animationCurve.SmoothTangents(i, 0);
            }
            args.SetValueByReflection(animationCurve);
        }
        private static void ImportOneParam(
            Component node,
            JsonData value,
            FieldInfo field,
            float scale,
            Func <string, GameObject> nodeFinder)
        {
            var args = new CustomImporterArgs
            {
                node         = node,
                value        = value,
                field        = field,
                scale        = scale,
                findNodeFunc = nodeFinder
            };

            if (_customImporter.ContainsKey(field.FieldType))
            {
                _customImporter[field.FieldType](args);
            }
            else if (field.FieldType.IsEnum)
            {
                _customImporter[typeof(int)](args);
            }
            else
            {
                throw new InvalidOperationException("Unsupported field type.");
            }
        }
 private static void ImportString(CustomImporterArgs args)
 {
     if (args.value == null || !args.value.IsString)
     {
         return;
     }
     args.SetValueByReflection((string)args.value);
 }
 private static void ImportBool(CustomImporterArgs args)
 {
     if (args.value == null || !args.value.IsBoolean)
     {
         return;
     }
     args.SetValueByReflection((bool)args.value);
 }
 private static void ImportInt(CustomImporterArgs args)
 {
     if (args.value == null || !args.value.IsInt && !args.value.IsLong)
     {
         return;
     }
     args.SetValueByReflection((int)args.value);
 }
        private static void ImportLoopDirection(CustomImporterArgs args)
        {
            if (args.value == null || !args.value.IsInt)
            {
                return;
            }
            var value = (int)args.value;

            // 他プラットフォームでEnumの値が逆であるため、値を反転させる
            args.SetValueByReflection(value == 0 ? 1 : 0);
        }
        private static void ImportTexture2D(CustomImporterArgs args)
        {
            if (args.value == null || !args.value.IsString)
            {
                return;
            }

            var texture = _assetFinder("t:texture", (string)args.value) as Texture2D;

            args.SetValueByReflection(texture);
        }
        private static void ImportMaterialList(CustomImporterArgs args)
        {
            if (args.value == null || !args.value.IsArray)
            {
                return;
            }

            var existingMaterials = Utils.EnumerateMaterials().ToList();
            var newMaterialList   = Enumerable.Range(0, args.value.Count)
                                    .Select(i => args.value[i].TryGetStringValue("Name"))
                                    .SelectMany(x => existingMaterials.Where(y => y.name == EscapeMaterialName(x)))
                                    .ToList();

            args.SetValueByReflection(newMaterialList);
        }
        private static void ImportFloat(CustomImporterArgs args)
        {
            if (args.value == null || !args.value.IsDouble)
            {
                return;
            }

            if (args.field.HasAttribute <JsonScaleDependent>())
            {
                args.SetValueByReflection(Convert.ToSingle((double)args.value) * args.scale);
            }
            else
            {
                args.SetValueByReflection(Convert.ToSingle((double)args.value));
            }
        }
        private static void ImportVector2(CustomImporterArgs args)
        {
            if (args.value == null || !args.value.IsArray || args.value.Count < 2)
            {
                return;
            }

            if (Enumerable.Range(0, 2).Any(i => !args.value[i].IsDouble))
            {
                return;
            }
            var vector = new Vector2(
                Convert.ToSingle((double)args.value[0]),
                Convert.ToSingle((double)args.value[1]));

            args.SetValueByReflection(vector);
        }
        private static void ImportAnimationCurve(CustomImporterArgs args)
        {
            if (args.value == null || !args.value.IsObject)
            {
                return;
            }
            var curveKinds = args.value.Keys;

#if UNITY_EDITOR
            if (curveKinds.Contains(KeyName.UnityCurveKeys))
            {
                ImportUnityCurve(args);
            }
            else
#endif
            if (curveKinds.Contains(KeyName.UniversalCurveKeys))
            {
                ImportUniversalCurve(args);
            }
        }
        private static void ImportGameObjectList(CustomImporterArgs args)
        {
            if (args.value == null || !args.value.IsArray)
            {
                return;
            }
            var newGameObjectList = new List <GameObject>();

            if (args.field.HasAttribute <PencilNode>())
            {
                foreach (var i in Enumerable.Range(0, args.value.Count))
                {
                    if (!args.value[i].IsString)
                    {
                        continue;
                    }

                    var childNode = args.findNodeFunc((string)args.value[i]);
                    newGameObjectList.Add(childNode);
                    childNode.transform.parent = args.node.gameObject.transform;
                }
            }
            else
            {
                var objectNames = Enumerable.Range(0, args.value.Count)
                                  .Select(i => args.value[i].IsString ? (string)args.value[i] : null)
                                  .Where(x => x != null)
                                  .Distinct();
                var allGameObjects = Object.FindObjectsOfType <GameObject>();
                foreach (var name in objectNames)
                {
                    newGameObjectList.AddRange(allGameObjects.Where(x => x.name == name));
                }
            }
            args.SetValueByReflection(newGameObjectList);
        }
        private static void ImportUnityCurve(CustomImporterArgs args)
        {
            if (args.value == null)
            {
                return;
            }

            var curveKeys = args.value[KeyName.UnityCurveKeys];

            if (!curveKeys.IsArray)
            {
                return;
            }

            var keyframes = new List <Keyframe>();

            foreach (var i in Enumerable.Range(0, curveKeys.Count))
            {
                var time       = Convert.ToSingle((double)curveKeys[i][KeyName.CurveTime]);
                var value      = Convert.ToSingle((double)curveKeys[i][KeyName.CurveValue]);
                var inTangent  = Convert.ToSingle((double)curveKeys[i][KeyName.CurveInTangent]);
                var outTangent = Convert.ToSingle((double)curveKeys[i][KeyName.CurveOutTangent]);
#if UNITY_2018_1_OR_NEWER
                var curveKeyDict = curveKeys[i] as IDictionary;
                if (curveKeyDict.Contains(KeyName.CurveInWeight) &&
                    curveKeyDict.Contains(KeyName.CurveOutWeight) &&
                    curveKeyDict.Contains(KeyName.CurveWeightedMode))
                {
                    var inWeight    = Convert.ToSingle((double)curveKeys[i][KeyName.CurveInWeight]);
                    var outWeight   = Convert.ToSingle((double)curveKeys[i][KeyName.CurveOutWeight]);
                    var newKeyframe = new Keyframe(time, value, inTangent, outTangent, inWeight, outWeight)
                    {
                        weightedMode = (WeightedMode)(int)curveKeys[i][KeyName.CurveWeightedMode]
                    };
                    keyframes.Add(newKeyframe);
                }
                else
                {
                    keyframes.Add(new Keyframe(time, value, inTangent, outTangent));
                }
#else
                keyframes.Add(new Keyframe(time, value, inTangent, outTangent));
#endif
            }

            var animationCurve = new AnimationCurve(keyframes.ToArray());

            for (var i = 0; i < curveKeys.Count; i++)
            {
#if UNITY_EDITOR
                AnimationUtility.SetKeyBroken(
                    animationCurve, i, (bool)curveKeys[i][KeyName.CurveKeyBroken]);
                AnimationUtility.SetKeyLeftTangentMode(
                    animationCurve, i,
                    (AnimationUtility.TangentMode)(int) curveKeys[i][KeyName.CurveLeftTangentMode]);
                AnimationUtility.SetKeyRightTangentMode(
                    animationCurve, i,
                    (AnimationUtility.TangentMode)(int) curveKeys[i][KeyName.CurveRightTangentMode]);
#endif
            }
            args.SetValueByReflection(animationCurve);
        }