回答編集履歴
5
文章修正 コード修正
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
X … Player_Mainオブジェクトからの値を参照したい
|
5
|
+
X … いかに効率的にかつ簡略化して変数の値を見れるか(要はPlayer_Mainオブジェクトからの値を参照したい)
|
6
6
|
|
7
7
|
Y … メソッドの内容が同じで引数の型だけ変えたい
|
8
8
|
|
@@ -64,7 +64,7 @@
|
|
64
64
|
|
65
65
|
GUI_S.Auto_TextField("AngleDir : " + PlayerM.AngelDir, "AngleDir");
|
66
66
|
|
67
|
-
GUI_S.Auto_TextField("Player.transform.position : " + Player
|
67
|
+
GUI_S.Auto_TextField("Player.transform.position : " + PlayerM.PlayerTransform.transform.position, "Player.transform.position");
|
68
68
|
|
69
69
|
GUI_S.Auto_TextField("Player.Speed : " + PlayerM.Speed, "Player.Speed");
|
70
70
|
|
4
改善例を更新
test
CHANGED
@@ -1,10 +1,16 @@
|
|
1
|
-
|
1
|
+
[XY問題](https://ja.meta.stackoverflow.com/questions/2701/xy-%E5%95%8F%E9%A1%8C-%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B)に感じます。
|
2
2
|
|
3
|
-
- クラス名やメソッド名から処理の内容がイメージできない
|
4
3
|
|
5
|
-
- `static`の乱用で`Vars`の状態が分かりにくい
|
6
4
|
|
5
|
+
X … Player_Mainオブジェクトからの値を参照したい
|
6
|
+
|
7
|
-
|
7
|
+
Y … メソッドの内容が同じで引数の型だけ変えたい
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
まず、Varsクラスを用意する必要性を感じません。
|
12
|
+
|
13
|
+
よって、Omit_Rpvメソッドを用意する必要もなくなるので、下記で解決します。
|
8
14
|
|
9
15
|
|
10
16
|
|
@@ -14,43 +20,15 @@
|
|
14
20
|
|
15
21
|
{
|
16
22
|
|
17
|
-
public Player
|
23
|
+
public float Speed = 1; //PlayerのSpeedを定義及び代入
|
18
24
|
|
19
|
-
|
25
|
+
public float AngleDir = 0; //AngleDirを定義
|
20
26
|
|
21
|
-
|
27
|
+
public float X_Rotation = 0; //X_Rotationを定義
|
22
28
|
|
23
|
-
|
29
|
+
public float Y_Rotation = 0; //Y_Rotationを定義
|
24
30
|
|
25
|
-
Speed = Speed;
|
26
|
-
|
27
|
-
RotationX = X_Rotation;
|
28
|
-
|
29
|
-
RotationY = Y_Rotation;
|
30
|
-
|
31
|
-
};
|
32
|
-
|
33
|
-
}
|
34
|
-
|
35
|
-
}
|
36
|
-
|
37
|
-
```
|
38
|
-
|
39
|
-
```C#
|
40
|
-
|
41
|
-
public
|
31
|
+
public Transform PlayerTransform;
|
42
|
-
|
43
|
-
{
|
44
|
-
|
45
|
-
public float Speed = 0;
|
46
|
-
|
47
|
-
public float AngleDir = 0;
|
48
|
-
|
49
|
-
public float RotationX = 0;
|
50
|
-
|
51
|
-
public float RotationY = 0;
|
52
|
-
|
53
|
-
public Vector3 Position = new Vector3(0, 0, 0);
|
54
32
|
|
55
33
|
}
|
56
34
|
|
@@ -84,15 +62,11 @@
|
|
84
62
|
|
85
63
|
|
86
64
|
|
87
|
-
|
65
|
+
GUI_S.Auto_TextField("AngleDir : " + PlayerM.AngelDir, "AngleDir");
|
88
66
|
|
67
|
+
GUI_S.Auto_TextField("Player.transform.position : " + Player_Main.transform.position, "Player.transform.position");
|
89
68
|
|
90
|
-
|
91
|
-
GUI_S.Auto_TextField("AngleDir : " + player.AngelDir, "AngleDir");
|
92
|
-
|
93
|
-
GUI_S.Auto_TextField("Player.transform.position : " + player.Position, "Player.transform.position");
|
94
|
-
|
95
|
-
GUI_S.Auto_TextField("Player.Speed : " +
|
69
|
+
GUI_S.Auto_TextField("Player.Speed : " + PlayerM.Speed, "Player.Speed");
|
96
70
|
|
97
71
|
/*----------------------*/
|
98
72
|
|
@@ -101,27 +75,3 @@
|
|
101
75
|
}
|
102
76
|
|
103
77
|
```
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
### 変更要点
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
- `ReturnPlayerVar`→`Create`に命名変更
|
112
|
-
|
113
|
-
- `Vars`→`Player`に変更 (PlayerPositionを保持しているところからプレイヤーに関連する情報と推測したためこのように命名。クラス設計が正しいかは不明)
|
114
|
-
|
115
|
-
- staticを削った
|
116
|
-
|
117
|
-
- 冗長的な処理も削った
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
### まとめ
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
コードを整理すると`Omit_Rpv`メソッドがなくなりました。
|
126
|
-
|
127
|
-
なので、それぞれのクラス・メソッドの役割を整理することでも今回の問題は解決します。
|
3
改善例を更新
test
CHANGED
@@ -10,53 +10,27 @@
|
|
10
10
|
|
11
11
|
```C#
|
12
12
|
|
13
|
-
public Player
|
13
|
+
public class Player_Main : MonoBehaviour
|
14
14
|
|
15
15
|
{
|
16
16
|
|
17
|
-
Player
|
17
|
+
public Player Create () {
|
18
18
|
|
19
|
-
|
19
|
+
return new Player {
|
20
20
|
|
21
|
-
|
21
|
+
Position = PlayerTransform.transform.position;
|
22
22
|
|
23
|
-
|
23
|
+
AngleDir = AngleDir;
|
24
24
|
|
25
|
-
|
25
|
+
Speed = Speed;
|
26
26
|
|
27
|
-
|
27
|
+
RotationX = X_Rotation;
|
28
28
|
|
29
|
-
|
29
|
+
RotationY = Y_Rotation;
|
30
30
|
|
31
|
-
|
31
|
+
};
|
32
32
|
|
33
33
|
}
|
34
|
-
|
35
|
-
else if (fieldName == "X_Rotation")
|
36
|
-
|
37
|
-
{
|
38
|
-
|
39
|
-
player.RotationX = X_Rotation;
|
40
|
-
|
41
|
-
}
|
42
|
-
|
43
|
-
else if (fieldName == "Y_Rotation")
|
44
|
-
|
45
|
-
{
|
46
|
-
|
47
|
-
player.RotationY = Y_Rotation;
|
48
|
-
|
49
|
-
}
|
50
|
-
|
51
|
-
else if (fieldName == "PlayerTp")
|
52
|
-
|
53
|
-
{
|
54
|
-
|
55
|
-
player.Position = PlayerTransform.transform.position;
|
56
|
-
|
57
|
-
}
|
58
|
-
|
59
|
-
return player;
|
60
34
|
|
61
35
|
}
|
62
36
|
|
@@ -68,7 +42,7 @@
|
|
68
42
|
|
69
43
|
{
|
70
44
|
|
71
|
-
public
|
45
|
+
public float Speed = 0;
|
72
46
|
|
73
47
|
public float AngleDir = 0;
|
74
48
|
|
@@ -82,27 +56,65 @@
|
|
82
56
|
|
83
57
|
```
|
84
58
|
|
59
|
+
|
60
|
+
|
61
|
+
```C#
|
62
|
+
|
63
|
+
public class RealTimeInfo : MonoBehaviour
|
64
|
+
|
65
|
+
{
|
66
|
+
|
67
|
+
public RealTime_Setting RealTime_Setting;
|
68
|
+
|
69
|
+
public Player_Main PlayerM;
|
70
|
+
|
71
|
+
GUI_Support GUI_S = new GUI_Support(); //GUI_Supportを変数に代入
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
void OnGUI()
|
76
|
+
|
77
|
+
{
|
78
|
+
|
79
|
+
/*デバック用テキスト表示*/
|
80
|
+
|
81
|
+
if(RealTime_Setting.MainAudioSource.clip.name != null)
|
82
|
+
|
83
|
+
GUI_S.Auto_TextField("BGM : " + RealTime_Setting.MainAudioSource.clip.name.ToString(), "LoadType");
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
var player = PlayerM.Create();
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
GUI_S.Auto_TextField("AngleDir : " + player.AngelDir, "AngleDir");
|
92
|
+
|
93
|
+
GUI_S.Auto_TextField("Player.transform.position : " + player.Position, "Player.transform.position");
|
94
|
+
|
95
|
+
GUI_S.Auto_TextField("Player.Speed : " + player.Speed, "Player.Speed");
|
96
|
+
|
97
|
+
/*----------------------*/
|
98
|
+
|
99
|
+
}
|
100
|
+
|
101
|
+
}
|
102
|
+
|
103
|
+
```
|
104
|
+
|
105
|
+
|
106
|
+
|
85
107
|
### 変更要点
|
86
108
|
|
87
109
|
|
88
110
|
|
89
|
-
- `ReturnPlayerVar`→`Create
|
111
|
+
- `ReturnPlayerVar`→`Create`に命名変更
|
90
112
|
|
91
|
-
- `Vars`→`Player`に変更 (PlayerPositionを保持しているところからプレイヤー
|
113
|
+
- `Vars`→`Player`に変更 (PlayerPositionを保持しているところからプレイヤーに関連する情報と推測したためこのように命名。クラス設計が正しいかは不明)
|
92
114
|
|
93
115
|
- staticを削った
|
94
116
|
|
95
117
|
- 冗長的な処理も削った
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
### 思うところ
|
100
|
-
|
101
|
-
- `CreateAndSetFieldByName`はCreateとSetの2つにメソッドを分けたほうが分かりやすい
|
102
|
-
|
103
|
-
- そもそも上記メソッドを用意する必要性があるかは不明
|
104
|
-
|
105
|
-
- `Player`のクラス定義が妥当であるかは不明
|
106
118
|
|
107
119
|
|
108
120
|
|
2
文章の修正
test
CHANGED
@@ -60,7 +60,9 @@
|
|
60
60
|
|
61
61
|
}
|
62
62
|
|
63
|
+
```
|
63
64
|
|
65
|
+
```C#
|
64
66
|
|
65
67
|
public class Player
|
66
68
|
|
@@ -108,6 +110,6 @@
|
|
108
110
|
|
109
111
|
|
110
112
|
|
111
|
-
コードを整理するとOmit_Rpvメソッドがなくなりました。
|
113
|
+
コードを整理すると`Omit_Rpv`メソッドがなくなりました。
|
112
114
|
|
113
115
|
なので、それぞれのクラス・メソッドの役割を整理することでも今回の問題は解決します。
|
1
コードと回答が一致していない。
test
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
|
11
11
|
```C#
|
12
12
|
|
13
|
-
public Player Create (string fieldName)
|
13
|
+
public Player CreateAndSetFieldByName (string fieldName)
|
14
14
|
|
15
15
|
{
|
16
16
|
|