teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

サンプルコードをより適切なもので追記

2020/04/19 07:29

投稿

dodox86
dodox86

スコア9416

answer CHANGED
@@ -1,3 +1,6 @@
1
+ ---
2
+ **※以下の回答は足りないものがありましたので追記しました。下方の追記部分もご覧ください。**
3
+
1
4
  私自身の都合で今現在Unityをインストールしてなく、Unity用のコードではないので恐縮ですが、`for`文で希望の人数`Max`?人分の`Name`、`HP`フィールドを初期化したいのですよね。
2
5
  恐らく以下のようなことがやりたいのではないかと思いました。(Visual Studio 2019 のC#コンソールアプリケーションです)
3
6
 
@@ -48,4 +51,123 @@
48
51
  > データベースもどきを改造するのが私では難しすぎるならば、諦めることも含めてご助言いただけると嬉しいです。
49
52
 
50
53
  諦めることなんて無いと思います。既存のものから改造、改良していくのは、正しいひとつのやり方です。
51
- ただ、基本的な文法はちゃんと理解されることを強くお勧めします。そうでないと理解に無駄な時間を過ごしてしまいます。
54
+ ただ、基本的な文法はちゃんと理解されることを強くお勧めします。そうでないと理解に無駄な時間を過ごしてしまいます。
55
+
56
+ ---
57
+ **追記しました: 2020-04-19: 16:28**
58
+
59
+ 先の私の回答は「質問者さん提示のC#コードでは、フィールドの初期化のコードが間違っている」との指摘のみだったので、私のサンプルのコードも最終的にやりたい
60
+ こととしては恐らく不適切なものでした。ご要望に沿ったかたちでUnityで実装してみましたので、ひとつの案としてご紹介します。
61
+
62
+ そもそも要望としてはキャラクター1つに対して以下のような管理をしたいということなので、
63
+ ```
64
+ ▼Chara1
65
+ キャラクター1の名前
66
+ キャラクター1のHPの数値
67
+ ▼Chara2
68
+ キャラクター2の名前
69
+ キャラクター2のHPの数値
70
+ ...
71
+ ```
72
+
73
+ まず、名前とヒットポイント(HP)をもつキャラクターを表すクラス`Character`を作成します。
74
+ ```C#
75
+ // Character.cs
76
+ // 名前とヒットポイント(HP)をもつキャラクターのクラス
77
+ public class Character
78
+ {
79
+ // ※プロパティの方が良いが、簡単にする為、単なるフィールドで。
80
+ public string Name = string.Empty;
81
+
82
+ public int HP = 0;
83
+ }
84
+ ```
85
+
86
+ 次に、`Character`クラスを配列で管理する`CharacterList`を作成します。これがデータベースのコンポーネント本体です。`Database`オブジェクトにアタッチします。
87
+ ※実際には配列は、`List`クラスを使った方が扱いやすいかもしれません。
88
+ ```C#
89
+ using UnityEngine;
90
+
91
+ // Databaseオブジェクトで使うCharacterListコンポーネント
92
+ // Characterクラスを配列/リストで管理する
93
+ public class CharacterList : MonoBehaviour
94
+ {
95
+ // publicフィールドにしたので[SerializeField]属性は不要(?)
96
+ // https://docs.unity3d.com/jp/460/ScriptReference/SerializeField.html
97
+ //[SerializeField]
98
+ public int Max = 5;
99
+
100
+ //[SerializeField]
101
+ public Character[] Characters;
102
+
103
+ public void Initialize()
104
+ {
105
+ Debug.Log("CharacterList.Initialize()");
106
+
107
+ Characters = new Character[Max];
108
+ for (int i = 1; i <= Max; i++)
109
+ {
110
+ // "Name1", "Name2", ...の名前を生成
111
+ Character character = new Character();
112
+ character.Name = string.Format("Name{0}", i);
113
+ }
114
+ }
115
+
116
+ void Start()
117
+ {
118
+ Debug.Log("CharacterList.Start():");
119
+ }
120
+ }
121
+
122
+ ```
123
+
124
+ で、ゲーム(?)の本体で`Database`オブジェクトを`targetObject`として参照し、`CharacterList`クラスであるコンポーネントを呼び出します。
125
+ ```C#
126
+ using System.Collections;
127
+ using System.Collections.Generic;
128
+ using UnityEngine;
129
+
130
+ public class Runner : MonoBehaviour
131
+ {
132
+ public GameObject targetObject;
133
+
134
+ // Start is called before the first frame update
135
+ void Start()
136
+ {
137
+ Debug.Log("Runner.Start(): started.");
138
+
139
+ // "Database"オブジェクトを探す
140
+ targetObject = GameObject.Find("Database");
141
+ if (targetObject == null)
142
+ {
143
+ // Databaseオブジェクトが見つからない
144
+ Debug.Log("Runner.Start(): unable to find Database");
145
+ return;
146
+ }
147
+
148
+ // "CharacterList"コンポーネントを取得
149
+ CharacterList list = targetObject.GetComponent<CharacterList>();
150
+ if (list == null)
151
+ {
152
+ // Databaseオブジェクト中のCharacterListコンポーネントが見つからない
153
+ return;
154
+ }
155
+
156
+ // Databaseオブジェクト、CharacterListの初期化
157
+ list.Initialize();
158
+
159
+ Debug.Log("Runner.Start(): done.");
160
+ }
161
+
162
+ // Update is called once per frame
163
+ void Update()
164
+ {
165
+
166
+ }
167
+ }
168
+ ```
169
+ Unityエディターの状況です。
170
+ ![イメージ説明](4cb323906162bfe9cc94c26de140c6ea.png)
171
+
172
+ 最終的に質問者さんがやりたいことに合致しているか分かりませんが、恐らくこんな感じになるのではなかろうか、と。(C#のコードはあえて冗長な書き方にしました)
173
+ 上記回答では納得できないかもしれませんし、Unityに詳しい他の回答者さんに私より適切な回答をいただけるかもしれません。しばらく質問を閉じずにいても良いかと思います。