コード例 #1
0
 private void OnEnable()
 {
     _target        = (VCIObject)target;
     _scriptProp    = serializedObject.FindProperty("m_Script");
     _metaProp      = serializedObject.FindProperty("Meta");
     _thumbnailProp = _metaProp.FindPropertyRelative("thumbnail");
     _vciScriptProp = serializedObject.FindProperty("Scripts");
 }
コード例 #2
0
ファイル: VCIValidator.cs プロジェクト: oocytanb/VCI
        private static void ValidateVCIScripts(VCIObject vciObject)
        {
            if (!vciObject.Scripts.Any())
            {
                return;
            }

            // Check 1: 一つ目のスクリプトの名前が「main」である
            if (vciObject.Scripts[0].name != "main")
            {
                var errorText = VCIConfig.GetText($"error{(int) ValidationErrorType.FirstScriptNameNotValid}");
                throw new VCIValidatorException(ValidationErrorType.FirstScriptNameNotValid, errorText);
            }

            // Check 2: 名前が空のスクリプトが存在しない
            var empties = vciObject.Scripts.Where(x => string.IsNullOrEmpty(x.name));
            if (empties.Any())
            {
                var errorText = VCIConfig.GetText($"error{(int) ValidationErrorType.NoScriptName}");
                throw new VCIValidatorException(ValidationErrorType.NoScriptName, errorText);
            }

            // Check 3: 同一の名前のスクリプトが複数存在しない
            var duplicates = vciObject.Scripts.GroupBy(script => script.name)
                .Where(name => name.Count() > 1)
                .Select(group => @group.Key).ToList();
            if (duplicates.Any())
            {
                var errorText = VCIConfig.GetText($"error{(int) ValidationErrorType.ScriptNameConfliction}");
                throw new VCIValidatorException(ValidationErrorType.ScriptNameConfliction, errorText);
            }

            // Check 4: スクリプト名に無効な文字列が含まれていない
            // - 無効な文字列 : ファイル名に含めることのできない文字 + '.'
            var invalidChars = Path.GetInvalidFileNameChars().Concat(new[] {'.'}).ToArray();
            foreach (var script in vciObject.Scripts)
            {
                if (script.name.IndexOfAny(invalidChars) >= 0)
                {
                    var errorText = string.Format(
                        VCIConfig.GetText($"error{(int) ValidationErrorType.InvalidCharacter}"),
                        script.name);
                    throw new VCIValidatorException(ValidationErrorType.InvalidCharacter, errorText);
                }
            }
        }
コード例 #3
0
        public static void Validate(VCIObject vciObject)
        {
            var errorMessages = new[]
            {
                ValidateField("Version", vciObject.Meta.version),
                ValidateField("Author", vciObject.Meta.author),
                ValidateField("ContactInformation", vciObject.Meta.contactInformation),
                ValidateField("Reference", vciObject.Meta.reference),
                ValidateField("Title", vciObject.Meta.title),
                ValidateField("Description", vciObject.Meta.description),
                ValidateField("ModelDataOtherLicenseUrl", vciObject.Meta.modelDataOtherLicenseUrl),
                ValidateField("ScriptOtherLicenseUrl", vciObject.Meta.scriptOtherLicenseUrl)
            };

            if (errorMessages.Any(m => m != ""))
            {
                throw new VCIValidatorException(
                          ValidationErrorType.InvalidMetaData,
                          string.Join(Environment.NewLine, errorMessages.Where(m => m != "").ToArray()));
            }
        }
コード例 #4
0
ファイル: VCIMetaValidator.cs プロジェクト: Santarh/VCI
        public static bool Validate(VCIObject vciObject, out string errorMessage)
        {
            var errorMessages = new[]
            {
                ValidateField("Version", vciObject.Meta.version),
                ValidateField("Author", vciObject.Meta.author),
                ValidateField("ContactInformation", vciObject.Meta.contactInformation),
                ValidateField("Reference", vciObject.Meta.reference),
                ValidateField("Title", vciObject.Meta.title),
                ValidateField("Description", vciObject.Meta.description),
                ValidateField("ModelDataOtherLicenseUrl", vciObject.Meta.modelDataOtherLicenseUrl),
                ValidateField("ScriptOtherLicenseUrl", vciObject.Meta.scriptOtherLicenseUrl)
            };

            if (errorMessages.Any(m => m != ""))
            {
                errorMessage = string.Join(Environment.NewLine, errorMessages.Where(m => m != "").ToArray());
                return(false);
            }

            errorMessage = "";
            return(true);
        }
