🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity

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

Q&A

解決済

2回答

1068閲覧

ガチャで当たった物が増えない

CPU

総合スコア13

C#

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

Unity

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

0グッド

0クリップ

投稿2021/01/18 14:37

unityでゲームを作っていますが、このコードでGManager.instance~~が増えません。
どうしたら増えるのか教えて頂きたいです

c#

1using System; 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.UI; 6using System.Linq; 7 8class Data 9{ 10 public string name; 11 public int rarity; 12 public int id; 13 public int numbers; 14} 15 16public class gacha : MonoBehaviour 17{ 18 public void itiren() 19 { 20 List<Data> myData = new List<Data> 21 { 22 new Data 23 { 24 name = "kaze", 25 rarity = 1, 26 id = 1001, 27 numbers = GManager.instance.kazeint 28 }, 29 30 new Data 31 { 32 name = "bomu", 33 rarity = 1, 34 id = 1002, 35 numbers = GManager.instance.bomuint 36 }, 37 38 new Data 39 { 40 name = "speeddown", 41 rarity = 1, 42 id = 1003, 43 numbers = GManager.instance.speeddownint 44 }, 45 46 new Data 47 { 48 name = "mpkotei", 49 rarity = 1, 50 id = 1004, 51 numbers = GManager.instance.mpkoteiint 52 }, 53 54 new Data 55 { 56 name = "mpzouka", 57 rarity = 1, 58 id = 1005, 59 numbers = GManager.instance.mpzoukaint 60 }, 61 62 new Data 63 { 64 name = "mpkyuushuu", 65 rarity = 1, 66 id = 1006, 67 numbers = GManager.instance.mpkyuushuuint 68 }, 69 70 new Data 71 { 72 name = "hpkaifuku", 73 rarity = 1, 74 id = 1007, 75 numbers = GManager.instance.hpkaifukuint 76 }, 77 78 new Data 79 { 80 name = "hpzouka", 81 rarity = 1, 82 id = 1008, 83 numbers = GManager.instance.hpzoukaint 84 } 85 }; 86 87 int gachane = 50; 88 if (GManager.instance.coin >= gachane) 89 { 90 GManager.instance.coin = GManager.instance.coin - gachane; 91 92 93 float gint = UnityEngine.Random.Range(0f, 100f); 94 if (gint < 50f) 95 { 96 var iti = 97 from x in myData 98 where x.rarity == 1 99 orderby x.id ascending 100 select x; 101 102 System.Random r1 = new System.Random(); 103 int r2 = r1.Next(0, 8); 104 105 Debug.Log(myData[r2].numbers); 106 107 foreach (Data a in iti) 108 { 109 ++ myData[r2].numbers; 110 Debug.Log(r2 + "+1"); 111 } 112 } 113 114 else if (gint < 90f) 115 { 116 Debug.Log("2"); 117 } 118 119 else if (gint < 97f) 120 { 121 Debug.Log("3"); 122 } 123 124 else 125 { 126 Debug.Log("4"); 127 } 128 } 129 } 130} 131 132using System.Collections; 133using System.Collections.Generic; 134using UnityEngine; 135 136public class GManager : MonoBehaviour 137{ 138 public static GManager instance = null; 139 140 //hosiiti 141 public int kazeint; 142 public int bomuint; 143 public int speeddownint; 144 public int mpkoteiint; 145 public int mpzoukaint; 146 public int mpkyuushuuint; 147 public int hpkaifukuint; 148 public int hpzoukaint; 149 //hosiitiowari 150 151 152 private void Awake() 153 { 154 if (instance == null) 155 { 156 instance = this; 157 DontDestroyOnLoad(this.gameObject); 158 } 159 else 160 { 161 Destroy(this.gameObject); 162 } 163 } 164}

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

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

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

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

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

guest

回答2

0

ベストアンサー

質問の内容としては++ myData[r2].numbersの部分でGManagerクラスの

public int kazeint; ~ public int hpzoukaint;

上記の値が変化しないという話かと思いますがList<Data> myDataを宣言時のnumbers = GManager.instance.kazeint以下は値渡しなのでmyData内のnumbersを増やしても親元の値は変化はしません。

GManager.instance.kazeint++の様に直接加算させる
・参照渡しになる作りに変える

どちらかおこなって下さい。

ちなみに現状は8回ループ加算されるのでその部分を修正しても一回で8増えます

・別質問で理解出来ない方がいたようなので追記

GManager.instance.kazeint++の様に直接加算させる

意味的には https://teratail.com/questions/317983 で退会済みユーザーさんが指摘していた「GManager.Instance.変数名 = 数値;」と同じです。

参照渡しになる作りに変える

退会済みユーザーさんが指摘していた様にrefを使ったint型での参照渡しはここから作り変えるのは難しいかと思います。

参照渡しでは無く参照型を使って作り変えて下さい。
int[]にするだけで良いです。

スパゲティなのでintのインクリメント部分だけ抜き出して書くと下記になります。

C#

1using System.Collections.Generic; 2using UnityEngine; 3 4class Data 5{ 6 public int numbers; 7} 8 9public class gacha : MonoBehaviour 10{ 11 public GManager g; 12 13 public void itiren() 14 { 15 List<Data> myData = new List<Data> 16 { 17 new Data 18 { 19 numbers = GManager.instance.kazeint 20 }, 21 }; 22 23 myData[ 0 ].numbers++; 24 25 Debug.Log( "gachaクラスのmyData[ 0 ].numbers: " + myData[ 0 ].numbers ); 26 Debug.Log( "GManagerクラスのg.kazeint: " + g.kazeint ); 27 } 28} 29 30public class GManager : MonoBehaviour 31{ 32 public static GManager instance = null; 33 34 public int kazeint; 35 36 private void Awake() 37 { 38 kazeint = 0; 39 40 if( instance == null ) 41 { 42 instance = this; 43 DontDestroyOnLoad( this.gameObject ); 44 } 45 else 46 { 47 Destroy( this.gameObject ); 48 } 49 } 50}

コレが質問で問題となっている値渡しの弊害でmyData[ 0 ].numbersをインクリメントしてもログは下記のようになりGManagerクラスのg.kazeintは0のままです。

gachaクラスのmyData[ 0 ].numbers: 1 GManagerクラスのg.kazeint: 0

次に両方のクラスのintをint[]配列に変えてやると

C#

1using System.Collections.Generic; 2using UnityEngine; 3 4class Data 5{ 6 public int[] numbers; 7} 8 9public class gacha : MonoBehaviour 10{ 11 public GManager g; 12 13 public void itiren() 14 { 15 List<Data> myData = new List<Data> 16 { 17 new Data 18 { 19 numbers = GManager.instance.kazeint 20 }, 21 }; 22 23 myData[ 0 ].numbers[ 0 ]++; 24 25 Debug.Log( "gachaクラスのmyData[ 0 ].numbers[ 0 ]: " + myData[ 0 ].numbers[ 0 ] ); 26 Debug.Log( "GManagerクラスのg.kazeint[ 0 ]: " + g.kazeint[ 0 ] ); 27 } 28} 29 30public class GManager : MonoBehaviour 31{ 32 public static GManager instance = null; 33 34 public int[] kazeint; 35 36 private void Awake() 37 { 38 kazeint = new int[] { 0 }; 39 40 if( instance == null ) 41 { 42 instance = this; 43 DontDestroyOnLoad( this.gameObject ); 44 } 45 else 46 { 47 Destroy( this.gameObject ); 48 } 49 } 50}

ログは下記のようになり渡し元のGManagerクラスの数値も増加させる事が可能になります。

gachaクラスのmyData[ 0 ].numbers[ 0 ]: 1 GManagerクラスのg.kazeint[ 0 ]: 1

別質問ではDictinaryに変更して解決されたようで良かったです。

投稿2021/01/18 17:30

編集2021/07/26 18:25
Tto777

総合スコア189

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

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

CPU

2021/01/20 14:41

ありがとうございます! この場合で参照渡しをするスクリプトが分かりません。 教えてください。
Tto777

2021/07/26 13:23

追記部分読んでコメントお願いします
Tto777

2021/07/27 08:27 編集

初心者の方には難しいという話です。 実際私も「参照渡しになる作りに変える」で解決すると思っていたので理解出来なかったようです。 追記ではそれを考慮して参照渡しは止め、参照型の説明を書いただけなのですがそれは理解できていますよね? まぁつまり参照渡しでも可能で問題無いという事で良いですね。
Zuishin

2021/07/26 13:26

君の回答に問題があるから言ってるんだが。
Tto777

2021/07/26 13:39 編集

>君の回答に問題があるから言ってるんだが。 https://teratail.com/questions/317983 上記の質問追記では「回答が意味不明だったので~」と問題があるでは無く理解出来ないとおっしゃっています。 申し訳ないのですが自分の都合の良いように言い換えないで下さい。
Zuishin

2021/07/26 13:30

何か月も前の別の回答なんか覚えてないけど、まあ今まで通り複数アカウントでスコア伸ばしてたらいいんじゃないの。それで恥ずかしくないなら。
Tto777

2021/07/26 13:33

問題があったというならその部分指摘して頂きたいのですが... そもそもこのアカウントがスコア稼ぎ用のアカウントに見えますか? 何かここまで会話が出来ない人とは思いませんでした。
Zuishin

2021/07/26 13:34

> そもそもこのアカウントがスコア稼ぎ用のアカウントに見えますか? じゃあどれがスコア稼ぎ用のアカウントなんだい?
Tto777

2021/07/26 13:36 編集

>じゃあどれがスコア稼ぎ用のアカウントなんだい? そんなもの持っていません 時間が空いた時に質問に答えるこのアカウントしか持っていませんよ そもそもTeratailでスコア稼ぎなんてして何か意味あるのですか?
Tto777

2021/07/26 13:37

複垢に敵意があるようですがそんな意味不明なヘイトを私に向けないで頂きたいです。
Zuishin

2021/07/26 13:39

明らかに間違っている回答に間違っていると言っているだけでヘイトを向けているのはそっちだろう。
Tto777

2021/07/26 13:40

>明らかに間違っている回答に間違っていると言っているだけでヘイトを向けているのはそっちだろう。 どこが明らかなのか教えて頂きたいと言っているだけなのですが
Zuishin

2021/07/26 13:41

読解力がなくて公式情報が読めないということ?
Tto777

2021/07/26 13:42

理解出来ます。 何処が間違っているか指摘よろしくお願いします。
Zuishin

2021/07/26 13:42

理解できてないじゃないか。
Tto777

2021/07/26 13:44

申し訳ないのですが適当な事を言って煙に巻こうとしているとしか思えないです。
Zuishin

2021/07/26 13:45

100 回読み直したらわかって恥ずかしくなるんじゃないかな。
Tto777

2021/07/26 13:48 編集

残念ながら荒らし同然の方だと認識しました。 問題点を指摘出来ないなど回答者・技術者として迷惑な存在でしかないので絡んでこないで下さい。
Zuishin

2021/07/26 13:47

絡んできてるのはそっちじゃないか。 三歩歩いて自分の回答も忘れたのか。
Tto777

2021/07/26 13:49

忘れるも何も上に書いてあるので読んで下さい。 理解出来たら問題点も指摘しておいて頂けると助かります。
Zuishin

2021/07/26 13:49

問題点の指摘は済んでるし、エビデンスもリンクした。 そっちが公式情報が読めないのまで知ったことか。
Tto777

2021/07/27 08:42 編集

読んだ上でお聞きしているのですが理解出来ないのでしょうか? そもそもint型では難しいという話はこの質問者のレベルや現状のコードからの修正では難しいという話です。 実際「参照渡しになる作りに変える」で解決しなかったですからね。 そのため申し訳ないのですが追記では参照渡しの例は書かず参照型のint配列の例だけを書きました。 「最初に参照渡しで出来ると書いたのだから参照渡しの例を書け」と憤慨しているのでしょうか? 参照渡しでも可能という認識であれば問題無いと思うのですがそこを煙に巻こうとしているのが何を目的なのか判りません。
Zuishin

2021/07/26 13:56

言葉の意味も知らんやつの言葉など理解できなくても問題ないだろう。
Tto777

2021/07/26 13:57

もう話にならない人という認識は済んだので今後好きに喚いていて下さい。 どちらが正しいかなどはこれを読んだ人が判断するかと思うので自分はもう気にしません。
Zuishin

2021/07/26 13:58

そうしとけ。面倒くさいから今後絡んでくるな。その間違っていて攻撃的な回答も直しとけ。
Zuishin

2021/07/26 13:59

公式を 100 回読んでもわからなかったら、この回答のどこが間違っていると言われてるのか質問を立てて他の回答者に聞いてみればいい。
Tto777

2021/07/26 17:58 編集

余計な部分は消しておきました。 今後不干渉という事でよろしくお願い致します。
Zuishin

2021/07/26 14:01

お前の名前などいちいち覚える気はないから、今後間違った回答をしているのを偶然見かけたらコメントするし、わざわざお前を探してコメントすることはない。
guest

0

GManager.instanceのいずれかの値に数値を代入しているところはgachaクラス内の以下の部分しかありません。

C#

1 if (GManager.instance.coin >= gachane) 2 { 3 GManager.instance.coin = GManager.instance.coin - gachane; 4 ......

GManager.instance.coin >= gachaneが常にfalseになってたりしませんか。

投稿2021/01/18 14:58

Yukirr4_

総合スコア728

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

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

CPU

2021/01/18 15:15

ありがとうございます! falseにはなっていませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問