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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

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

Unity

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

Q&A

解決済

2回答

4755閲覧

変数を同じクラス内で使い回したい

seri

総合スコア422

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

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

Unity

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

0グッド

0クリップ

投稿2016/03/11 22:56

編集2016/03/11 22:58

以下のようなスクリプトがあるとします
(Unityを使用、Debug.Logはprintと同じようなものと解釈してください)

//クラスやusingは質問内容と密接ではないので省略(下記は全て、同クラス内のものです) public Dictionary<int,GameObject> book; void Start(){ book=new Dictionary<int,GameObject>(){ {1,a}, {2,b}, {3,c}, } methodA(book); methodB(); } public void methodA(Dictionary<int,GameObject> book){ Debug.Log(book); } public void methodB(){ Debug.Log(book); }

この時、methodBのbookには値が入っていません。
このような配列を持った構造体を同じクラス内で使い回しするにはどのようにすればいいのでしょうか?

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

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

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

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

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

ozwk

2016/03/11 23:25

「入っていない」と確認したコードを下さい
seri

2016/03/11 23:33 編集

NullReferenceException: Object reference not set to an instance of an object Test.Astar (Vector2 goal) (at Assets/Script/Test.cs:76) こちらです、ちなみに、このエラーをはきだしたのは、質問と同じ、Debug.Log文です
ozwk

2016/03/11 23:36

いや、だからコードを下さい
seri

2016/03/11 23:37

まるまるですか?170行有りますよ?
seri

2016/03/11 23:37

