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

回答編集履歴

2

追記2

2017/12/08 04:08

投稿

fiveHundred
fiveHundred

スコア10454

answer CHANGED
@@ -48,4 +48,75 @@
48
48
  Cursor.lockState = CursorLockMode.None;
49
49
  Cursor.visible = true;
50
50
  }
51
+ ```
52
+
53
+ ---
54
+ 追記2:
55
+ これって、Standard AssetsのFPSControllerのスクリプトだったんですね…。
56
+
57
+ というわけで、確かめてみたところ、実は``InternalLockUpdate()``は``Update()``だけではなく、``FixedUpdate()``でも呼ばれるそうです。
58
+ そのため、2回連続で``InternalLockUpdate()``を呼ばれて元に戻ってしまったのだと思います。
59
+
60
+ また、通常は``FixedUpdate()``でInputクラスの関数を呼んではいけないので、これはおそらくFPSController自体のバグではないかと思います(違ったらごめんなさい)。
61
+ 私の場合、以下のように修正したところ、上手く動作しました。
62
+
63
+ MouseLook.cs
64
+ ```C#
65
+ public void UpdateCursorLock()
66
+ {
67
+ //if the user set "lockCursor" we check & properly lock the cursos
68
+ if (lockCursor)
69
+ InternalLockUpdate(true);
70
+ }
71
+
72
+ // 新規の関数(FixedUpdate()のときはこちらを呼ぶ)
73
+ public void FixedUpdateCursorLock()
74
+ {
75
+ //if the user set "lockCursor" we check & properly lock the cursos
76
+ if (lockCursor)
77
+ InternalLockUpdate(false);
78
+ }
79
+
80
+ // Update()のときはinUpdate = true、FixedUpdate()のときはinUpdate = false
81
+ private void InternalLockUpdate(bool inUpdate)
82
+ {
83
+ if (inUpdate)
84
+ {
85
+ if (Input.GetKeyUp(KeyCode.Escape))
86
+ {
87
+ m_cursorIsLocked = false;
88
+ }
89
+ else if (Input.GetMouseButtonUp(0))
90
+ {
91
+ m_cursorIsLocked = true;
92
+ }
93
+
94
+ if (Input.GetKeyUp(KeyCode.I))
95
+ {
96
+ m_cursorIsLocked = !m_cursorIsLocked;
97
+ }
98
+ }
99
+
100
+ if (m_cursorIsLocked)
101
+ {
102
+ Cursor.lockState = CursorLockMode.Locked;
103
+ Cursor.visible = false;
104
+ }
105
+ else if (!m_cursorIsLocked)
106
+ {
107
+ Cursor.lockState = CursorLockMode.None;
108
+ Cursor.visible = true;
109
+ }
110
+ }
111
+ ```
112
+
113
+ FirstPersonController.cs
114
+ ```C#
115
+ private void FixedUpdate()
116
+ {
117
+ // …(中略)
118
+
119
+ //m_MouseLook.UpdateCursorLock(); // 変更前
120
+ m_MouseLook.FixedUpdateCursorLock();
121
+ }
51
122
  ```

1

コメントを受けて追記

2017/12/08 04:08

投稿

fiveHundred
fiveHundred

スコア10454

answer CHANGED
@@ -5,4 +5,47 @@
5
5
  {
6
6
  m_cursorIsLocked = !m_cursorIsLocked;
7
7
  }
8
+ ```
9
+
10
+ ---
11
+
12
+ 追記:
13
+ 以下のように、``m_cursorIsLocked``を変更した後に、マウスカーソルの状態の変更処理を行うようにしてみてください。
14
+
15
+ ```C#
16
+ if (m_cursorIsLocked)
17
+ {
18
+ Cursor.lockState = CursorLockMode.Locked;
19
+ Cursor.visible = false;
20
+ }
21
+ else if (!m_cursorIsLocked)
22
+ {
23
+ Cursor.lockState = CursorLockMode.None;
24
+ Cursor.visible = true;
25
+ }
26
+
27
+ if (Input.GetKeyUp(KeyCode.I))
28
+ {
29
+ m_cursorIsLocked = false;
30
+ }
31
+ ```
32
+
33
+ ↓↓↓
34
+
35
+ ```C#
36
+ if (Input.GetKeyUp(KeyCode.I))
37
+ {
38
+ m_cursorIsLocked = !m_cursorIsLocked;
39
+ }
40
+
41
+ if (m_cursorIsLocked)
42
+ {
43
+ Cursor.lockState = CursorLockMode.Locked;
44
+ Cursor.visible = false;
45
+ }
46
+ else if (!m_cursorIsLocked)
47
+ {
48
+ Cursor.lockState = CursorLockMode.None;
49
+ Cursor.visible = true;
50
+ }
8
51
  ```