//文字のX座標を計算(自動改行処理も行う) float ClacXPosition(List <UguiNovelTextCharacter> characterDataList, bool autoLineBreak, bool applyX, float maxWidth) { float maxX = 0; float indentSize = 0; int index = 0; foreach (var item in characterDataList) { item.ResetXPosition(); } //infoListがテキストの文字数ぶんになるまでループ while (index < characterDataList.Count) { //行の開始インデックス int beginIndex = index; float currentLetterSpace = 0; //文字間のサイズ float x = 0; //現在のX位置 //一行ぶん(改行までの)の処理をループ内で処理 while (index < characterDataList.Count) { UguiNovelTextCharacter currentData = characterDataList[index]; bool isAutoLineBreak = false; //自動改行をするか //行の先頭で、先頭の文字スペースが必要場合があるので加算する if (x == 0) { currentLetterSpace = Additional.GetTopLetterSpace(currentData, Generator); x += indentSize; if (index == 0 && IsAutoIndentation(currentData.Char)) { indentSize = currentData.Width + Generator.LetterSpaceSize; } } //文字間の適用 if (currentData.CustomInfo.IsRuby) { currentLetterSpace += currentData.RubySpaceSize; } x += currentLetterSpace; if (currentData.IsBlank) { //改行文字かスペース } else if (autoLineBreak) { //いったん改行データをクリア currentData.isAutoLineBreak = false; //横幅を越えるなら自動改行 isAutoLineBreak = IsOverMaxWidth(x, Additional.GetMaxWidth(currentData), maxWidth); if (isAutoLineBreak) { //自動改行処理 //改行すべき文字の位置まで戻る index = GetAutoLineBreakIndex(characterDataList, beginIndex, index); currentData = characterDataList[index]; currentData.isAutoLineBreak = true; } } //1文字進める ++index; bool br = (autoLineBreak && currentData.IsBrOrAutoBr) || currentData.IsBr; //改行処理 if (br) { //改行なので行処理のループ終了 break; } else { if (applyX) { currentData.InitPositionX(x); } //X位置を進める x += currentData.Width; if (currentData.RubySpaceSize != 0) { currentLetterSpace = currentData.RubySpaceSize; } else { currentLetterSpace = Generator.LetterSpaceSize; //文字間を無視する場合のチェック if (Generator.TextSettings) { if (index < characterDataList.Count) { if (Generator.TextSettings.IsIgonreLetterSpace(currentData, characterDataList[index])) { currentLetterSpace = 0; } } } } } } maxX = Mathf.Max(x, maxX); } return(maxX); }
//自動改行処理を行う void AutoLineBreak(List <UguiNovelTextCharacter> characterDataList) { float indentSize = 0; int index = 0; //infoListがテキストの文字数ぶんになるまでループ while (index < characterDataList.Count) { //行の開始インデックス int beginIndex = index; float currentLetterSpace = 0; //文字間のサイズ float x = 0; //現在のX位置 //一行ぶん(改行までの)の処理をループ内で処理 while (index < characterDataList.Count) { UguiNovelTextCharacter currentData = characterDataList[index]; bool isAutoLineBreak = false; //自動改行をするか //行の先頭で、先頭の文字スペースが必要場合があるので加算する if (x == 0) { currentLetterSpace = Additional.GetTopLetterSpace(currentData, this); x += indentSize; if (index == 0 && IsAutoIndentation(currentData.Char)) { indentSize = currentData.Width + LetterSpaceSize; } } //文字間の適用 if (currentData.CustomInfo.IsRuby) { currentLetterSpace += currentData.RubySpaceSize; } x += currentLetterSpace; if (currentData.IsBlank) { //改行文字かスペース } else { //横幅を越えるなら自動改行 isAutoLineBreak = IsOverMaxWidth(x, Additional.GetMaxWidth(currentData)); if (isAutoLineBreak) { //自動改行処理 //改行すべき文字の位置まで戻る index = GetAutoLineBreakIndex(characterDataList, beginIndex, index); currentData = characterDataList[index]; currentData.isAutoLineBreak = true; } } //1文字進める ++index; //改行処理 if (currentData.IsBrOrAutoBr) { //改行なので行処理のループ終了 break; } else { currentData.InitPositionX(x, currentLetterSpace); //X位置を進める x += currentData.Width; if (currentData.RubySpaceSize != 0) { currentLetterSpace = currentData.RubySpaceSize; } else { currentLetterSpace = LetterSpaceSize; //文字間を無視する場合のチェック if (TextSettings) { if (index < characterDataList.Count) { if (TextSettings.IsIgonreLetterSpace(currentData, characterDataList[index])) { currentLetterSpace = 0; } } } } } } } }