Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。コピー2017.10.28今回はC#での文字列操作をしてみようと思います。Unityでゲームを作る時にも文字列を操作する事は多々ありますね。RPGゲーム内で資料を見る事が出来たとしたら、その資料内からある文字列を使って文書を検索出来る機能を取り付けたり、タイピングソフトで「ちゃ」の入力を練習したい時に、問題の中に「ちゃ」を含む文字列を問題を抽出して出題したり、ただ単に変数に入れた文字列に別の文字列を連結してテキストフィールドに表示したりといった時です。今回のサンプルもUnity付属のMonoDevelopを使用して確認します。"テスト";という風にstringを付けて宣言します。string型の変数は参照型の変数になります。文字列を一旦インスタンス化するとその値は変更されません。stringValue2;とした場合最初に作成したstringValue1のインスタンスは破棄され新しく作成されることになります。その為、文字列の連結をする毎にインスタンス化をする事になる為、大量の文字列を扱う時はStringBuilder等を使って操作します。これに関しては後でやります。それではいくつか文字列の操作を見ていきましょう。サンプル用に二つの文字列を作成しておきます。"aiueo,kakikukeko,sashisuseso,tachituteto,kakikukeko,sashisuseso";インスタンスメソッドまずはインスタンスメソッドの操作関連を見ていきます。文字列の連結は+演算子を使ってする事が出来ます。ContainsメソッドContainsメソッドを使うと、その文字列を含んでいるかどうかがわかります。("さしすせそ"));↑の例ではtrueが表示されます。LengthメソッドLengthメソッドを使うと文字列の長さを返します。Debug.Log(stringValue1.Length);123Debug.Log(stringValue1.Length);↑の例では35が表示されます。IndexOfメソッドIndexOfメソッドは文字列が最初に見つかった位置を返します。("さしすせそ"));↑の例では12が表示されます。LastIndexOfメソッドLastIndexOfメソッドは文字列が最後に見つかった位置を返します。("さしすせそ"));↑の例では30が表示されます。InsertメソッドInsertメソッドを使うと文字列中に文字列を挿入する事が出来ます。PadLeftメソッドPadLeftメソッドを使うと文字列を右寄せし、指定した文字数に足らない部分に空白を入れます。12345となります(Unityのコンソールで確認してください)。PadRightメソッドPadRightメソッドを使うと文字列を左寄せし、指定した文字数に足らない部分に空白を入れます。なります(Unityのコンソールで確認してください)。RemoveメソッドRemoveメソッドを使うとインデックスで指定した位置から指定した文字数分を削除します。6));↑の例では「さしすせそ」が最初に見つかった位置から6文字文を削除します。StartsWithメソッドStartsWithメソッドを使うと文字列が指定した文字列で始まるかどうかを調べる事が出来ます。("あいうえお"));↑の例ではTrueが表示されます。EndsWithメソッドEndsWithメソッドを使用すると文字列が指定した文字列で終わるかどうかを調べる事が出来ます。("さしすせそ"));↑の例ではTrueが表示されます。ReplaceメソッドReplaceメソッドを使うと文字列を書き換える事が出来ます。SplitメソッドSplitメソッドを使用すると文字列を分割文字を使って配列を作成する事が出来ます。要素を持つstringArrayが作成されます。ToUpperメソッドToUpperメソッドを使用すると文字列を大文字にする事が出来ます。ToLowerメソッドToLowerメソッドを使用すると文字列を小文字にする事が出来ます。SubStringメソッドSubStringメソッドは第1引数で指定したインデックス値から第2引数で指定した文字数分を取得出来ます。Trim、TrimStart、TrimEndTrimを使うと文字列の前後、TrimStartは前、TrimEndは後にある空白文字を削除します。());クラスメソッドクラスメソッドを使った文字列の処理を見ていきます。CompareメソッドCompareメソッドを使用すると文字列が同一かどうかを判定する事が出来ます。同一であると判定されれば0が返ります。第3引数でCultureInfo、第4引数で比較オプションを指定出来ます。文字列の比較、ひらがなとカタカナを同一と見なす。文字列の比較、ひらがなとカタカナを同一と見なす。CompareOptions.IgnoreSymbols));↑の例では最初はひらがなとカタカナの比較でも同一と判定出来るようにし、次のCompareでは全角と半角を無視、空白や記号等を無視して同一と判定出来るようにしています。結果は両方0が表示されます。FormatメソッドFormatメソッドを使用すると文字列をフォーマットして返す事が出来ます。(formatString);第1引数では”の中にフォーマットを記述し、{}の中の数字と第2引数以降の数字が対応します。第2文字列はaiueo,kakikukeko,sashisuseso,tachituteto,kakikukeko,sashisusesoが表示されます。IsNullOrEmptyメソッドIsNullOrEmptyメソッドを使うとその文字列がNullまたは空文字でないか判定する事が出来ます。ConcatメソッドConcatメソッドを使用すると文字列を連結する事が出来ます。JoinメソッドJoinメソッドを使用すると配列を分割文字で繋げて文字列を作成する事が出来ます。stringArray2);Debug.Log(stringValue3);↑の例では分割文字に空文字を指定してstringArray2配列の要素を連結し、文字列を作成しています。test1test2test3が表示されます。ここまでのサンプルここまでのサンプルを載せておきます。文字列の比較、ひらがなとカタカナを同一と見なす。文字列の比較、ひらがなとカタカナを同一と見なす。stringArray2);Debug.Log(stringValue3);}}長い文章内の文字列の書き換え、削除、検索サンプル文字列操作メソッドを使った長い文章内の文字列の書き換えと、指定した文字列の削除、指定したキーワードが見つかった場所から数文字を表示するサンプルを作成してみます。"おはようございます。今日も良いお天気でよかったですね。"一昨日は雨で3000歩しか歩けませんでした。"昨日は、散歩中に犬に追いかけられるという不運にも見舞われながらも、一日6000歩を達成する事が出来ました。"今日は少し頑張って8000歩を目指しつつ、無理をしないように歩けたらいいなと思います。"おはようございます。今日も良いお天気でよかったですね。+"一昨日は雨で3000歩しか歩けませんでした。+"昨日は、散歩中に犬に追いかけられるという不運にも見舞われながらも、一日6000歩を達成する事が出来ました。+"今日は少し頑張って8000歩を目指しつつ、無理をしないように歩けたらいいなと思います。(item);}}}sampleStringには初期の文章を入れておきます。この文章の中で「今日」という文字列を「明日」という文字列に書き換えます。Replaceメソッドを使えば文章中にある「今日」という文字列を全て「明日」に簡単に変更出来ます。Replaceメソッドの戻り値は書き換えた後の文字列が返って来るので、それをresultStringに入れ直す事で書き換えた文字列が入ります。文章中から指定した文字列を削除するのも簡単で、まずは検索する文字列のインデックス値をIndexOfメソッドで調べます。Removeメソッドを使用してインデックス値(index1)から検索した文字列の長さ分を削除し、それをresultStringに入れ直します。whileループを使ってresultString内に検索文字列が存在している間は繰り返します。ここでまちがってsampleStringを指定してしまうと、みなさん大好き無限ループが待っています(謎)。最後が検索した文字列で始まる場所から数文字を取りだし、それを出力する処理です。検索文字列で見つかった場所のインデックス値(index2)をindex2の位置から調べます(-1が返ってきたら検索出来なかった時)。whileの条件式がちょっと複雑になっていますが、これは文章中で一旦検索した後の位置から次の検索をしたい為の処理です。index2は最初は0に設定しているので、文章の最初から検索します。検索した文字列が2の位置であれば、条件式内でindex2に2が入ります。その後Substringメソッドを使ってindex2の位置からtakeNumの文字数分を取りだしリストに登録します。その後index2にtakeNumの値を足し、検索した文字列の最後の位置にインデックス値を移動させます。「今日は昨日の明日、今日は一昨日の明後日」という文章中から「今日」という検索文字列を指定し実行すると最初はindex2が0で検索し、見つかるのが最初なのでwhile条件式でindex2に0が入ります。takeNumを5(5文字取りだす)としていた場合はSubstringを使って「今日」を含む5文字である「今日は昨日」という文字列がリストに登録されます。takeNum;で、index2が5になります。その為whileの条件式に戻った時は「今日は昨日」の後の「の」から検索文字列の「今日」を探すことになります。次に今日が見つかるのは、index2が9の時です。そこからtakeNumの5文字文を取りだし、「今日は一昨」という文字列がリストに登録されます。このスクリプトは文章中に「今日今日」と並んでいた場合2回目の今日は最初の検索で引っかかった後に、takeNumが5なのでインデックスを進めてしまい無視されてしまう事になります。StringBuilderクラスを使う最初の方で言及しましたが、string型の変数は文字列を連結する毎に毎回新しいインスタンスを生成しています。"1";↑の例では3回インスタンス化が行われています。これだと文字列操作が大量になると、それだけインスタンス化処理が多くなる為、処理が遅くなります。文字列操作を多くする場合はStringBuilderクラスをインスタンス化し利用した方が処理が早くなります。stringBuilder.ToString();StringBuilderはAppendメソッドを使って文字列を追記する事が出来ます。InsertやRemove、Replaceといったメソッドも用意されているので、通常の文字列と同じように操作する事が出来ます。操作を加えたものを文字列に変換するにはToStringメソッドを使用します。試しに大量の文字列を+演算子とStringBuilderを使った処理で計測してみましょう。startTime));}}String.Emptyで空文字を入れる事が出来ます(””でも同じです)。loopNumでループ回数を指定し、+演算子とStringBuilderそれぞれを使って文字列を連結していきます。Time.realtimeSinceStartupはUnityのクラスでゲーム開始からのリアルタイムを取得出来ます。試しにloopNumを100にしてそれぞれの実行時間を計測してみます。+演算子は0.0002872944秒StringBuilderは0.0001244545秒と若干StringBuilderが速いですね。次はloopNumを10000にして実行してみます。+演算子は2.371711秒StringBuilderは0.01119804秒となりました。+演算子は10000回文字列を足すと2秒以上かかってますが、StringBuilderを使うと0.01秒ぐらいで終わってますね。大量に文字列操作をする時はStringBuilderを使った方が良い事がわかりました。コピーかめくめちゃんをフォローする7Unityを使った3Dゲームの作り方(かめくめ)Unityを使った3Dゲームの作り方(かめくめ)関連記事UnityでC#の勉強C#のDictionaryを使ってみるC#のDictionaryをUnity付属のMonoDevelopで使ってみます。UnityでC#の勉強C#でデリゲートとラムダ式を使ってみるC#のデリゲートとラムダ式をUnity付属のMonoDevelopで使用してみます。UnityでC#の勉強C#でフォルダ、ファイルの作成、移動、削除をするC#でDirectoryクラス、Fileクラスを使用してフォルダ、ファイルの作成、移動、削除を行ってみます。サンプルはUnity付属のMonoDevelopを使って作成し実行していきます。UnityでC#の勉強C#で正規表現を使って文字列処理をするC#で正規表現を使って文字列処理をする勉強をしていきます。UnityでC#の勉強C#のクラス、フィールド、メソッド、コンストラクタ、プロパティの作成C#のクラスの作成やフィールド、メソッド、コンストラクタ、プロパティについて記述しました。UnityでC#の勉強C#のQueueを使ってみるUnity付属のMonoDevelopを使ってC#のQueueを勉強していきます。C#で継承を使ってみるブログの記事数が300記事に到達!ホームUnityでC#の勉強スポンサーリンクサイト内検索が出来ますプロフィール管理人のかめくめちゃんです。(-_-)メールはこちらにお願いします(記事に関する質問は送らないでください、返信は期待しないでください(._.))。kamekumechan@gmail.comいずれはSIRENやバイオハザードみたいなアクションゲームを作りたいと思っています。ゲームシナリオが書けないので面白いゲームはなかなか作れません・・・・。(^_^;)名前の由来はカメが好きだからです。プロフィールになってないな・・・・(-.-)Unityをこれから始める人へこれからUnityを使ってみようという方はUnityを使った3Dゲームの作り方(かめくめ)の歩き方Unityを使った3Dゲームの作り方(かめくめ)で、はじめてUnityの学習をする時の当ブログの記事を読む順番を書きました。機能を積み上げていく形になるので便利かも?gametukurikata.com2019.06.21の記事に記載の順番で見て頂くとUnityの基本的な使い方がわかり、簡単なアクションゲームや、TPSゲームの作成までが出来ます。自作タイピングゲームタイピングゲームを作りました。WebGL形式なのでPCのブラウザで遊べます。以下からプレイ出来ます。FinalTypingUnityを使って作成したローマ字入力のタイピングゲームです。gametukurikata.com2022.01.02お知らせ2023/01/24個人的にUnity2022.2.3f1をインストールしました。2022/10/14UnityのIKを使って足の位置と角度を地面に合わせる機能Unityのゲームでキャラクターの両足が別の高さの地面の上にある時にそれぞれの足をそれぞれの地面につけるようにする機能を作成しますgametukurikata.com2016.04.11機能を少し修正しました。2020/09/19コメント欄は閉鎖しました。今までコメントを投稿してくださった方はありがとうございました。(^^)/2018/08/07わたくしに出来る事は既に記事にしてあるので、ブログ右上の検索窓を活用してください。(._.)またブログの最初の方の機能を積み上げていく記事に関しての疑問点は当ブログ記事のスクリプトの説明と寄せられた質問への回答Unityを使った3Dゲームの作り方(かめくめ)の機能積み上げ形式の記事のスクリプトの説明と寄せられた記事の機能についての質問への回答を掲載しています。gametukurikata.com2019.08.01Unityを使い始めたばかりの人がつまづきやすい点を解消するUnityを使い始めたばかりの人が結構な確率で陥る不具合や疑問点を解消していきます。基本的にはブログに寄せられた質問への回答という感じです。gametukurikata.com2018.12.04も参照してみてください。小・中学生によるデジタルコンテンツ開発の全国大会ですuycc.unity3d.jp2022年大会の先行エントリーが開始されているようです。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。記事の内容に質問がある方へUnityを使った3Dゲームの作り方(かめくめ)の歩き方UnityのJavaScriptとC#を読み替えてどちらでも対応出来るようにするホーム検索トップサイドバータイトルとURLをコピーしました。