回答編集履歴

1

Unityではまだ実装できないC#8.0でだけど、どういう流れができるのかを書いてみた

2019/11/01 17:13

投稿

len_souko
len_souko

スコア1363

test CHANGED
@@ -41,3 +41,243 @@
41
41
  それぞれの違いはそれぞれの内部で保持する情報でしかないのでその影響計算はそれぞれで行うのが妥当って感じですね
42
42
 
43
43
  そのうえでインターフェースを定義するなり基底クラスを定義するなりして敵だろうが見方だろうが同じ形で計算できるようにすると汎用性が高まるので作るのが楽になるかもと思った次第です
44
+
45
+
46
+
47
+ 追記:2019年11月02日
48
+
49
+
50
+
51
+ コメントで追記した内容をもとに試しで書いてみた
52
+
53
+ なお、UnityではC#8.0は未実装だと思うので、```interface ICharactor```には実装が書けないので、味方クラスと敵クラスすべてに攻撃をするメソッドと攻撃を受けるメソッドを実装する必要があります
54
+
55
+
56
+
57
+ ```C#
58
+
59
+ class Program
60
+
61
+ {
62
+
63
+ static void Main(string[] args)
64
+
65
+ {
66
+
67
+ ICharactor ゆーしゃ = new 味方();
68
+
69
+ ゆーしゃ.お名前 = nameof(ゆーしゃ);
70
+
71
+ ICharactor つかいっぱー = new 味方();
72
+
73
+ つかいっぱー.お名前 = nameof(つかいっぱー);
74
+
75
+
76
+
77
+ ICharactor 雑魚えー = new 敵();
78
+
79
+ 雑魚えー.お名前 = nameof(雑魚えー);
80
+
81
+ ICharactor 雑魚びー = new 敵();
82
+
83
+ 雑魚びー.お名前 = nameof(雑魚びー);
84
+
85
+
86
+
87
+ var 倒せたかな = ゆーしゃ.攻撃をする(雑魚えー);
88
+
89
+ if(倒せたかな)
90
+
91
+ {
92
+
93
+ Console.WriteLine($"{ゆーしゃ.お名前}は{雑魚えー.お名前}を倒した!");
94
+
95
+ }
96
+
97
+ var たげ = 雑魚えー.生きてるの ? 雑魚えー : 雑魚びー;
98
+
99
+ 倒せたかな = つかいっぱー.攻撃をする(たげ);
100
+
101
+ {
102
+
103
+ Console.WriteLine($"{つかいっぱー.お名前}は{たげ.お名前}を倒した!");
104
+
105
+ }
106
+
107
+ }
108
+
109
+ }
110
+
111
+
112
+
113
+ internal interface ICharactor
114
+
115
+ {
116
+
117
+ // これ、C#8.0で処理が書ける
118
+
119
+ // C#8.0未満では{から}までが書けないので各クラスで実装を必ず書く必要がある
120
+
121
+ public bool 攻撃をする(ICharactor target)
122
+
123
+ {
124
+
125
+ return target.攻撃を受ける(攻撃力);
126
+
127
+ }
128
+
129
+
130
+
131
+ //これも同じ
132
+
133
+ public bool 攻撃を受ける(double 攻撃値)
134
+
135
+ {
136
+
137
+ var isDead = Hp <= 攻撃値;
138
+
139
+
140
+
141
+ // イールドは定義できないのでhpのフィールドを変更することができない
142
+
143
+ // かといってhpはげったーのみにしたいので処理が書けない
144
+
145
+ //Hp -= 攻撃値;
146
+
147
+
148
+
149
+ return isDead;
150
+
151
+ }
152
+
153
+
154
+
155
+ public double 攻撃力 { get; }
156
+
157
+
158
+
159
+ public double 防御力 { get; }
160
+
161
+
162
+
163
+ public double Hp { get; }
164
+
165
+
166
+
167
+ public bool 生きてるの { get; }
168
+
169
+
170
+
171
+ public string お名前 { get; set; }
172
+
173
+ }
174
+
175
+
176
+
177
+ public class 味方 : ICharactor
178
+
179
+ {
180
+
181
+ private double atk = 2f;
182
+
183
+ public double 攻撃力 => atk;
184
+
185
+
186
+
187
+ private double vit = 1f;
188
+
189
+ public double 防御力 => vit;
190
+
191
+
192
+
193
+ private double hp = 10f;
194
+
195
+ public double Hp => hp;
196
+
197
+
198
+
199
+ private bool isDead = true;
200
+
201
+ public bool 生きてるの => isDead;
202
+
203
+ public string お名前 { get; set; }
204
+
205
+
206
+
207
+ public bool 攻撃を受ける(double 攻撃値)
208
+
209
+ {
210
+
211
+ var 被ダメ = 攻撃値 - vit;
212
+
213
+ isDead = hp <= 被ダメ;
214
+
215
+
216
+
217
+ hp = isDead ? 0 : hp - 被ダメ;
218
+
219
+
220
+
221
+ return isDead;
222
+
223
+ }
224
+
225
+
226
+
227
+ }
228
+
229
+
230
+
231
+ public class 敵 : ICharactor
232
+
233
+ {
234
+
235
+ private double atk = 1f;
236
+
237
+ public double 攻撃力 => atk;
238
+
239
+
240
+
241
+ private double vit = 2.3f;
242
+
243
+ public double 防御力 => vit;
244
+
245
+
246
+
247
+ private double hp = 1.5f;
248
+
249
+ public double Hp => hp;
250
+
251
+
252
+
253
+ private bool isDead = true;
254
+
255
+ public bool 生きてるの => isDead;
256
+
257
+ public string お名前 { get; set; }
258
+
259
+
260
+
261
+ public bool 攻撃を受ける(double 攻撃値)
262
+
263
+ {
264
+
265
+ var 被ダメ = 攻撃値 - (vit / 2);
266
+
267
+ isDead = hp <= 被ダメ;
268
+
269
+
270
+
271
+ hp = isDead ? 0 : hp - 被ダメ;
272
+
273
+
274
+
275
+ return isDead;
276
+
277
+ }
278
+
279
+ }
280
+
281
+
282
+
283
+ ```