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

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

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

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

Unity

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

配列

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

Q&A

解決済

1回答

589閲覧

配列の使い方がわかりません。

kand

総合スコア1

C#

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

Unity

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

配列

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

0グッド

0クリップ

投稿2021/06/03 02:57

編集2021/06/03 21:26

前提・実現したいこと

forを使ってPlayer型の配列
player[i].hp
等に数値(文字)を入れたいです。

配列を使わずに
player1.hp
とするとちゃんと数値(文字)が入るのですが、配列を使おうとするとNull Exceptionといわれてしまいます。
コンパイラは通るのですが、実際に動かしてボタンを押すとエラーが出ます。
どうすればいいのでしょうか。

発生している問題・エラーメッセージ

NullReferenceException: Object reference not set to an instance of an object

該当のソースコード

Unity(C#)

//問題個所のcs public class CharacterCreateButton : MonoBehaviour { [SerializeField] private Text text1; [SerializeField] private Text text2;      Player player1 = new Player(); public Player[] player = new Player[2]; public void CharaImport() { player1.hp = 32; //こちらはDebug.Logや下記のテキストフィールドを使用してちゃんと出力できます。 player[0].hp = 16; //←エラーが出ます。こちらの使い方を教えてください。          } void Start() { text1 = GameObject.Find("Player1").GetComponent<Text>(); text2 = GameObject.Find("Enemy1").GetComponent<Text>(); }
//Character.cs public abstract class Character { public string name; public int hp; public int atk; public int def; }
//Player.cs public class Player : Character { }

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/06/03 02:59

コードは ``` と ``` で囲ってください(``` はバッククォート 3 つ)。インデントされて見やすくなるので。
kand

2021/06/03 03:13

ご忠告有難うございます。 次回質問することになればそう致します。
Zuishin

2021/06/03 03:27

次回ではなく、この質問を編集してください。 他にも余計なものがたくさんついています。 なぜなら teratail の質問・回答は解決して終わりではなく、資料として残るからです。 むしろ解決してからの方が長く使われるので、きちんと整えてください。
guest

回答1

0

ベストアンサー

public Player[] player = new Player[2];

これでは配列の入れ物だけ生成されて、ナカミがはいってません
public Player[] player = new player[2]{ new Player(), new Player() };
ナカミもつくっときましょう

投稿2021/06/03 03:03

y_waiwai

総合スコア88042

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

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

kand

2021/06/03 03:13

おおお! ありがとうございます。できました! …ちなみに追加で恐縮ですが、これ配列の要素数が100個とかになったときはどう書けばいいのですか? 流石に100回new Player(),って書くわけじゃないと思うのですが…
y_waiwai

2021/06/03 03:18

ならどっか、最初に実行するところで、forででも100回回しましょう。 そのクラスのコンストラクタでやってやるといいですねー まあ、多くなるなら配列でするより、リストかなんかでしたほうが後での追加削除ができるから使いやすいですわな
neconekocat

2021/06/03 03:19

その場合は当然100回newしますよ。 大抵の人はLINQで処理すると思いますが。
kand

2021/06/03 03:20

なるほど。なんらかの方法で100回やることにはなるんですね。 プレイヤーならともかく、ゲームのアイテムとかはリストでやるほうが よいと。 ありがとうございました!
neconekocat

2021/06/03 03:29

中身入りで配列作るならこんな感じで書く事が多い気がする。 Player[] players = Enumerable.Rpeat(0, 100).Select(_ => new Player()).ToArray();
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問