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

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

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

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

Unity

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

Q&A

解決済

2回答

1608閲覧

値を更新したいです。

h212s228

総合スコア2

C#

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

Unity

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

0グッド

0クリップ

投稿2020/11/03 06:19

ローグライクゲームを作成しています。マップをn等分する線の位置を決めるメソッドで、引数はマップの最小値、最大値、n等分する線の位置を格納する配列です。
2回目に if (pointMin < pointMax) の部分が処理されるとき、pointMaxもしくはpointMinが更新された状態で、処理してほしいのですが、更新されていない状態で処理してしまいます。値渡し?では、値を更新できないことを知ったのですが、対処法がわかりません。どうすれば2回目に if (pointMin < pointMax) の部分を更新した状態で処理できるのでしょうか。参考になるサイトなどがあれば教えていただけると幸いです。

C#

1 void GetSplitPoint(int min, int max, int[] stack_Pos) { 2 3 // 分割する開始位置を作成する 4 // 部屋の区画を最低4マス確報するための定数 5 const int MIN_POS = 5; 6 const int WALL_POS = 5; 7 const int LAST_INDEX = -1; 8 9 int splitNum = 0; 10 int index = 0; 11 int pointMin = min; 12 int pointMax = max; 13 int calcMin = min; 14 int calcMax = max; 15 16 // ここが元に戻る 17 if (pointMin < pointMax) { 18 splitNum = Random.Range(calcMin, calcMax); 19 calcMin = splitNum - pointMin; 20 calcMax = pointMax - splitNum; 21 22 if (calcMax > calcMin) { 23 stack_Pos[index] = splitNum; 24 pointMin = splitNum + MIN_POS; 25 index++; 26 } else { 27 stack_Pos[index] = splitNum; 28 pointMax = splitNum - WALL_POS; 29 index++; 30 } 31 } 32 stack_Pos[index] = LAST_INDEX; 33 }

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

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

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

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

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

guest

回答2

0

ベストアンサー

pointMaxもしくはpointMinが更新された状態で、処理してほしいのですが、

メソッドの引数としてrefを使えばよいです。ポイントを絞り、void GetSplitPoint(int min, int max, int[] stack_Pos)を変えてそれぞれの変数を更新するだけのものにした例です。

C#

1// void GetSplitPoint(int min, int max, int[] stack_Pos) 2void GetSplitPoint(ref int pointMin, ref int pointMax) 3{ 4 // それぞれ +2する 5 pointMin += 2; 6 pointMax += 2; 7}

これを以下のようなテストコードで実行してみると

C#

1 // 初期値 2 int min = 1; 3 int max = 2; 4 5 System.Diagnostics.Debug.WriteLine($"0: min={min}, max={max}"); 6 7 GetSplitPoint(ref min, ref max); 8 System.Diagnostics.Debug.WriteLine($"1: min={min}, max={max}"); 9 10 GetSplitPoint(ref min, ref max); 11 System.Diagnostics.Debug.WriteLine($"2: min={min}, max={max}"); 12 13 GetSplitPoint(ref min, ref max); 14 System.Diagnostics.Debug.WriteLine($"3: min={min}, max={max}");

以下のような出力結果が得られます。呼び出した側の変数が更新されていることが分かります。

0: min=1, max=2 1: min=3, max=4 2: min=5, max=6 3: min=7, max=8

参考になるサイトなどがあれば教えていただけると幸いです。

C#のrefoutについて学んでみるとよいです。

ref (C# リファレンス) - Microsoft Docs
out パラメーター修飾子 (C# リファレンス) - Microsoft Docs

投稿2020/11/03 06:43

dodox86

総合スコア9183

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

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

0

参照渡しを使えば使えばいいと思います。
こんな感じにすれば、値変わりますよ。

C#

1public void sample() { 2 int i = 5; 3 value1( i ); //値渡し 4 Console.WriteLine(i); //=> 5 5 value2( ref i ); //参照渡し 6 Console.WriteLine(i); //=> 10 7} 8 9// 値型の値渡し 10public void value1( int x ) { 11 x = 10; 12} 13 14// 値型の参照渡し 15public void value2( ref int x ) { 16 x = 10; 17}

投稿2020/11/03 06:38

stdio

総合スコア3307

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問