ブループリントでstringかtextの変数でソートしたいのですが、ノードはイコールかどうかしかないようです。方法があるのでしょうか。
よろしくお願いします。
のようなプラグインを使用できます
または、独自の比較関数を作成する必要があります:)
やはりこういうのを入れないと実現できないのでしょうか。できるだけインストールしたままの状態で実現したいのです。
それからあなたはそれを自分で書く必要があります:)
stringには色々なノードが用意されています。ヒストリアさんがこちらでその様々な機能を紹介してくれています。
[UE4] 文字列FString操作まとめ|株式会社ヒストリア (historia.co.jp)
ご質問の「変数でソート」というのはどのような内容でしょうか。
意図が少々不明瞭なので、もう少し内容を具体的に書かれた方が良いかなと思います。
アクターを配列に入れています。それでアクターのdisplaynameで並び変えたいのです。
displaynameとしては"Nai01-001-24mm"や"G05-04-40mm"などありまして、運用で文字列のフォーマットの問題もありますが、順番的にはwindowsのエクスプローラーで並ぶ感じでソートしたいのです。
例としては
Nai01-001-24mm
G05-04-40mm
G02-01-28mm
がある場合、
G02-01-28mm
G05-04-40mm
Nai01-001-24mm
と並ぶ感じです。ハイフンの位置がどうのこうのという細かいのは今は考えません。
これでわかりますでしょうか。
なるほど大まかに内容はわかりました。アルファベットないし数字順で並ぶということですね。
一つ気になる重大なことがあるのですが、前に自分のプロジェクトでもdisplaynameの条件式を使って
組んだことがあったのですが(ひょっとしたらdisplaynameではなく別のものだったかもしれませんが)
パッケージ版ではその条件式が機能しなかったということがあったので、もしパッケージ化予定で
パッケージ版のテストをまだ行っていない場合は、その部分を一度テストしてみることをお勧めします。
もう2つほど質問ですが、このアクター配列の規模(配列の長さ)はどのくらいでしょう。
それと、その配列の長さは一定ですか?それともゲーム中に増減するものでしょうか。
もし規模が小さく、一定の数である場合はTagを使って解決ができるかもしれません。
目的のものはエディタでしか使用しないです。パッケージにはしません。なのでdisplaynameでも構いません。というか名前を編集できるdisplaynameが一番手っ取り早くわかりやすいので。今アクターを取得したときの並びはIDっぽいんです。IDは確か編集できないと思いましたのでdisplaynameを使用しています。IDだったらソートの必要ないです。
配列の規模(数でしょうか)せいぜい30個ぐらいです。実績で最高100くらいですが。
配列の長さ(文字列の長さですよんね?)一定ではありません。アルファベットだったり数字だったり、記号(せいぜいハイフンぐらい)だったり。どこにどれを使用するかはわかりません。なのであまり細かく制御はしないです。2バイトコードは使用しません。
以上、よろしくお願いします。
(紛らわしい言い方をしてしまいましたが、先程の配列の規模と長さは全く同じものです。)
配列の長さというのはいわばアクタの数と同じです。配列の最後のIndex+1と同じです。
これは配列の操作を一通りまとめた方の記事ですが
https://yutateno.hatenablog.jp/entry/2019/10/23/220619
この中のLengthが配列の長さです
(ここらへんを見慣れていない場合は一度目を通すことをお勧めします)。
私はdisplaynameよりも(Actor)Tagを使用することをお勧めします。
(こちらはパッケージ化もできます。)
ビューポートでアクタを選択した時の詳細パネルでtagで検索すると出てきます。そこでtagを編集できます。
(Actorの中の要素のTag(ComponentTag)はまた別なので注意してください。)
すいませんが、(gottuさんは少々複雑なnameを付けていましたが)
ここではやりやすさを考慮して仮にソートしたいアクタに一律の接頭文字と2桁の数字を順につける場合について書かせてもらいます。
Tags欄の+ボタンを押すと要素(エレメント)を追加できます。入力欄右の↓を押すと個別削除できます。(ゴミ箱アイコンは一括削除)
上の画像はBP_DashPlate0というアクタのtag欄です。
このアクタ群にBoost00、Boost01、Boost02…と順番にしたい順にビューポートからTagを付けることにします。
その後に上の画像のようにBPを組むことで、ソートされたオブジェクト参照の配列を作る(+ForEachLoop&PrintStringで確認する)ことができます。
(ちなみに画像の「Tagのインデックス番号」というのはGetの文字の左の入力欄にある0のことで、
先程入力したTag欄のインデックス番号を指しています。念のため。)
ただしこのBP処理をそのアクタ自身が行う場合は全アクタがこの処理を行わないよう、
↑のBPの手前に次のような条件を付けるといいでしょう。これで1アクタのみがこの処理を行います。
(これは私のやり方ですがもっと良いやり方があったらgottuさんに限らず教えていただけると助かります(;^ω^))
またアクタの配列のIndex番号を知りたい場合は以下のように組むと分かります。
単純なTagを使用して説明してきてしまいましたが、
以上を参考にご自身のプロジェクトで役に立てられそうでしょうか。
いろいろ考えていただきありがとうございます。
私が使用してる文字列には意味があり、CGで静止画を制作していまして。外観・内観などいろんな角度から見たカット番号とレンズといろいろ作成して、お客さんに見え方を確認してもらうための画像を作るときの工程でカメラにこの文字列をつけています。なのでいろんな文字列が出てきます。逆にあまり決めつけると作業しづらいことも出てきますのでこの程度の名前をつけることをルールとしています。またアルファベットを使用しないと数字だけではわかりづらいのです。なので少々複雑な名前になりますが、出来上がった画像がエクスプローラーで見たときにカメラの名前似ていれば近くにまとまっていてほしいのです。
すいません、こちらの運用のことを長く書いてしまいまして。ブループリントとは程遠くなってきてしまいました。
数字の大小はブループリントで判断できるのですが、文字(アルファベット)の大小の判断が出来なそうなのです。C++を使えば出来そうな感じもしていますが。
どうでしょうか。よろしくお願いします。
私はC++未学習者なので推測ですが、C++で文字コードを取得するかプラグインを使用するのが筋かなと思います。
ただ、前に紹介したString操作(Starts With、Split、RightChopなど)とランキング作成などの際に行う数字の小さい順に並べる処理で
(01の部分、001の部分、24mmの部分など)一区切りごとに少しずつソートし続ければBPで組めないこともないと思いますが、
(最初のアルファベットは以下のように手動でやるしかないのではと思います。
Gナンバーのものをソート完了して配列追加できたら、次のNaiナンバー処理を同様に…といった形で
ソート用変数を複数作っていって続けることになりそうな気がします。)
かなり長く面倒なものになりそうなので
そちらはご自身の努力でなんとかしてください
(追記)
Get Character as Numberというものを使うとアルファベットが数字になるようです。
お世話になってます。
いろいろ聞いていただいて、対応していただいてありがとうございました。
やっぱり出来なそうですね。
Get Character as Numberは読むのを流していました。これとランキング作成のお手本を使ってもうちょっと頑張ってみます。
ありがとうございました。またよろしくお願いします。
Get Character as Numberをつかって頑張って組んで希望するものができました。
ノードの種類を粘り強く探せばよかったです。教えてくれてありがとうございました。
自分も前見た時にこんなものあったかなという感じでしたが、
無事解決に辿り着かれたようで良かったです!
(解決しましたらGet Character as Numberの紹介の返信の「解決策」ボタンでも押していただけたら幸いです。)