private void OnEnable() { _target = (VCIObject)target; _scriptProp = serializedObject.FindProperty("m_Script"); _metaProp = serializedObject.FindProperty("Meta"); _thumbnailProp = _metaProp.FindPropertyRelative("thumbnail"); _vciScriptProp = serializedObject.FindProperty("Scripts"); }
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); } } }
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())); } }
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); }
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); } }
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; } } } }
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}")); } } }