質問編集履歴

1

スクリプト全体の表示、タグについて、handの書き換わる瞬間についてを追記しました。

2020/07/27 08:59

投稿

teratail-08
teratail-08

スコア1

test CHANGED
File without changes
test CHANGED
@@ -2,9 +2,11 @@
2
2
 
3
3
  Unityで簡単な壁当てのようなプログラムを作りたいと思い床と壁とボールとプレイヤーのオブジェクトのみでプロジェクトを作りました。
4
4
 
5
- ボールと接触したときにボールを持、持ってる状態でスペースキー入力で投げるようにしています。
5
+ スクリプトはプレイヤーにのみ付いていて移動、ボールと接触したときにボールを持、持ってる状態でスペースキー入力で投げるの3つのみの動作です。
6
6
 
7
7
 
8
+
9
+ タグについてボールにのみBallタグを付けそれ以外はUntaggedになっています。
8
10
 
9
11
  ### 発生している問題
10
12
 
@@ -16,89 +18,165 @@
16
18
 
17
19
  `MissingComponentException: There is no 'Rigidbody' attached to the "Wall" game object, but a script is trying to access it.`
18
20
 
19
- ### 該当のソースコード
21
+ ### プレイヤについたクリプト
20
-
21
- 掴み部分
22
22
 
23
23
  ```C#
24
24
 
25
+ using System.Collections;
26
+
25
- void OnCollisionEnter(Collision collision)
27
+ using System.Collections.Generic;
28
+
29
+ using UnityEngine;
30
+
31
+
32
+
33
+ public class PlayerControl : MonoBehaviour
26
34
 
27
35
  {
28
36
 
29
- if (collision.gameObject.tag=="Ball" && hand==null)
37
+ public float speed = 5f;
30
38
 
31
- {
39
+ public float rotateSpeed = 120f;
32
40
 
33
- Debug.Log("catch");
41
+ public float power = 1;
34
42
 
35
- hand = collision;
43
+ private Collision hand =null;
36
44
 
37
-   //プレイヤーについてくるように
38
45
 
39
- hand.transform.parent = transform;
40
46
 
41
- hand.collider.isTrigger = true;
47
+ void FixedUpdate()
42
48
 
43
- Rigidbody RB = hand.gameObject.GetComponent<Rigidbody>();
49
+ {
44
50
 
45
- RB.isKinematic = true;
46
51
 
47
- //プレイヤーの右前
48
52
 
49
- hand.transform.localPosition= new Vector3(0.5f, 0, 0.5f);
53
+ float h = Input.GetAxis("Horizontal");
50
54
 
55
+ float v = Input.GetAxis("Vertical");
56
+
57
+
58
+
59
+ Vector3 velocity = new Vector3(0, 0, v);
60
+
61
+
62
+
63
+ // キャラクターのローカル空間での方向に変換
64
+
65
+ velocity = transform.TransformDirection(velocity);
66
+
67
+
68
+
69
+ // キャラクターの移動
70
+
71
+ transform.localPosition += velocity * speed * Time.fixedDeltaTime;
72
+
73
+
74
+
75
+ // キャラクターの回転
76
+
77
+ transform.Rotate(0, h * rotateSpeed * Time.fixedDeltaTime, 0);
78
+
79
+
80
+
81
+
82
+
51
- }
83
+ }
84
+
85
+
86
+
87
+ void OnCollisionEnter(Collision collision)
88
+
89
+ {
90
+
91
+ Debug.Log(collision.gameObject.name);
92
+
93
+ if (collision.gameObject.tag=="Ball" && hand==null)
94
+
95
+ {
96
+
97
+ Debug.Log("catch");
98
+
99
+
100
+
101
+ hand = collision;
102
+
103
+ hand.transform.parent = transform;
104
+
105
+ hand.collider.isTrigger = true;
106
+
107
+ Rigidbody RB = hand.gameObject.GetComponent<Rigidbody>();
108
+
109
+ RB.isKinematic = true;
110
+
111
+ hand.transform.localPosition= new Vector3(0.5f, 0, 0.5f);
112
+
113
+ hand.transform.Rotate(0, 0, 0);
114
+
115
+ }
116
+
117
+ }
118
+
119
+
120
+
121
+ // Start is called before the first frame update
122
+
123
+ void Start()
124
+
125
+ {
126
+
127
+
128
+
129
+ }
130
+
131
+
132
+
133
+ // Update is called once per frame
134
+
135
+ void Update()
136
+
137
+ {
138
+
139
+ if (hand != null && Input.GetKeyDown(KeyCode.Space))
140
+
141
+ {
142
+
143
+ hand.transform.Rotate(0, 0, 0);
144
+
145
+ hand.transform.localPosition = new Vector3(0, 0, 1.5f);
146
+
147
+ hand.collider.isTrigger = false;
148
+
149
+ Rigidbody RB = hand.gameObject.GetComponent<Rigidbody>();
150
+
151
+ RB.isKinematic = false;
152
+
153
+ RB.AddForce(hand.transform.forward * power);
154
+
155
+ hand.transform.parent = null;
156
+
157
+ Debug.Log(hand.transform.parent);
158
+
159
+ hand = null;
160
+
161
+ Debug.Log("Release");
162
+
163
+ }
164
+
165
+ }
52
166
 
53
167
  }
54
168
 
55
169
  ```
56
170
 
57
- 投げ部分
171
+ プレイヤーの移動に関しては[こちら](http://taka8.hateblo.jp/entry/2016/09/03/185916)のサイトを参考にさせていただきました。
58
172
 
59
- ```c#
60
-
61
- void Update()
62
-
63
- {
64
-
65
- if (hand != null && Input.GetKeyDown(KeyCode.Space))
66
-
67
- {
68
-
69
- //移動してから飛ばす
70
-
71
- hand.transform.Rotate(0, 0, 0);
72
-
73
- hand.transform.localPosition = new Vector3(0, 0, 1.5f);
74
-
75
- hand.collider.isTrigger = false;
76
-
77
- Rigidbody RB = hand.gameObject.GetComponent<Rigidbody>();
78
-
79
- RB.isKinematic = false;
80
-
81
- RB.AddForce(hand.transform.forward * power);
82
-
83
- hand.transform.parent = null;
84
-
85
- hand = null;
86
-
87
- Debug.Log("Release");
88
-
89
- }
90
-
91
- }
92
-
93
- ```
94
-
95
- ### 試したこと
173
+ ### 試したこと・わかっていること
96
174
 
97
175
  ボールを掴んでいる時に壁に触れるとログにcatchと表示されずにhandが書き換わっているのでどこが原因か一切わからないです。
98
176
 
99
- handが関わるソースコードは上記の部分だけで代入は一箇所だけだと思うのですが何をしたら良いかもわからない状況です。
100
177
 
101
178
 
179
+ ボール掴み時は常にボールとは接触していますがOnCollisionEnterを利用しているので壁に触れない限り呼ばれません。ログを表示させてみたところボール掴み時に壁に触れた瞬間にhandの中身が書き換わっていてどう手を付ければ良いのかもわかりません。
102
180
 
103
181
  ### 補足情報
104
182