как создавать экземпляры слов по буквам в grid без вырезания слов

#c# #unity3d

#c# #unity-игровой движок

Вопрос:

Я создаю игру, в которой игрок будет решать фразу точно так же, как в «колесе фортуны» минус колесо, но проблема в том, что некоторые слова вырезаются, когда слово превышает 15 столбцов. есть ли какой-нибудь способ заполнить слово в следующей строке?

я пробовал это только с тем, что я знаю, создавая плитку для каждой буквы

кажется, я не могу найти какое-либо решение для этого в сети, и я только начал изучать unity

 private const int Columns = 15;
private const float Space = 35.0f;
public void LettertoBox()
{

    for (int i = 0; i < currentWord.Length; i  )
    {
        int row = i / Columns;
        int column = i % Columns;


        Vector3 newPosition3;
        newPosition3 = new Vector3((cen.transform.position.x   column * Space), (((cen.transform.position.y )) - row * Space), cen2.transform.position.z);

        if (currentWord[i].ToString() != " ")
        {
            GameObject k = (GameObject)Instantiate(letterimage, newPosition3, Quaternion.identity);
            k.name = "letterimage"   (i   1);
            k.transform.SetParent(GameObject.Find("Canvas").transform);
        }
        else
        {
            GameObject k = (GameObject)Instantiate(noletterimage, newPosition3, Quaternion.identity);
            k.name = "letterimage"   (i   1);
            k.transform.SetParent(GameObject.Find("Canvas").transform);
        }

        GameObject l = (GameObject)Instantiate(letter, newPosition3, Quaternion.identity);
        l.name = "letter"   (i   1);
        l.transform.SetParent(GameObject.Find("Canvas").transform);   
    }
}
  

Фактический результат

Ожидаемый результат

Комментарии:

1. Конечно, при просмотре нового слова проверяйте количество оставшихся пробелов, если меньше длины слова, новую строку

2. @BugFinder могу я получить пример кода этого?

Ответ №1:

Это должно сработать для вас, если ни одно слово во фразе не слишком велико для строки (в этом случае вам просто нужно определить его и разделить с помощью ‘-‘)

 public void LetterToBox() {
    int rowCount = 0;
    int position = 0;
    foreach (string word in phraseToSplitToWords.Split(" ")) {
        if (CannotFitWordWithoutCuttingPastTheLimit(position,word, whateverIsTheNumberOfLettersPerLineYouWant)) {
            rowCont  ;
            position= 0;
        }
        PlaceTheWordLetterByLetterInThisPosition(position,row,word);
        position = position   word.Length  1; // 1 for the space between words
    }
}

public void PlaceTheWordLetterByLetterInThisPosition(int positionInLine, int row, string word) {
    foreach (char letter in word) {
        var x = positionInLine* LETTER_WIDTH;
        var y = row* LETTER_HEIGHT;
        InstantiateLetter(x, y, letter); //basically the same way you did

    }
}


public bool CannotFitWordWithoutCuttingPastTheLimit(int position, string word, int limit) {
    return (position   word.Length > limit);
}
  

Комментарии:

1. я не знаю, как заставить эту часть работать с InstantiateLetter(x, y, letter); они накладываются друг на друга, когда я делаю это следующим образом Instantiate (letter, newPosition3, Quaternion.identity);

2. можете ли вы отладить и проверить, какие значения имеет «newPosition3»? возможно, вам также потребуется передать им background в качестве родительского

3. я добавил positionInLine ; чтобы переместить x, и это сработало, спасибо!