🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity

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

Q&A

解決済

1回答

5292閲覧

Inspector上のtext行数制限

tsubu

総合スコア15

C#

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

Unity

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

0グッド

0クリップ

投稿2019/10/22 13:03

編集2019/10/23 12:48

Unityで2Dゲームを作成してます。

テキストボックス内で上の行から更新されて下に流れるような(アイテムをひろった!とか、敵をたおした!を4~5行くらいで表示する)ものを作りたいと考えています。

C#

1 2Text text ; 3 4public void Massage(string log) 5{ 6 this.text.text = log + "\n" + text.text ; 7}

logは他の複数のScriptから渡していて、
Sceneにn行のみ表示させるのはテキストボックスの大きさで行なったんですが、このままではInspector上は更新した分、何行でもtextを保持すると思います。

Inspectorのtextの行数を制限、または指定の行を削除するには、どのような処理を付け加えればいいのでしょうか。

また別のアプローチとして、改行後の現在のtextを付け加える部分をnowTextとかにして別で取得する場合、取得する行の範囲指定とかできるんでしょうか。

行数の取得方法とか改行数の取得方法はあったんですが、範囲指定の方法がわからずでした。
ずっと残しておきたいので、表示されてるtextごと一定時間で消える処理は、できればしたくないです。

よろしくお願いします。

-追記-

Inspectorのtextを消したいというのは画像のこの部分です。

イメージ説明

すいません、スクショ方法がわからなくて携帯で撮った画像です。

ゲーム画面は
イメージ説明
こんな感じになってます。
ボタンを押すとMassageにlogが入ります。
Sceneではオーバーフローさせないで表示させてます。
オーバーフローしてる部分のtextを消す方法を模索中です。
と言うべきでした。

大量にtextを増やしても(ボタン連打とか)、実際にはSceneに表示されてる部分しか保持してないよって場合なら全然問題ないんですが…。

一行目を大きく表示とかもしてみたいので、いったんTextを2つにする方法で考えてみます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

■方法1:マスクを使う
適当なオブジェクトに「RectMask2D」コンポーネントを付与し、
Textが付いているオブジェクトをこのオブジェクトの子にして上端を合わせます。
これで「Text自体の大きさは文字列全体の量になるが、下部のはみ出た分は画面上には見えない」という形になります。
(Scrollも同じ仕組みなので見てみるといいかと)

■方法2:文字列を切り出す
TextGeneratorのlines辺りがそれに該当しそうなので見てみてください。
UnityEngine.TextGenerator - Unity スクリプトリファレンス
linesでどの行か特定→その行の1文字目が全体の何文字目かを特定→特定したn文字目で全体の文字列を分割、でいけるかと。
とは言えちょっと面倒ですし負荷が気になるので方法3の方が良さそうな気がします。

■方法3:Listで管理する
Massageメソッドが呼ばれたタイミングで、まずListにlogをAddします。
そしてTextは「Listの何番目〜何番目を連結して表示」とか「必要に応じてListの特定要素を削除→TextはListの中身を全部連結して表示」とかにすればいいかと。
(つまり自前で各行を管理する)


ちなみに例えば「5行分の表示枠に1行のテキストが入った時、下4行を空けたい」ということであれば
これもTextGenerator使ってlineCount確認、足りない分は改行文字を付け足しちゃうのが一番楽かなと思います。
(マスクやスクロールと併用すると良さげかと)

一方、「最新のものはウィンドウ内に1行だけ常時表示。ログは改行無しでずらずら並べていい」とかであれば、Textオブジェクトを2つ作って
最新用:Listの先頭を表示
ログ用:Listの2番目以降を連結表示
にすると改行計算気にしないでいい(オブジェクトの配置調整だけで済む)と思います。

投稿2019/10/23 02:34

sakura_hana

総合スコア11427

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

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

tsubu

2019/10/23 12:49

sakura_hanaさん、回答ありがとうございます。 まだ色々触れてなくて未検証なんですが、一番下に記入していただいたTextを2つ作るやつでとりあえず進めてみようかなと思いました。 あと、こちらの言葉足らずのところがあって、質問追記したので、良かったら見てみてください。 とりあえず質問は継続します。
tsubu

2019/10/24 21:28

新しく参考書買ってきて、まだ読んでる最中なんですが、Listで管理すればいけそうな気がしてきました! アドバイスありがとうどざいます!
tsubu

2019/10/25 10:11

下記コードでやりたいことができました。 ```C# public Text text; private List<string> textLine = new List<string> { "","","","" }; public void Massage(string log) { textLine.Insert(0,log); text.text = textLine[0]+"\n"+textLine[1]+"\n"+textLine[2]+"\n"+textLine[3].ToString(); } ``` ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問