質問編集履歴
7
解決内容
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
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
追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -101,5 +101,25 @@
|
|
101
101
|
|
102
102
|
※抜けている箇所などがあれば修正または追記しますので、教えていただけるとありがたいです。
|
103
103
|
|
104
|
-
### 追記
|
104
|
+
### 追記1
|
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
追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -100,3 +100,6 @@
|
|
100
100
|
もし、ほかに実装できる方法があれば、それも合わせてご教授頂きたいです。
|
101
101
|
|
102
102
|
※抜けている箇所などがあれば修正または追記しますので、教えていただけるとありがたいです。
|
103
|
+
|
104
|
+
### 追記
|
105
|
+
Player.csを追加しました。
|
3
コードの追記
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
コードの追加
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
|
-
```
|
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
|
-
```
|
83
|
+
```Scoreboard.cs
|
63
84
|
var scores = new Scores[]{
|
64
85
|
new Scores(){
|
65
86
|
Name = "a",
|
1
追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -78,3 +78,4 @@
|
|
78
78
|
|
79
79
|
もし、ほかに実装できる方法があれば、それも合わせてご教授頂きたいです。
|
80
80
|
|
81
|
+
※抜けている箇所などがあれば修正または追記しますので、教えていただけるとありがたいです。
|