回答編集履歴

2

内容を修正した

2020/07/04 19:59

投稿

bboydaisuke
bboydaisuke

スコア5308

test CHANGED
@@ -1 +1,117 @@
1
+ 以下の2点を調べるとよいでしょう。
2
+
3
+
4
+
1
- 質問の意図を「空中制御ができないようにしたい」と勘違いしたのでいったん内容を削除しま
5
+ 0. 「接地判定」して、接地してる時のみジャンプする」ようにす
6
+
7
+ 0. 慣性をなくしたいならば、AddForce するのではなく直接 velocity に値をセットする
8
+
9
+
10
+
11
+ 「慣性を無くした状態でジャンプ中物体を...」という記述と貼ってあったコードから「空中にいる時のみ慣性をなくしたい、地上にいる時は慣性をありにしたい」という意味かと思いそういうコードを書いてみましたが、それだとかなり変な挙動になったので「地上でも空中でも慣性をなくしたい、地上でも空中でも変わらず左右に移動したい」というコードを以下に例示しておきます。
12
+
13
+
14
+
15
+ ```csharp
16
+
17
+ using UnityEngine;
18
+
19
+ using UnityEngine.SceneManagement;
20
+
21
+
22
+
23
+ public class PlayerController2D : MonoBehaviour
24
+
25
+ {
26
+
27
+ Rigidbody2D rb2d;
28
+
29
+ [SerializeField] float jumpForce = 1000.0f;
30
+
31
+ [SerializeField] float walkSpeed = 10.0f;
32
+
33
+ /// <summary>接地判定の長さ</summary>
34
+
35
+ [SerializeField] float groundCheckLength = 1f;
36
+
37
+ /// <summary>「地面」と判定するオブジェクトのレイヤーを指定する。自分のいるレイヤーは含めないこと。</summary>
38
+
39
+ [SerializeField] LayerMask layerMask = ~0;
40
+
41
+
42
+
43
+ void Start()
44
+
45
+ {
46
+
47
+ this.rb2d = GetComponent<Rigidbody2D>();
48
+
49
+ }
50
+
51
+
52
+
53
+ void Update()
54
+
55
+ {
56
+
57
+ float h = Input.GetAxisRaw("Horizontal");
58
+
59
+ Vector2 dir = (h * Vector2.right).normalized;
60
+
61
+ // 慣性が無い = 力を加えるのではなく直接 Velocity を書き変える
62
+
63
+ rb2d.velocity = dir * walkSpeed + Vector2.up * rb2d.velocity.y;
64
+
65
+
66
+
67
+ if (Input.GetButtonDown("Jump") && IsGrounded())
68
+
69
+ {
70
+
71
+ this.rb2d.AddForce(transform.up * this.jumpForce);
72
+
73
+ }
74
+
75
+
76
+
77
+ if (transform.position.y < -7)
78
+
79
+ {
80
+
81
+ SceneManager.LoadScene("SampleScene");
82
+
83
+ }
84
+
85
+ }
86
+
87
+
88
+
89
+ /// <summary>
90
+
91
+ /// 接地判定をする。
92
+
93
+ /// </summary>
94
+
95
+ /// <returns>接地している⇒true、空中にいる⇒false</returns>
96
+
97
+ bool IsGrounded()
98
+
99
+ {
100
+
101
+ Vector2 start = this.transform.position;
102
+
103
+ Vector2 end = start - groundCheckLength * (Vector2)this.transform.up;
104
+
105
+ Debug.DrawLine(start, end);
106
+
107
+ return Physics2D.Linecast(start, end, layerMask);
108
+
109
+ }
110
+
111
+ }
112
+
113
+
114
+
115
+
116
+
117
+ ```

1

質問の意図を間違えた

2020/07/04 19:59

投稿

bboydaisuke
bboydaisuke

スコア5308

test CHANGED
@@ -1,119 +1 @@
1
- こんな感じでしょう。
2
-
3
- 長々と書いていますが、要は「自分が地面の上に立っているか空中にいるかを判定し、地面の上に立っている時は左右に移動できるが、空中に入る時は左右に移動できない」ようにすればよいです。
4
-
5
-
6
-
7
- ```csharp
8
-
9
- using UnityEngine;
10
-
11
- using UnityEngine.SceneManagement;
12
-
13
-
14
-
15
- public class PlayerController2D : MonoBehaviour
16
-
17
- {
18
-
19
- Rigidbody2D rb2d;
20
-
21
- [SerializeField] float jumpforce = 1000.0f;
22
-
23
- [SerializeField] float walkspeed = 80.0f;
24
-
25
- [SerializeField] float maxWalkspeed = 10.0f;
1
+ 質問の意図を「空中制御ができないようにしたい」と勘違いしたのでいったん内容を削除します。
26
-
27
- /// <summary>接地判定の長さ</summary>
28
-
29
- [SerializeField] float groundCheckLength = 1f;
30
-
31
- /// <summary>「地面」と判定するオブジェクトのレイヤーを指定する。自分のいるレイヤーは含めないこと。</summary>
32
-
33
- [SerializeField] LayerMask layerMask = ~0;
34
-
35
-
36
-
37
- void Start()
38
-
39
- {
40
-
41
- this.rb2d = GetComponent<Rigidbody2D>();
42
-
43
- }
44
-
45
-
46
-
47
- void Update()
48
-
49
- {
50
-
51
- float h = Input.GetAxisRaw("Horizontal");
52
-
53
- if (IsGrounded() &&
54
-
55
- ((rb2d.velocity.x < maxWalkspeed && h > 0)
56
-
57
- || (rb2d.velocity.x > -1 * maxWalkspeed && h < 0)))
58
-
59
- {
60
-
61
- Vector2 dir = (h * Vector2.right).normalized;
62
-
63
- rb2d.AddForce(dir * walkspeed);
64
-
65
- }
66
-
67
-
68
-
69
- if (Input.GetButtonDown("Jump") && IsGrounded())
70
-
71
- {
72
-
73
- this.rb2d.AddForce(transform.up * this.jumpforce);
74
-
75
- }
76
-
77
-
78
-
79
- if (transform.position.y < -7)
80
-
81
- {
82
-
83
- SceneManager.LoadScene("SampleScene");
84
-
85
- }
86
-
87
- }
88
-
89
-
90
-
91
- /// <summary>
92
-
93
- /// 接地判定をする。Inspector から layerMask に「地面」のレイヤーを指定すること。
94
-
95
- /// </summary>
96
-
97
- /// <returns>接地している⇒true、空中にいる⇒false</returns>
98
-
99
- bool IsGrounded()
100
-
101
- {
102
-
103
- Vector2 start = this.transform.position;
104
-
105
- Vector2 end = start - groundCheckLength * (Vector2)this.transform.up;
106
-
107
- Debug.DrawLine(start, end);
108
-
109
- return Physics2D.Linecast(start, end, layerMask);
110
-
111
- }
112
-
113
- }
114
-
115
-
116
-
117
-
118
-
119
- ```