teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

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

2019/11/01 17:13

投稿

len_souko
len_souko

スコア1367

answer CHANGED
@@ -19,4 +19,124 @@
19
19
  例えば敵の背中を殴るって行為でも殴る側がどれだけの力で殴るかや殴る人がひょろい場合やムキムキマッチョな人だと同じ全力で殴るでも受けるダメージは違います
20
20
  また、同じ人が同じ力で敵を殴るとしても相手が痛みに弱い人ならめっちゃ痛がるでしょうし、「鍛えているからだ!」とかいうような人ならあんまり痛くないでしょうし、特殊な訓練を受けた人なら「もっとつよくなぐってくだしゃひぃ~」とか言って回復しているかもしれません
21
21
  それぞれの違いはそれぞれの内部で保持する情報でしかないのでその影響計算はそれぞれで行うのが妥当って感じですね
22
- そのうえでインターフェースを定義するなり基底クラスを定義するなりして敵だろうが見方だろうが同じ形で計算できるようにすると汎用性が高まるので作るのが楽になるかもと思った次第です
22
+ そのうえでインターフェースを定義するなり基底クラスを定義するなりして敵だろうが見方だろうが同じ形で計算できるようにすると汎用性が高まるので作るのが楽になるかもと思った次第です
23
+
24
+ 追記:2019年11月02日
25
+
26
+ コメントで追記した内容をもとに試しで書いてみた
27
+ なお、UnityではC#8.0は未実装だと思うので、```interface ICharactor```には実装が書けないので、味方クラスと敵クラスすべてに攻撃をするメソッドと攻撃を受けるメソッドを実装する必要があります
28
+
29
+ ```C#
30
+ class Program
31
+ {
32
+ static void Main(string[] args)
33
+ {
34
+ ICharactor ゆーしゃ = new 味方();
35
+ ゆーしゃ.お名前 = nameof(ゆーしゃ);
36
+ ICharactor つかいっぱー = new 味方();
37
+ つかいっぱー.お名前 = nameof(つかいっぱー);
38
+
39
+ ICharactor 雑魚えー = new 敵();
40
+ 雑魚えー.お名前 = nameof(雑魚えー);
41
+ ICharactor 雑魚びー = new 敵();
42
+ 雑魚びー.お名前 = nameof(雑魚びー);
43
+
44
+ var 倒せたかな = ゆーしゃ.攻撃をする(雑魚えー);
45
+ if(倒せたかな)
46
+ {
47
+ Console.WriteLine($"{ゆーしゃ.お名前}は{雑魚えー.お名前}を倒した!");
48
+ }
49
+ var たげ = 雑魚えー.生きてるの ? 雑魚えー : 雑魚びー;
50
+ 倒せたかな = つかいっぱー.攻撃をする(たげ);
51
+ {
52
+ Console.WriteLine($"{つかいっぱー.お名前}は{たげ.お名前}を倒した!");
53
+ }
54
+ }
55
+ }
56
+
57
+ internal interface ICharactor
58
+ {
59
+ // これ、C#8.0で処理が書ける
60
+ // C#8.0未満では{から}までが書けないので各クラスで実装を必ず書く必要がある
61
+ public bool 攻撃をする(ICharactor target)
62
+ {
63
+ return target.攻撃を受ける(攻撃力);
64
+ }
65
+
66
+ //これも同じ
67
+ public bool 攻撃を受ける(double 攻撃値)
68
+ {
69
+ var isDead = Hp <= 攻撃値;
70
+
71
+ // イールドは定義できないのでhpのフィールドを変更することができない
72
+ // かといってhpはげったーのみにしたいので処理が書けない
73
+ //Hp -= 攻撃値;
74
+
75
+ return isDead;
76
+ }
77
+
78
+ public double 攻撃力 { get; }
79
+
80
+ public double 防御力 { get; }
81
+
82
+ public double Hp { get; }
83
+
84
+ public bool 生きてるの { get; }
85
+
86
+ public string お名前 { get; set; }
87
+ }
88
+
89
+ public class 味方 : ICharactor
90
+ {
91
+ private double atk = 2f;
92
+ public double 攻撃力 => atk;
93
+
94
+ private double vit = 1f;
95
+ public double 防御力 => vit;
96
+
97
+ private double hp = 10f;
98
+ public double Hp => hp;
99
+
100
+ private bool isDead = true;
101
+ public bool 生きてるの => isDead;
102
+ public string お名前 { get; set; }
103
+
104
+ public bool 攻撃を受ける(double 攻撃値)
105
+ {
106
+ var 被ダメ = 攻撃値 - vit;
107
+ isDead = hp <= 被ダメ;
108
+
109
+ hp = isDead ? 0 : hp - 被ダメ;
110
+
111
+ return isDead;
112
+ }
113
+
114
+ }
115
+
116
+ public class 敵 : ICharactor
117
+ {
118
+ private double atk = 1f;
119
+ public double 攻撃力 => atk;
120
+
121
+ private double vit = 2.3f;
122
+ public double 防御力 => vit;
123
+
124
+ private double hp = 1.5f;
125
+ public double Hp => hp;
126
+
127
+ private bool isDead = true;
128
+ public bool 生きてるの => isDead;
129
+ public string お名前 { get; set; }
130
+
131
+ public bool 攻撃を受ける(double 攻撃値)
132
+ {
133
+ var 被ダメ = 攻撃値 - (vit / 2);
134
+ isDead = hp <= 被ダメ;
135
+
136
+ hp = isDead ? 0 : hp - 被ダメ;
137
+
138
+ return isDead;
139
+ }
140
+ }
141
+
142
+ ```