質問編集履歴

7

解決内容

2022/05/15 04:08

投稿

omaetoomae
omaetoomae

スコア41

test CHANGED
File without changes
test CHANGED
@@ -162,3 +162,17 @@
162
162
  orderby s3.Rank // 順位で並び替え
163
163
  select s3;
164
164
  ```
165
+ ### 追記4(解決しました!!!)
166
+ **fiveHundred**さんに指摘された通り、代入がされていませんでしたが、追記のコード通りに書いたところ、見事に上手く動作しました!
167
+
168
+ ↓早速作ったBotを入れて試してみました!
169
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-05-15/21b0df0c-cc97-436d-a291-4125f669548c.png)
170
+ ↓プレイヤーがBotをキルすると...
171
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-05-15/5046c862-378c-479a-967c-a12852a77d87.png)
172
+ キル数が多い順にソートされた!!!(ちょっと不格好ですが...)
173
+
174
+ ### 最後に
175
+ 今回の不具合の原因は完全に私が名前を覚えたばっかりの「Linq」を全く学ばずにUnityに実装しようとしたことが原因です。
176
+ 次回から新しいものに手を出す場合は、少しは基礎知識をつけたうえでコードを書いていこうと思います。
177
+
178
+ **回答してくれた方々、どうもありがとうございました!**

6

追記3

2022/05/14 14:00

投稿

omaetoomae
omaetoomae

スコア41

test CHANGED
File without changes
test CHANGED
@@ -123,3 +123,42 @@
123
123
  ```
124
124
  "stringのリストは変換できません"みたいなことが書かれていますが、ではどうしたらいいのかさっぱりわかりません...
125
125
  こちらのエラーについても、解決いただきたいです。
126
+
127
+ ### 追記3
128
+ **fiveHundred**さんに教えてもらったようにFor文を使って追加するように書き換えましたが、For文の中でそれぞれのプレイヤーの名前は取得できているものの、うまく```Scores```に代入できていないようでして...
129
+ 今一度解説をお願いしたいです。たくさんの追記申し訳ないです...
130
+ ```Scoreboard.cs
131
+ var scores = new Scores[namesList.Count];
132
+ for (int i = 0; i < namesList.Count; i++){
133
+ new Scores(){
134
+ Name = namesList[i],
135
+ Kill = 0,
136
+ };
137
+ };
138
+ ```
139
+ ### 実行したときのエラー文
140
+ ```Console
141
+ NullReferenceException: Object reference not set to an instance of an object
142
+ Scoreboard+<>c.<FixedUpdate>b__6_1 (<>f__AnonymousType0`2[<s1>j__TPar,<higher>j__TPar] <>h__TransparentIdentifier0) (at Scoreboard.cs:69)
143
+
144
+ System.Linq.Utilities+<>c__DisplayClass2_0`3[TSource,TMiddle,TResult].<CombineSelectors>b__0 (TSource x) (at <351e49e2a5bf4fd6beabb458ce2255f3>:0)
145
+ System.Linq.Enumerable+SelectArrayIterator`2[TSource,TResult].ToArray () (at <351e49e2a5bf4fd6beabb458ce2255f3>:0)
146
+ System.Linq.Buffer`1[TElement]..ctor (System.Collections.Generic.IEnumerable`1[T] source) (at <351e49e2a5bf4fd6beabb458ce2255f3>:0)
147
+ System.Linq.OrderedEnumerable`1+<GetEnumerator>d__3[TElement].MoveNext () (at <351e49e2a5bf4fd6beabb458ce2255f3>:0)
148
+ Scoreboard.Update () (at Scoreboard.cs:78)
149
+ ```
150
+ ```Scoreboard.cs
151
+ //以下エラーの場所
152
+ var ranking = from s1 in scores
153
+ let higher = from s2 in scores // 現在のプレイヤーより点数が良いプレイヤーを取得
154
+ where s2.Kill > s1.Kill
155
+ select s2
156
+ select new //NullReferenceException:~
157
+ {
158
+ s1.Name,
159
+ s1.Kill,
160
+ Rank = higher.Count() + 1, // 現在のプレイヤーより点数が良いプレイヤーの人数 + 1 が順位
161
+ } into s3
162
+ orderby s3.Rank // 順位で並び替え
163
+ select s3;
164
+ ```

5

追記

2022/05/14 09:56

投稿

omaetoomae
omaetoomae

スコア41

test CHANGED
File without changes
test CHANGED
@@ -101,5 +101,25 @@
101
101
 
