private static int GetVersionFromSetupRecords ( List <TextRecordParsing.Record> sourceRecords, out TextRecordParsing.Record versionRecord ) { var version = UnknownVersion; const string VersionToken = "version"; versionRecord = sourceRecords.FirstOrDefault( item => item.GetString(0).ToLowerInvariant() == VersionToken); if (versionRecord != null) { versionRecord.TryGetInt(1, ref version); } return(version); }
public static ParsedSpringBoneSetup ReadSpringBoneSetupFromText ( GameObject springBoneRoot, GameObject colliderRoot, string recordText, IEnumerable <string> inputValidColliderNames ) { List <TextRecordParsing.Record> rawSpringBoneRecords = null; List <TextRecordParsing.Record> rawPivotRecords = null; try { var sourceRecords = TextRecordParsing.ParseRecordsFromText(recordText); TextRecordParsing.Record versionRecord = null; GetVersionFromSetupRecords(sourceRecords, out versionRecord); rawSpringBoneRecords = TextRecordParsing.GetSectionRecords(sourceRecords, "SpringBones"); if (rawSpringBoneRecords == null || rawSpringBoneRecords.Count == 0) { rawSpringBoneRecords = TextRecordParsing.GetSectionRecords(sourceRecords, null) .Where(item => item != versionRecord) .ToList(); } rawPivotRecords = TextRecordParsing.GetSectionRecords(sourceRecords, "Pivots"); } catch (System.Exception exception) { Debug.LogError("SpringBoneSetup: 元のテキストデータを読み込めませんでした!\n\n" + exception.ToString()); return(null); } var hasErrors = false; var errors = new List <TextRecordParsing.Record>(); var pivotRecords = SerializePivotRecords(rawPivotRecords, errors); var springBoneRecords = SerializeSpringBoneRecords(rawSpringBoneRecords, errors); if (errors.Count > 0) { hasErrors = true; } var validObjectNames = springBoneRoot.GetComponentsInChildren <Transform>(true) .Select(item => item.name) .Distinct() .ToList(); var validPivotRecords = new List <PivotSerializer>(); if (!VerifyPivotRecords(pivotRecords, validObjectNames, validPivotRecords)) { hasErrors = true; } var validPivotNames = new List <string>(validObjectNames); validPivotNames.AddRange(validPivotRecords.Select(record => record.name)); var validColliderNames = new List <string>(); var colliderTypes = SpringColliderSetup.GetColliderTypes(); validColliderNames.AddRange(colliderTypes .SelectMany(type => colliderRoot.GetComponentsInChildren(type, true)) .Select(item => item.name)); if (inputValidColliderNames != null) { validColliderNames.AddRange(inputValidColliderNames); } var validSpringBoneRecords = new List <SpringBoneSerializer>(); bool hasMissingColliders; if (!VerifySpringBoneRecords( springBoneRecords, validObjectNames, validPivotNames, validColliderNames, validSpringBoneRecords, out hasMissingColliders)) { hasErrors = true; } if (hasMissingColliders) { Debug.LogWarning("スプリングボーンセットアップ:一部のコライダーが見つかりません"); } return(new ParsedSpringBoneSetup { HasErrors = hasErrors, pivotRecords = validPivotRecords, springBoneRecords = validSpringBoneRecords }); }