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

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

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

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

626閲覧

stringに格納されている文字列をfor()構文等を使って短いスクリプトで配列に代入したい

shintenko

総合スコア31

C#

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/03/01 02:00

stringに格納されている文字列をfor()構文等を使って短いスクリプトで配列に代入したい

配列に名前を代入して外部スクリプトでもその値を使用できるようにしたいスクリプトとなっております。
こちらのスクリプト動くには動きますが、保守の面から簡易化したいと思っております。
エラーを見るに配列に変数は入らないと言われている模様です。
ご教授いただければ幸いです。よろしくお願い致します。。。

スクリプト概要

using System.Collections; using System.Collections.Generic; using UnityEngine; public class AvatarSaver : MonoBehaviour { //どこで使ってもこの値は変わらないconst private const int partsNum = (int)SkinnedMeshCombiner.MAIN_PARTS.MAX; //各部位の素材 //[SerializeField] private string rootBoneFileName = null; private string FileName1 = "chara_001_avs"; private string FileName2 = "chara_001_head"; private string FileName3 = "chara_001_body"; private string FileName4 = "chara_001_arm"; private string FileName5 = "chara_001_leg"; private ResourceRequest[] resourceReqs = new ResourceRequest[partsNum]; private GameObject player = null; //キャラアセンブルデータ保存用配列 private static string[] assembleData = new string[partsNum]; //ゲーム自体に反映 public static string[] AssembleGlobalData(){ return assembleData; } // Start is called before the first frame update void Start() { assembleData [0] = FileName1; assembleData [1] = FileName2; assembleData [2] = FileName3; assembleData [3] = FileName4; assembleData [4] = FileName5; for (var i = 0; i < partsNum; i++) { //Debug.Log (assembleData [i]); } } // Update is called once per frame void Update() { } }

行いたい処理方法

void Start() { for (var i = 0; i < partsNum; i++) {    //↓ここの正しい書き方が分かりません。 assembleData [i] = FileName + i.ToString(); } }

試したこと

「行いたい処理方法の右側」を各種intやstringに変更して書き直しましたが、
上手くいきませんでした。この方法が正しいのかどうかもわかりません。
基本的な事をお聞きして申し訳ございません。
よろしくお願い致します。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

YAmaGNZ

2020/03/01 02:26

"chara_001_avs"や"chara_001_head"等の数字の部分を加算していきき "chara_002_avs"や"chara_002_head"等にしたいということですか?
shintenko

2020/03/01 02:39

ご質問ありがとうございます。 "chara_001_avs"や"chara_001_head"等の名前はサーバ等から値を取得したものと想定しております。 申し訳ございません。このスクリプト上では名前の変更をしたいという事ではございません。。。 各stringに格納された名前を配列に代入して使用する所の簡易的な記述方法がしりたいと言った所でございます。。。 お手数をお掛け致します。よろしくお願い致します。
YAmaGNZ

2020/03/01 02:45

サンプルとして変数名がFileName1ということになっていますが、これに格納される値はサーバから何らかの形で取得するということですか? そうなのであれば、取得部分にて直接配列にするなど考えたりしたほうがいいのではないでしょうか?
shintenko

2020/03/01 04:17

おっしゃる通り外部から持ってくるハズの値を配列にしていないのは間違いでした。。。 解決致しましたのでご報告させて頂きます。。。ありがとうございました!
guest

回答2

0

以下のような書き方でどうでしょうか。

C#

1private static readonly string[] FileNames = new string[] 2{ 3 "chara_001_avs", 4 "chara_001_head", 5 "chara_001_body", 6 "chara_001_arm", 7 "chara_001_leg", 8};

C#

1for (int i = 0; i < FileNames.Length; i++) 2{ 3 assembleData[i] = FileNames[i]; 4}

配列をpublicにする場合は以下の書き方になります。
ただ、変数のときと比較して、配列の名前に統一されてしまうのでソースコードを読む際の情報量が減ってしまいます。
管理する変数がそこまで多くないときは、無理に配列化しないのも一つの手だと思います。

C#

1public string[] FileNames; /// インスペクターから値を設定する

こちらは変化なしです。

C#

1for (int i = 0; i < FileNames.Length; i++) 2{ 3 assembleData[i] = FileNames[i]; 4}

投稿2020/03/01 02:08

編集2020/03/01 02:59
kawa0x0A

総合スコア271

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

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

shintenko

2020/03/01 02:23

ご回答ありがとうございます。無事簡易化する事ができました! ちなみに、 public string avsFileName = "chara_001_avs"; public string headFileName = "chara_001_head"; public string bodyFileName = "chara_001_body"; public string armFileName = "chara_001_arm"; public string legFileName = "chara_001_leg"; と外部から値が変わる変数の場合どうなるでしょうか… 何卒宜しくお願い致します。
kawa0x0A

2020/03/01 03:00

回答に追記したので確認してみてください
shintenko

2020/03/01 04:14

回答して頂いた通り、配列にして制御を行うのが正解でした。。。 解決致しましたのでご報告させて頂きます。。。ありがとうございました!
guest

0

自己解決

前提としてYAmaGNZさんのおっしゃる通り、
配列にStringを代入するそもそもの部分が行いたい実装と違っていたのでこちら配列に変更致しました。
こちら大量のプレハブオブジェクトの名前を外部から持ってくる想定です。ご助言ありがとうございます。

private string[] FileNameAvs = new string[]{ "chara_001_avs" }; private string[] FileNameHead = new string[]{ "chara_001_head" }; private string[] FileNameBody = new string[]{ "chara_001_body" }; private string[] FileNameArm = new string[]{ "chara_001_arm" }; private string[] FileNameLeg = new string[]{ "chara_001_leg" };

また、実装の部分に関しては、kawa0x0Aさんが回答として出して頂いた通り、
どうにか配列にして値を代入してするのが解だとわかりましたので、

void Start() { string[][] FileData = new string[][]{FileNameAvs,FileNameHead,FileNameBody,FileNameArm,FileNameLeg}; for (var i = 0; i < partsNum; i++) { assembleData[i] = FileData[i][0]; } }

上記の通り配列に配列を追加する方向で修正致しました。
FileData[i][0];の[0]の部分で持ってくるパーツを指定できるようにしたいと思っております。
YAmaGNZさんkawa0x0Aさんありがとうございました。

投稿2020/03/01 04:10

shintenko

総合スコア31

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問