質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

2回答

3731閲覧

Unityのinputfieldで改行後に改行する前の文章も表示させておく方法

niconico.smile

総合スコア21

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/06/29 15:25

unityでInputFieldに入力した文章をログとしてコンソールに表示されるプログラムを作りました。

このInputFieldに入力した文章をログに表示する前のInputFieldに文章を入力している段階で、改行を行うとInputFieldが次の行にいってしまい、改行前に打っていた文章が見えなくなってしまいます。これを表示したまま次の行にうつる方法がわかる方、どうか教えてください。初心者なので詳しく教えてくださると非常に助かります。

使い方としては、InputFieldのOn End Edit(string)に以下のスクリプトを入れ、ボタンを指定することで、実行後、指定したボタンを押すとInputFieldに入力してある文章がコンソールにログとして出力されます。InputFieldのLine typeは、Multi Line Newlineを使っています。

コードなどは主にこちらのサイトを参考にしました。
https://xr-hub.com/archives/11035

以下に私の現段階のコードを示します。回答よろしくお願いします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class InputFieldManager : MonoBehaviour
{
//InputFieldを格納するための変数
InputField inputField;

// Start is called before the first frame update void Start() { //InputFieldコンポーネントを取得 inputField = GameObject.Find("InputField").GetComponent<InputField>(); } //入力された名前情報を読み取ってコンソールに出力する関数 public void GetInputName() { //InputFieldからテキスト情報を取得する string name = inputField.text; Debug.Log(name); //入力フォームのテキストを空にする inputField.text = ""; inputField.ActivateInputField(); }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

なんかもっとスムーズなやり方ありそうですが・・・
テキストの行数が得られれば、それに応じたサイズに変更するというアプローチでも良いのかなと思って試してみました。

行数が1ならheight30になり
行数が2ならheight46.5になりと、行数基準で高さが変動します。

なんで0.55をかけているかというと、30ずつ高さが増えるとスカスカになってしまったので少し補正かけるために仮で置いてます。

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class Test0630 : MonoBehaviour 7{ 8 9 InputField _if; 10 RectTransform _if_Rect; 11 float baseHeight; 12 13 void Start() 14 { 15 _if = GetComponent<InputField>(); 16 _if_Rect = _if.GetComponent<RectTransform>(); 17 18 baseHeight = _if_Rect.sizeDelta.y; // 初期のheightを基準とする。デフォルトなら30のはず 19 } 20 21 void Update() 22 { 23 // まずテキストの行数を得る 24 var _currentLineCount = GetLine(_if.text); 25 26 // フィールドの高さを決める 27 // 0.55f については行数をいい感じに見せるための適当な係数。都度調整 28 var _currentFieldHegiht = baseHeight + ((baseHeight * 0.55f) * (_currentLineCount - 1)); 29 30 // フィールドのサイズを変更する 31 // width / height についてはsizeDeltaで変更できる 32 _if_Rect.sizeDelta = new Vector2(_if_Rect.sizeDelta.x, _currentFieldHegiht); 33 } 34 35 // テキストを改行コードで分割し、行数を返す 36 int GetLine(string str) { 37 var lineCount = str.Split('\n'); 38 return lineCount.Length; 39 } 40} 41

投稿2021/06/30 03:11

hogefugapiyo

総合スコア3302

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

niconico.smile

2021/06/30 04:26

ご回答ありがとうございます!!また、コードまで考えてくださり、誠にありがとうございます。本当に初歩的な質問で申し訳ないのですが、このコードはどうやったら実行中に使用することができますか?[test0630]という新しいスクリプトをVisualStudio2019で作り、「問題は見つかりませんでした」と表示されており、スクリプトを保存した状態まで来ています。ここからこのコードを使用する流れを教えてください。お手数をおかけしますがよろしくお願いいたします。
hogefugapiyo

2021/06/30 04:58

これは直接InputFieldコンポーネントを参照しているので、InputFieldに直接スクリプトをアタッチしてください
niconico.smile

2021/06/30 08:02 編集

ご返信くださりまして誠にありがとうございます!!使用していたInputFieldにアタッチしてみて、実行を押し、エンターキーを入力して、改行を行ってみた結果、無事、改行後にも改行前の文章を見ることが出来ました。コンソールへの出力も無事できました。ほんとにすごいです。ありがとうございます。0.55という値も絶妙でした。 もう一つだけ相談なんですが、先ほど教えていただきましたコードに付け足しの機能として、InputFieldの横幅いっぱいに文字を入力して、InputFieldの1行で入力できる横幅分の文字数を超えて、次の行(2行目)にいった場合にも改行前の文章を表示しておくという機能を付け足すことは可能でしょうか?お手数をおかけしますが何卒よろしくお願いいたします。
hogefugapiyo

2021/06/30 08:54

折返しになる文字数が分かれば対応できると思うんですが、これちょっとむずかしい問題でフォントが等幅じゃない場合、文字の種類によって折返しになるまでの文字数が変動しちゃうんですよね。 たとえばaaaaと入力するのと、llllと入力するのだと折り返しになるまでの文字数が違いますよね。 もし、フォントが等幅なら1文字あたりの横幅が共通なので話が早くて 1行あたり何文字まで入力できるかを決めてあげて、その文字数より入力文字数が多ければ高さを増やすことで全文が見えるようになると思います 私の知らない解決方法がある可能性も十分にあるので これに関しては改めて質問を立てていただいたほうが他の方から有益な回答が得られる可能性があるかと思います。
niconico.smile

2021/06/30 14:25 編集

ご返信ありがとうございます。何度も対応していただいて本当に助かります。 入力する文字によって折り返しされる文字数が異なることにより、この問題が起こっていると思うのですが、以下のURL(以下のURLではInputFieldではなくtext形式?になっているかもしれません。)のように1行のInputFieldの中に入力できる文字数を事前に指定しておくというのはどうでしょうか?(○文字以上を超えたら自動で改行されるようにする)そうすれば、折り返しになる文字数がわかるのではないかと考えました。 この時に、日本語・全角英数字の場合と半角英数字の場合で同じ文字数で改行されるように設定した場合、設定した文字数上限いっぱいの文字を入力した際の一行全体の横幅が日本語・全角英数字の場合と半角英数字の場合では大きく異なるということが考えられます。そのため、入力している文字が日本語・全角英数字の時の場合と半角英数字の時の場合とその他(日本語・全角英数字と半角英数字が1行の中に混合で存在する時の場合)で、事前に自動で改行されるよう指定する上限の文字数を一行の横幅がちょうど良いバランスなるように変えられるようにできればいいなと思っています。(入力が日本語・全角英数字の時と半角英数字の時で場合分けするのが難しい場合は、同じ文字数を上限としても問題ありません。理由としては、1行に入力できる文字数の上限をあまり大きくしなければそこまで差異は生まれないと考えられるためです。または、半角英数字は2.1文字分(任意の数)くらいで日本語・全角英数字の1文字分だと考えられるため、半角英数字が入力された時は、2.1文字で日本語・全角英数字の1文字分の横幅としてカウントする(この時、半角英数字の文字数に合わせて小数点以下は切り上げとする。[例:半角英数字が4文字だとした場合、4(文字)÷2.1(日本語・全角英数字の一文字分の横幅を半角英数字の文字数の横幅に変換した値)=1.9047=2文字(小数点以下を切り上げ)とし、日本語・全角英数字の2文字分として上限までのカウントに加える])をして半角英数字の横幅を日本語・全角英数字分の横幅に変換して、半角を全角としてカウントできるようにプログラムを組めればいいかなと思っています。この場合、半角英数字が奇数の場合であっても一番近い偶数に切り上げで合わせられるのではないか[半角英数字が3文字の場合、3(文字)÷2.1(日本語・全角英数字の一文字分の横幅を半角英数字の文字数の横幅に変換した値)=1.4285=2文字(小数点以下を切り上げ)となり、日本語・全角英数字2文字分の横幅として上限までのカウントに加える]と考えられるため、問題なく使えそうです。) https://teratail.com/questions/249814 この点を踏まえてもコードの実現は難しいでしょうか?難しいようであれば、考え込みすぎずにおっしゃっていただけましたら回答者様のご助言のように質問を立て直してみたいと思います。 何度もお手数をおかけしてしまい、本当に申し訳ございません。何卒よろしくお願いいたします。
guest

0

InputFieldは、常に入力カーソル(文字を入力するときに出てくる縦棒のこと)が表示されるように動きますので、縦幅が狭い(2行を表示できない)と、2行目に移ったときに1行目が表示されなくなります。
InputFieldのRect TransformでHeightの値を大きくすればよいのではないでしょうか。

<追記>

https://kan-kikuchi.hatenablog.com/entry/Text_Preferred

こちらで紹介されている「text.preferredHeight」を使えば出来そうだと思います。
これを使うとテキストを全て表示するために必要な高さ(Widthもあります)を出してくれます。
かなり力技ですが、処理が重くならない場所ならあまり気にならないと思います。
が、滅茶苦茶なので、こんな方法もあるんだ、程度にお願いします。
※私は、途中に書いている、InputFieldだと必要な縦幅がちゃんと計測できない理由もわかっておりません。

InputFieldManager

1using UnityEngine; 2using UnityEngine.UI; 3 4public class InputFieldManager : MonoBehaviour 5{ 6 //テキストの高さの補正値(任意) 7 [SerializeField] private float TextHeightCorrection; 8 9 //InputFieldを格納するための変数など 10 InputField inputField; 11 RectTransform inputRect; 12 Text text; 13 14 // Start is called before the first frame update 15 void Start() 16 { 17 //InputFieldコンポーネントを取得 18 inputField = GameObject.Find("InputField").GetComponent<InputField>(); 19 inputRect = inputField.GetComponent<RectTransform>(); 20 21 //InputFieldのテキストを取得 22 text = inputField.textComponent; 23 } 24 25 //入力された名前情報を読み取ってコンソールに出力する関数 26 public void GetInputName() 27 { 28 //InputFieldからテキスト情報を取得する 29 string name = inputField.text; 30 Debug.Log(name); 31 32 //入力フォームのテキストを空にする 33 inputField.text = ""; 34 inputField.ActivateInputField(); 35 } 36 37//InputFieldコンポーネントの「On Value Changed」に設定 38 public void OnEditInputField() 39 { 40 //一旦、必要サイズ計測の為に大きくする 41 //InputFieldのサイズが小さいと必要な縦幅がちゃんと出されないみたいです 42 inputRect.sizeDelta = new Vector2(inputRect.sizeDelta.x, 1000); 43 44 //1行以下の場合(30は初期値) 45 if (text.preferredHeight < 30) 46 { 47 inputRect.sizeDelta = new Vector2(inputRect.sizeDelta.x, 30f); 48 } 49 //2行以上の場合 50 else 51 { 52 inputRect.sizeDelta = new Vector2(inputRect.sizeDelta.x, text.preferredHeight + TextHeightCorrection); 53 } 54 } 55}

一応これで動きました。

投稿2021/06/29 21:01

編集2021/06/30 13:11
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

niconico.smile

2021/06/29 23:28 編集

ご回答ありがとうございます!! InputFieldのRect TransformでHeightの値を変えることで縦幅をいじれること知りませんでした!ありがとうございます!私が行いたいことに使えそうです。 そこでなんですが、InputFieldへの入力に、もし改行が追加された場合、または、設定してあるInputFieldの横幅を越えて2行になってしまう場合、初期値のHeight値[初期値:30]の分が現在のHeight値に足される、つまり、+30されるといった入力に合わせてテキストの縦幅が可変するコードの書き方分かりませんか?2行にして幅を大きくした後に文字を削除して1行にしたら幅がその分戻るようにしてほしいのと、ログに一度出力したら大きくなっていた分のHeightは初期のHeightに戻るようにしてほしいです。
退会済みユーザー

退会済みユーザー

2021/06/30 13:09 編集

https://kan-kikuchi.hatenablog.com/entry/Text_Preferred こちらで紹介されている「text.preferredHeight」を使えば出来そうだと思います。 これを使うとテキストを全て表示するために必要な高さ(Widthもあります)を出してくれます。 かなり力技ですが、処理が重くならない場所ならあまり気にならないと思います。 が、滅茶苦茶なので、こんな方法もあるんだ、程度にお願いします。 ※私は、途中に書いている、InputFieldだと必要な縦幅がちゃんと計測できない理由もわかっておりません。 一応この方法で動きました。回答の方に追記として移動しておきます。
niconico.smile

2021/06/30 13:28 編集

コードの提示、そして、ご回答いただきまして、誠にありがとうございます。こちらのコードを使うとテキストを全て表示するために必要な高さ(Widthもある)を出してくれるということですが、それによって何ができるようになるか教えていただきたいです。このコードの使い方としては、InputFieldのOn End Edit(string)とInputFieldの「On Value Changed」に送っていただきましたスクリプトを入れ、(InputFieldのOn End Edit(string)にはGetInputName()を、InputFieldの「On Value Changed」 にはOnEditInputField()を入れている)ボタンを指定し、実行後、指定したボタンを押していますが、使い方はこれで合っていますでしょうか?現段階では、何が変化しているかがわかっていません。お手数をおかけしますがどこが変化したのかを教えていただきたいです。初歩的な質問で申し訳ございません。 現在、改行を入力したら改行前の文章を見ることには成功しています。しかし、inputFieldの横幅を超え、文字の折り返しにて次の行にうつった場合には改行前の文章が見えない状態になってしまっています。ReglSS様から教えていただきましたコードを用いれば、この状況下を変えることができるのでしょうか?お手数をおかけしますが私自身が初心者のため、教えていただけますと光栄です。何卒よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2021/06/30 21:41 編集

いえいえ、説明不足でした。 使い方はそれで問題ないと思いますよ。 preferred.Heightを使用すると、テキストが全文を表示するのに必要な高さを算出してくれるので、その数値をInputFieldのRectTransformのHeightに代入すれば……という考えです。 このコードはInputFieldに入力された内容をもとに、InputField自体のサイズを変えているものです。 On Value Changedは半角入力の時は1文字打つごとに、全角入力の時は確定時に呼ばれます。 OnEditInputField()はInputFieldの高さを、テキストを全文表示するのに必要な高さに変更してくれますので、入力中に行数が変化しても縦幅はその時の行数にフィットすると思います。 追加したコードは入力を行わなければ見た目には何の変化も出ません。 こちらの環境では、改行を行った時も、横幅を越えて文字を入力したときも正常に高さが変更されました。 「2行にして幅を大きくした後に文字を削除して1行にしたら幅がその分戻るようにしてほしいのと、ログに一度出力したら大きくなっていた分のHeightは初期のHeightに戻るようにしてほしいです。」とのことでしたので、一応この機能は満たしているかな、と思います。 注意点は、日本語入力をしているときは、変換を確定してからでないと反映されません(これはどうにもならないと思います)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問