コード例 #5
0
        public static void ValidateVCIObject(VCIObject vo)
        {
            // VCIObject
            var vciObjectCount  = 0;
            var gameObjectCount = 0;

            foreach (var t in vo.transform.Traverse())
            {
                if (t.GetComponent <VCIObject>() != null)
                {
                    vciObjectCount++;
                }
                gameObjectCount++;
            }

            if (vciObjectCount > 1)
            {
                throw new VCIValidatorException(ValidationErrorType.MultipleVCIObject);
            }

            // Scripts
            if (vo.Scripts.Any())
            {
                if (vo.Scripts[0].name != "main")
                {
                    throw new VCIValidatorException(ValidationErrorType.FirstScriptNameNotValid);
                }

                var empties = vo.Scripts.Where(x => string.IsNullOrEmpty(x.name));
                if (empties.Any())
                {
                    throw new VCIValidatorException(ValidationErrorType.NoScriptName);
                }

                var duplicates = vo.Scripts.GroupBy(script => script.name)
                                 .Where(name => name.Count() > 1)
                                 .Select(group => group.Key).ToList();
                if (duplicates.Any())
                {
                    throw new VCIValidatorException(ValidationErrorType.ScriptNameConfliction);
                }

                var invalidChars = Path.GetInvalidFileNameChars().Concat(new [] { '.' }).ToArray();
                foreach (var script in vo.Scripts)
                {
                    if (script.name.IndexOfAny(invalidChars) >= 0)
                    {
                        throw new VCIValidatorException(ValidationErrorType.InvalidCharacter,
                                                        string.Format(VCIConfig.GetText($"error{(int)ValidationErrorType.InvalidCharacter}"), script.name));
                    }
                }
                ;
            }

            VCIMetaValidator.Validate(vo);

            // Invalid Components
            CheckInvalidComponent <MeshCollider>(vo.gameObject);

            // Spring Bone
            var springBones = vo.GetComponents <VCISpringBone>();

            if (springBones != null && springBones.Length > 0)
            {
                ValidateSpringBones(springBones);
            }
        }
コード例 #6
0
        public IEnumerator SetupCorutine()
        {
            VCIObject = Root.AddComponent <VCIObject>();
            yield return(ToUnity(meta => VCIObject.Meta = meta));

            // Script
            if (GLTF.extensions.VCAST_vci_embedded_script != null)
            {
                VCIObject.Scripts.AddRange(GLTF.extensions.VCAST_vci_embedded_script.scripts.Select(x =>
                {
                    var source = "";
                    try
                    {
                        var bytes = GLTF.GetViewBytes(x.source);
                        source    = Utf8String.Encoding.GetString(bytes.Array, bytes.Offset, bytes.Count);
                    }
                    catch (Exception)
                    {
                        // 握りつぶし
                    }

                    return(new VCIObject.Script
                    {
                        name = x.name,
                        mimeType = x.mimeType,
                        targetEngine = x.targetEngine,
                        source = source
                    });
                }));
            }

            // Audio
            if (GLTF.extensions.VCAST_vci_audios != null &&
                GLTF.extensions.VCAST_vci_audios.audios != null)
            {
                var root = Root;
                foreach (var audio in GLTF.extensions.VCAST_vci_audios.audios)
                {
#if ((NET_4_6 || NET_STANDARD_2_0) && UNITY_2017_1_OR_NEWER)
                    if (Application.isPlaying)
                    {
                        var bytes = GLTF.GetViewBytes(audio.bufferView);
                        WaveUtil.WaveHeaderData waveHeader;
                        var audioBuffer = new byte[bytes.Count];
                        Buffer.BlockCopy(bytes.Array, bytes.Offset, audioBuffer, 0, audioBuffer.Length);
                        if (WaveUtil.TryReadHeader(audioBuffer, out waveHeader))
                        {
                            AudioClip audioClip = null;
                            yield return(AudioClipMaker.Create(
                                             audio.name,
                                             audioBuffer,
                                             44,
                                             waveHeader.BitPerSample,
                                             waveHeader.DataChunkSize / waveHeader.BlockSize,
                                             waveHeader.Channel,
                                             waveHeader.SampleRate,
                                             false,
                                             (clip) => { audioClip = clip; }));

                            if (audioClip != null)
                            {
                                var source = root.AddComponent <AudioSource>();
                                source.clip        = audioClip;
                                source.playOnAwake = false;
                                source.loop        = false;
                            }
                        }
                    }
                    else
#endif
                    {
#if UNITY_EDITOR
                        var audioClip =
                            AssetDatabase.LoadAssetAtPath(AudioAssetPathList[audio.name], typeof(AudioClip)) as
                            AudioClip;
                        if (audioClip != null)
                        {
                            var source = root.AddComponent <AudioSource>();
                            source.clip = audioClip;
                        }
                        else
                        {
                            Debug.LogWarning("AudioFile NotFound: " + audio.name);
                        }
#endif
                    }
                }
            }


            // Animation
            var animation = Root.GetComponent <Animation>();
            if (animation != null)
            {
                animation.playAutomatically = false;
            }

            for (var i = 0; i < GLTF.nodes.Count; i++)
            {
                var node = GLTF.nodes[i];
                var go   = Nodes[i].gameObject;
                if (node.extensions != null)
                {
                    if (node.extensions.VCAST_vci_item != null)
                    {
                        var item = go.AddComponent <VCISubItem>();
                        item.Grabbable      = node.extensions.VCAST_vci_item.grabbable;
                        item.Scalable       = node.extensions.VCAST_vci_item.scalable;
                        item.UniformScaling = node.extensions.VCAST_vci_item.uniformScaling;
                        item.GroupId        = node.extensions.VCAST_vci_item.groupId;
                    }
                }
            }
        }