102
102
  ※抜けている箇所などがあれば修正または追記しますので、教えていただけるとありがたいです。
103
103
 
104
- ### 追記
104
+ ### 追記
105
105
  Player.csを追加しました。
106
+ ### 追記2
107
+ "「長さが0の配列」になっている"との指摘を頂いたため、コードを書き換えたのですが、エラーが発生してしまいました。
108
+ ```Scoreboard.cs
109
+ var scores = new Scores[namesList.Count]; //配列の長さを名前リストと同じ長さにする
110
+ scores = namesList.ToArray(); //リストから配列に代入
111
+ //error CS0029: Cannot implicitly convert type 'string[]' to 'Scores[]'
112
+ foreach(var name in namesList){
113
+ new Scores()
114
+ {
115
+ Name = name,
116
+ Kill = 0,
117
+ };
118
+ }
119
+ ```
120
+ ### エラー文
121
+ ```Console
122
+ error CS0029: Cannot implicitly convert type 'string[]' to 'Scores[]'
123
+ ```
124
+ "stringのリストは変換できません"みたいなことが書かれていますが、ではどうしたらいいのかさっぱりわかりません...
125
+ こちらのエラーについても、解決いただきたいです。

4

追記

2022/05/14 08:10

投稿

omaetoomae
omaetoomae

スコア41

test CHANGED
File without changes
test CHANGED
@@ -100,3 +100,6 @@
100
100
  もし、ほかに実装できる方法があれば、それも合わせてご教授頂きたいです。
101
101
 
102
102
  ※抜けている箇所などがあれば修正または追記しますので、教えていただけるとありがたいです。
103
+
104
+ ### 追記
105
+ Player.csを追加しました。

3

コードの追記

2022/05/14 07:59

投稿

omaetoomae
omaetoomae

スコア41

test CHANGED
File without changes
test CHANGED
@@ -73,7 +73,7 @@
73
73
  {
74
74
  //スコア
75
75
  name = "a"; //とりあえず"a"とする
76
- scoreboard_script.namesList.Add(name);
76
+ scoreboard_script.namesList.Add(name); //Scoreboard.csのnamesListに追加する
77
77
  }
78
78
  }
79
79
  ```

2

コードの追加

2022/05/14 07:57

投稿

omaetoomae
omaetoomae

スコア41

test CHANGED
File without changes
test CHANGED
@@ -3,7 +3,7 @@
3
3
  ※イメージ↓
4
4
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-05-14/d0cb529d-791c-4d4a-8234-84531e373cec.png)
5
5
  コード↓([こちら](https://tnakamura.hatenablog.com/entry/2015/04/17/make_a_ranking_by_using_linq)を参考にさせていただきました)
6
- ```C#
6
+ ```Scoreboard.cs
7
7
  using System.Collections;
8
8
  using System.Collections.Generic;
9
9
  using System;
@@ -56,10 +56,31 @@
56
56
  }
57
57
  }
58
58
  ```
59
+ ```Player.cs
60
+ using System;
61
+ using System.Collections;
62
+ using System.Collections.Generic;
63
+ using UnityEngine;
64
+
65
+ public class Player : MonoBehaviour
66
+ {
67
+ public string name;
68
+ public int kill = 0; //キル数
69
+
70
+ public Scoreboard scoreboard_script;
71
+
72
+ void Start ()
73
+ {
74
+ //スコア
75
+ name = "a"; //とりあえず"a"とする
76
+ scoreboard_script.namesList.Add(name);
77
+ }
78
+ }
79
+ ```
59
80
  今日「**Linq**」というものを知ったため、そもそもの書き方が間違っているかもしれません。
60
81
  [参考にしたサイト](https://tnakamura.hatenablog.com/entry/2015/04/17/make_a_ranking_by_using_linq)のように書くと以下↓のコードになりますが、これだと後でプレイヤーが増減したときに変更できないし...
61
82
  ※ちなみにUnityには表示されました(おかしいけど)
62
- ```C#
83
+ ```Scoreboard.cs
63
84
  var scores = new Scores[]{
64
85
  new Scores(){
65
86
  Name = "a",

1

追記

2022/05/14 07:28

投稿

omaetoomae
omaetoomae

スコア41

test CHANGED
File without changes
test CHANGED
@@ -78,3 +78,4 @@
78
78
 
79
79
  もし、ほかに実装できる方法があれば、それも合わせてご教授頂きたいです。
80
80
 
81
+ ※抜けている箇所などがあれば修正または追記しますので、教えていただけるとありがたいです。