回答編集履歴

2

参考コードを追加

2019/01/14 05:14

投稿

negitama
negitama

スコア943

test CHANGED
@@ -16,10 +16,108 @@
16
16
 
17
17
 
18
18
 
19
- 説明
19
+ #### 説明
20
20
 
21
21
  - 質問のコードでは、【hit.point】にはカメラからマウス位置に向かうRayが、Groundタグのオブジェクトとぶつかった【位置】が格納されています。
22
22
 
23
23
  - しかし、【direction】には、位置ではなく【発射方向】を格納すべきです。発射方向は【狙う位置 - 発射位置】のベクトル計算で求められるでしょう。
24
24
 
25
25
  - もし muzzle.position の Y 座標が Ground の Y 座標と異なる場合は一致させたほうがよいでしょう(発射方向がY座標の上下にずれるので)。適切に修正してください。
26
+
27
+
28
+
29
+ #### 参考コード
30
+
31
+ 質問のコードでは、撃ち出す側(プレイヤー)と撃ち出される側(弾丸)が混在しているようです。
32
+
33
+ 以下のように修正するのが一案です。
34
+
35
+ ```
36
+
37
+ using System.Collections;
38
+
39
+ using System.Collections.Generic;
40
+
41
+ using UnityEngine;
42
+
43
+
44
+
45
+ public class PlayerShoot : MonoBehaviour
46
+
47
+ {
48
+
49
+ [SerializeField] Transform muzzle; // 射出口
50
+
51
+
52
+
53
+ [SerializeField] GameObject bulletPrefab; // 弾丸オブジェクトのプレハブ
54
+
55
+ [SerializeField] float shootPower; // 撃ち出す力
56
+
57
+
58
+
59
+ void Shoot ( Vector3 dir )
60
+
61
+ {
62
+
63
+ // 弾丸を生成する
64
+
65
+ var bullet = Instantiate(bulletPrefab, muzzle.position, Quaternion.identity);
66
+
67
+
68
+
69
+ // 弾丸に力を加えて飛ばす
70
+
71
+ bullet.GetComponent<Rigidbody> ().AddForce ( dir );
72
+
73
+ }
74
+
75
+
76
+
77
+ private void Update ()
78
+
79
+ {
80
+
81
+ if ( Input.GetMouseButtonDown ( 0 ) )
82
+
83
+ {
84
+
85
+ Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
86
+
87
+ RaycastHit hit;
88
+
89
+
90
+
91
+ if ( Physics.Raycast ( ray, out hit ) )
92
+
93
+ {
94
+
95
+ if ( hit.collider.tag == "Ground" )
96
+
97
+ {
98
+
99
+ // 発射方向を定める
100
+
101
+ Vector3 direction = hit.point - muzzle.position;
102
+
103
+
104
+
105
+ // 発射方向の上下の傾きを無くす
106
+
107
+ direction.y = 0f;
108
+
109
+
110
+
111
+ Shoot ( direction.normalized * shootPower );
112
+
113
+ }
114
+
115
+ }
116
+
117
+ }
118
+
119
+ }
120
+
121
+ }
122
+
123
+ ```

1

説明追記

2019/01/14 05:14

投稿

negitama
negitama

スコア943

test CHANGED
@@ -11,3 +11,15 @@
11
11
 
12
12
 
13
13
  にしてみてはどうですか?
14
+
15
+
16
+
17
+
18
+
19
+ 【説明】
20
+
21
+ - 質問のコードでは、【hit.point】にはカメラからマウス位置に向かうRayが、Groundタグのオブジェクトとぶつかった【位置】が格納されています。
22
+
23
+ - しかし、【direction】には、位置ではなく【発射方向】を格納すべきです。発射方向は【狙う位置 - 発射位置】のベクトル計算で求められるでしょう。
24
+
25
+ - もし muzzle.position の Y 座標が Ground の Y 座標と異なる場合は一致させたほうがよいでしょう(発射方向がY座標の上下にずれるので)。適切に修正してください。