コード例 #7
0
ファイル: VCIValidator.cs プロジェクト: notargs/VCI
        public static void ValidateVCIObject(VCIObject vo)
        {
            // VCIObject
            var vciObjectCount        = 0;
            var gameObjectCount       = 0;
            var playerSpawnPointsList = new List <VCIPlayerSpawnPoint>();
            var locationBoundsList    = new List <VCILocationBounds>();

            foreach (var t in vo.transform.Traverse())
            {
                if (t.GetComponent <VCIObject>() != null)
                {
                    vciObjectCount++;
                }

                var psp = t.GetComponent <VCIPlayerSpawnPoint>();
                if (psp != null)
                {
                    playerSpawnPointsList.Add(psp);
                }

                var locationBounds = t.GetComponent <VCILocationBounds>();
                if (locationBounds != null)
                {
                    locationBoundsList.Add(locationBounds);
                }

                gameObjectCount++;
            }

            if (vciObjectCount > 1)
            {
                throw new VCIValidatorException(ValidationErrorType.MultipleVCIObject);
            }

            // Scripts
            if (vo.Scripts.Any())
            {
                if (vo.Scripts[0].name != "main")
                {
                    throw new VCIValidatorException(ValidationErrorType.FirstScriptNameNotValid);
                }

                var empties = vo.Scripts.Where(x => string.IsNullOrEmpty(x.name));
                if (empties.Any())
                {
                    throw new VCIValidatorException(ValidationErrorType.NoScriptName);
                }

                var duplicates = vo.Scripts.GroupBy(script => script.name)
                                 .Where(name => name.Count() > 1)
                                 .Select(group => group.Key).ToList();
                if (duplicates.Any())
                {
                    throw new VCIValidatorException(ValidationErrorType.ScriptNameConfliction);
                }

                var invalidChars = Path.GetInvalidFileNameChars().Concat(new [] { '.' }).ToArray();
                foreach (var script in vo.Scripts)
                {
                    if (script.name.IndexOfAny(invalidChars) >= 0)
                    {
                        throw new VCIValidatorException(ValidationErrorType.InvalidCharacter,
                                                        string.Format(VCIConfig.GetText($"error{(int)ValidationErrorType.InvalidCharacter}"), script.name));
                    }
                }
                ;
            }

            VCIMetaValidator.Validate(vo);

            // Invalid Components
            CheckInvalidComponent <MeshCollider>(vo.gameObject);

            // Spring Bone
            var springBones = vo.GetComponents <VCISpringBone>();

            if (springBones != null && springBones.Length > 0)
            {
                ValidateSpringBones(springBones);
            }

            // PlayerSpawnPoint
            foreach (var psp in playerSpawnPointsList)
            {
                var pspT = psp.gameObject.transform;
                if (Math.Abs(pspT.position.y) > SpawnPointAllowedHeightRange)
                {
                    throw new VCIValidatorException(ValidationErrorType.SpawnPointHeightRangeNotAllowed,
                                                    VCIConfig.GetText($"error{(int)ValidationErrorType.SpawnPointHeightRangeNotAllowed}"));
                }

                if (Math.Abs(pspT.rotation.x) > 0.001f || Math.Abs(pspT.rotation.z) > 0.001f)
                {
                    throw new VCIValidatorException(ValidationErrorType.SpawnPointNotHorizontal,
                                                    VCIConfig.GetText($"error{(int)ValidationErrorType.SpawnPointNotHorizontal}"));
                }

                var pspR = psp.GetComponent <VCIPlayerSpawnPointRestriction>();
                if (pspR == null)
                {
                    continue;
                }

                if (pspR.LimitRectLeft > 0 ||
                    pspR.LimitRectRight < 0 ||
                    pspR.LimitRectForward < 0 ||
                    pspR.LimitRectBackward > 0)
                {
                    throw new VCIValidatorException(ValidationErrorType.SpawnPointOriginNotInRange,
                                                    VCIConfig.GetText($"error{(int)ValidationErrorType.SpawnPointOriginNotInRange}"));
                }
            }

            // LocationBounds
            if (locationBoundsList.Count >= 2)
            {
                throw new VCIValidatorException(ValidationErrorType.LocationBoundsCountLimitOver,
                                                VCIConfig.GetText($"error{(int)ValidationErrorType.LocationBoundsCountLimitOver}"));
            }
            if (locationBoundsList.Count > 0)
            {
                var locationBounds = locationBoundsList[0];
                var min            = locationBounds.Bounds.min;
                var max            = locationBounds.Bounds.max;

                // 10000fを超えてないかだけチェック
                if (Mathf.Abs(min.x) > 10000f || Mathf.Abs(min.y) > 10000f || Mathf.Abs(min.z) > 10000f ||
                    Mathf.Abs(max.x) > 10000f || Mathf.Abs(max.y) > 10000f || Mathf.Abs(max.z) > 10000f)
                {
                    throw new VCIValidatorException(ValidationErrorType.LocationBoundsValueExceeded,
                                                    VCIConfig.GetText($"error{(int)ValidationErrorType.LocationBoundsValueExceeded}"));
                }
            }
        }