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

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

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

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

Unity

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

Q&A

解決済

1回答

44321閲覧

ArgumentNullException: Value cannot be null. といコードエラーがでて対応を教えてください unity

doracyan

総合スコア6

C#

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

Unity

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

0グッド

0クリップ

投稿2020/02/19 03:34

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)unity とc#をつかって下記のコードを書きました。
やりたいことはprocessedfileという配列にunity Resources内の既存のfile名を格納
Unity Resources内に新たにimportしたfile名とprocessedfile内のfileが一致したか、してないかで条件作成
条件があてはまらなければprefab作成といものを考えています

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

ArgumentNullException: Value cannot be null. Parameter name: array System.Array.IndexOf[T] (T[] array, T value) (at <437ba245d8404784b9fbab9b439ac908>:0) getfish.Update () (at Assets/getfish.cs:39)

該当のソースコード

c#

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6using System; 7using System.IO; 8using System.Threading; 9 10public class getfish : MonoBehaviour 11{ 12 13 public static String[] processedFiles; 14 15 16 // Start is called before the first frame update 17 static void Main(string[] args) 18 { 19 processedFiles = new String[1]; //動的に配列のサイズを変えるので最初は配列の数を1個で作成。 20 Console.WriteLine(processedFiles.Length); 21 22 } 23 24 // Update is called once per frame 25 void Update() 26 { 27 IEnumerable<string> files = 28 System.IO.Directory.EnumerateFiles( 29 @"C:\Users\pokem\aquarium\Assets\Resources", "*", System.IO.SearchOption.AllDirectories); 30 31 32 33 34 foreach (string f in files) 35 { 36 //ファイル名を取得 37 string str = Path.GetFileName(f); 38 39 //処理済み一覧に一致するファイル名があるかどうかチェック 40 int i = Array.IndexOf(processedFiles, str); 41 Console.WriteLine("0以上なら配列に同じファイルが存在する " + i); 42 43 //配列に一致するファイル名があれば、このファイルの処理を飛ばす 44 if (i > -1) 45 { 46 Console.WriteLine("continueしました"); 47 48 continue;//次のファイルの処理へ移る 49 } 50 51 GameObject obj = (GameObject)Resources.Load("Quad"); 52 53 Quaternion rote = Quaternion.Euler(0.0f, 45.0f, 90.0f); 54 55 GameObject instance = (GameObject)Instantiate(obj, 56 new Vector3(5.0f, 5.0f, 5.0f), Quaternion.identity); 57 58 var rend = instance.GetComponent<Renderer>(); 59 rend.material.mainTexture = Resources.Load(str) as Texture; 60 61 62 getfish.processedFiles[getfish.processedFiles.Length - 1] = str; 63 Console.WriteLine(getfish.processedFiles[getfish.processedFiles.Length - 1]); 64 65 //次回の配列操作処理に備えて配列のサイズを1つ大きくしておく 66 Array.Resize(ref processedFiles, processedFiles.Length + 1); 67 68 Console.WriteLine("processedFiles[]配列の数" + processedFiles.Length); 69 for (int count = 0; count < processedFiles.Length; count++) 70 { 71 Console.WriteLine("processedFiles[]配列リスト" + processedFiles[count]); 72 73 } 74 75 76 77 } 78 } 79} 80ースコード

試したこと

ここに問題に対して試したことを記載してください。

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

Main()を呼び出す前に、Update()を実行されたのが原因でしょう。
(Main()でprocessedFilesを初期化しているので、Update()の前に呼び出さないとエラーになる)
引数使ってないですし、staticである必要性も感じられないので、普通にStart()かAwake()で初期化するのがよろしいかと思います。

あと、「Main()は実行開始時に呼ばれる」と思っているのであれば、それは(少なくともUnityでは)間違いです。
Main()と同様のものはUnityのエンジンの中にすでに存在しているので、Main()を追加で用意することは出来ないようになっております。


質問とは関係ないですが、気になった点を挙げます。

  • わざわざ配列の長さを毎回変えるのであれば、Listを使ったほうが楽だと思います。
  • processedFilesがstaticになっていますが、単に「staticにしろ」というエラーで変えたのであれば、staticが無い状態に戻したほうがよろしいかと思います。
    staticは「全てのインスタンスから共有して使う」というものなので、知識のない状態で使うと予期せぬバグの原因となります。
    staticでない関数から使う場合は、「staticにしろ」というエラーは出ないので、そのようにしてください。

投稿2020/02/19 03:49

編集2020/02/19 04:14
fiveHundred

総合スコア9774

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

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

doracyan

2020/02/19 04:41

ありがとうございます! void Main(string[] args)のところをvoid Start(string[] args) にかきかえてみました。結果がArgumentNullException: Value cannot be null. Parameter name: array System.Array.IndexOf[T] (T[] array, T value) (at <437ba245d8404784b9fbab9b439ac908>:0) getfish.Update () (at Assets/getfish.cs:39) になってしまうのですが、私の訂正の仕方に問題があるのでしょうか。
fiveHundred

2020/02/19 04:43

Start()に引数はありません。
doracyan

2020/02/19 04:47

できました!勉強不足ですみません。ありがとうございます!
doracyan

2020/02/19 04:54

すみません GameObject instance = (GameObject)Instantiate(obj, new Vector3(5.0f, 5.0f, 5.0f), Quaternion.identity); var rend = instance.GetComponent<Renderer>(); rend.material.mainTexture = Resources.Load(str) as Texture; というコードでResourcesにいれたPNG画像をはりつけたいのですが、実行しても張り付いていなく 無地のQuadだけがUNITYにでています。この原因はなんでしょうか。
doracyan

2020/02/19 04:56

GameObject obj = (GameObject)Resources.Load("Quad"); Quaternion rote = Quaternion.Euler(0.0f, 45.0f, 90.0f); GameObject instance = (GameObject)Instantiate(obj, new Vector3(5.0f, 5.0f, 5.0f), Quaternion.identity); var rend = instance.GetComponent<Renderer>(); rend.material.mainTexture = Resources.Load(str) as Texture; というコードでResourcesにいれたQuadを生成。そこにResourcesにimportされたPNG画像をはりつけたいのですが、実行しても張り付いていなく 無地のQuadだけがUNITY画面上にでています。この原因はなんでしょうか。
fiveHundred

2020/02/19 07:18

ここでは「ベストアンサーを決める」=「解決した」ということになりますので、一度ベストアンサーを決めた質問に追加で質問するのは、やめたほうがいいです。 質問内容も変わっておりますので、新しく質問を立てたほうがよろしいかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問