using UnityEngine; using UnityEngine.UI; using System.Collections; using System.Collections.Generic; using System.Linq; public class Test : MonoBehaviour { public GameObject startpoint; public GameObject goalpoint; public GameObject iwa; public GameObject[] Kabe; public GameObject[] floor; public GameObject parent; public int tate=6; public int yoko=16; static Dictionary<Vector2,GameObject> book; public Vector3[] idou; public Dictionary<string,Vector3[]> booksearch; public Dictionary<int,GameObject> units; public bool resetflug=false; public Vector2 respos; void Awake () { } public void stageset(int[] map){ units=new Dictionary<int,GameObject>(){ {-2,startpoint}, {-1,goalpoint}, {0,floor[Random.Range(0,floor.Length)]}, {1,Kabe[Random.Range(0,Kabe.Length)]}, {2,iwa}, }; book=new Dictionary<Vector2,GameObject>(); int i=0; for(int y=-1; y<tate ;y++){ for(int x=-1; x<yoko+1; x++){ GameObject seisei=Instantiate(units[map[i]],new Vector3 (x*11f-40f,y*11f-40f,0f),Quaternion.identity)as GameObject; seisei.transform.parent=parent.transform; book.Add(new Vector2(x,y),seisei); i++; } } } public void SetEnem(GameObject unit,Vector2 goal){ //if(booksearch["unit.tag"]!=null){ // Vector3[] Set=booksearch[unit.tag]; //}else{ //ここにReset処理メソッドを追加☆☆ Astar(goal); //} } public Dictionary<Vector2,GameObject> search; public Dictionary<int,Vector2> HcostObjs; public int dx; public int dy; public Vector2 stpos; public Vector2 goalpos; public void Astar(Vector2 goal){ int Hcost; if(resetflug){ stpos=respos; resetflug=false; }else{ Debug.Log (book[new Vector2(1,1)]); stpos=book.First(x=>x.Value==GameObject.FindWithTag("Start")).Key; } if(goal==new Vector2(100,100)){ goalpos=book.First(x=>x.Value==GameObject.FindWithTag("Goal")).Key; }else{ //天然専用 goalpos=goal; } var dx=Mathf.Abs(goalpos.x-stpos.x); var dy=Mathf.Abs(goalpos.y-stpos.y); Hcost=(int)(dx+dy); if(book[new Vector2(stpos.x-1,stpos.y)]==units[0]){ if(!search.ContainsKey(new Vector2(stpos.x-1,stpos.y))){ dx=Mathf.Abs(goalpos.x-stpos.x-1); dy=Mathf.Abs(goalpos.y-stpos.y); Hcost=(int)(dx+dy); HcostObjs.Add(Hcost,new Vector2(stpos.x-1,stpos.y)); } }else{ int DiceRoll=Random.Range(0,1); if(DiceRoll==0){ if(book[new Vector2(stpos.x,stpos.y-1)]==units[0]){ if(!search.ContainsKey(new Vector2(stpos.x,stpos.y-1))){ dx=Mathf.Abs(goalpos.x-stpos.x); dy=Mathf.Abs(goalpos.y-stpos.y-1); Hcost=(int)(dx+dy); HcostObjs.Add (Hcost,new Vector2(stpos.x,stpos.y-1)); } }else{ if(book[new Vector2(stpos.x,stpos.y+1)]==units[0]){ if(!search.ContainsKey(new Vector2(stpos.x,stpos.y+1))){ dx=Mathf.Abs(goalpos.x-stpos.x); dy=Mathf.Abs(goalpos.y-stpos.y+1); Hcost=(int)(dx+dy); HcostObjs.Add (Hcost,new Vector2(stpos.x,stpos.y+1)); } }else if(book[new Vector2(stpos.x+1,stpos.y)]==units[0]){ if(!search.ContainsKey(new Vector2(stpos.x+1,stpos.y))){ dx=Mathf.Abs(goalpos.x-stpos.x+1); dy=Mathf.Abs(goalpos.y-stpos.y); Hcost=(int)(dx+dy); HcostObjs.Add(Hcost,new Vector2(stpos.x+1,stpos.y)); } }else{ // break; } } }else{ if(book[new Vector2(stpos.x,stpos.y+1)]==units[0]){ if(!search.ContainsKey(new Vector2(stpos.x,stpos.y+1))){ dx=Mathf.Abs(goalpos.x-stpos.x); dy=Mathf.Abs(goalpos.y-stpos.y+1); Hcost=(int)(dx+dy); HcostObjs.Add (Hcost,new Vector2(stpos.x,stpos.y+1)); } }else{ if(book[new Vector2(stpos.x,stpos.y-1)]==units[0]){ if(!search.ContainsKey(new Vector2(stpos.x,stpos.y-1))){ dx=Mathf.Abs(goalpos.x-stpos.x); dy=Mathf.Abs(goalpos.y-stpos.y-1); Hcost=(int)(dx+dy); HcostObjs.Add (Hcost,new Vector2(stpos.x,stpos.y-1)); } }else if(book[new Vector2(stpos.x+1,stpos.y)]==units[0]){ if(!search.ContainsKey(new Vector2(stpos.x+1,stpos.y))){ dx=Mathf.Abs(goalpos.x-stpos.x+1); dy=Mathf.Abs(goalpos.y-stpos.y); Hcost=(int)(dx+dy); HcostObjs.Add(Hcost,new Vector2(stpos.x+1,stpos.y)); } }else{ // break; } } } } Debug.Log (HcostObjs.Min()); //Vector2 min=HcostObjs.OrderBy(Function(n) n.Value).Last.Key; // min; // HcostObjs.Clear; } }
guest

回答2

0

ベストアンサー

こんにちは。

この時、methodBのbookには値が入っていません。
このような配列を持った構造体を同じクラス内で使い回しするにはどのようにすればいいのでしょうか?

提示されたコードでは落ちないはずです。
そのコードで再現しますか?


質問とは無関係ですが、インデントをつけましょう。
複雑になってくると、メソッドがどこまで続いているのが、見るのがたいへんです。

C#

1public Dictionary<int,GameObject> book; 2 3void Start(){ 4 book=new Dictionary<int,GameObject>(){ 5 {1,a}, 6 {2,b}, 7 {3,c}, 8 } 9 methodA(book); 10 methodB(); 11} 12 13public void methodA(Dictionary<int,GameObject> book){ 14 Debug.Log(book); 15} 16 17public void methodB(){ 18 Debug.Log(book); 19}

とと、ここまで書いているうちに、コードを補足されましたね。(できれば質問文にちゃんとインデントを付けた状態で記載頂けた方が手間が省けます。)
あまりに醜いので、見るべきでないような気もしましたが、興味があったので見てみました。
単純にstartpoint, goalpoint等にオブジェクトを入れていません。これらがnullのままです。

投稿2016/03/12 00:30

Chironian

総合スコア23272

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

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

seri

2016/03/12 00:47

回答ありがとうございます、そのstartpointやgoalpointはunityのInspector画面とゆうエディターから設定できるUnity独自のものでして、それらは、正常に動作しております。
Chironian

2016/03/12 05:28

であれば、ちょっと分かりません。 問題のDebug.Log()文にブレークを張って落ちる直前で止めて見ると、book内のどこかにnullが入っている筈です。それが見つかれば原因が見えてくると思います。 もしも、万が一、どこにもnullが入ってないのに落ちるのであれば、そのDebugライブラリのベンダー(Unity?)へ問い合わせるしかないと思います。
guest

0

startPoint,goalPointなどunitsに入っているものが尽くnullで、
(floor[],kabe[]の中身入ってますか?)
それをstatesetでbookに入れて、
それをAstarで参照しているのでエラー吐いてます。

質問文のコードだとStart()が呼ばれてさえいれば
methodB()でbookがnullになっていることはないです。


タグにCが入ってますが
C#とCは全くの別物です。


コードがものすごく汚いです。
読みづらいから文句を言っているわけではなく、
読みづらいコードは
バグを埋めやすく、見つけにくく、取り除きづらいです。

投稿2016/03/11 23:57

編集2016/03/12 00:57
ozwk

総合スコア13512

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

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

seri

2016/03/12 00:04

Astarに、仮に book=new Dictionary<int,Gameobject>() としても、そのbookはstagesetのbookとは違うものになってしまいます
seri

2016/03/12 00:44

コードを記述させておいて、質問文の返答に戻るのには何か理由があるのでしょうか、nullではなく、0が入るだけでしたね。 それと、もう一度コードを読んでいただくと解るかと思いますが、インスタンス化はしてあります
ozwk

2016/03/12 00:55

質問文のコードだと問題が再現しないので、 問題が起こっているコードを見ないと何も答えられないので、 コードを尋ねました。 で、質問文のコードでは問題が再現しないことを 一応言及しておこうと思った次第です。
seri

2016/03/12 00:58

ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問