回答編集履歴
1
ミス修正
answer
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
提示されているスクリプトを見るに二つのスクリプトを混ぜたと思われますが、Qiitaのスクリプトのみで上手くいくと思います。
|
2
|
-
なので、一度Qiitaのスクリプトまるまるコピーし、操作キャラにアタッチ(スクリプトを付ける)してみてください。
|
2
|
+
~~なので、一度Qiitaのスクリプトまるまるコピーし、操作キャラにアタッチ(スクリプトを付ける)してみてください。~~
|
3
3
|
|
4
|
+
**追記**
|
5
|
+
すいません、これ3D用のスクリプトですね、そりゃ上手く動かない訳です...。
|
6
|
+
2Dと3Dでは少々変更が必要なので手を加えます。
|
7
|
+
|
4
8
|
とりあえずはQiitaのスクリプトのみを説明します。
|
5
9
|
> *speedがどこから取得されているのか(定義しているだけのように感じた)
|
6
10
|
|
@@ -11,23 +15,51 @@
|
|
11
15
|
> *Rigidbodyを取得することに何の意味があるのか。
|
12
16
|
|
13
17
|
このスクリプトでは`rigd.velocity`で移動を行っています、恐らく目にする機会が多い移動方法は`tarnsform.position`を使った移動方法だと思いますが、これは正確には自身の居場所をワープさせるような移動の方法なので、壁をすり抜けたりする可能性を秘めています。
|
14
|
-
なので、
|
18
|
+
なので、Rigidbody2Dを用いた移動方法にしているんじゃないでしょうか。
|
15
19
|
|
16
20
|
> どのようにすれば望んだ結果が得られるのか
|
17
21
|
|
18
22
|
このスクリプト内の以下の部分が肝ですね。
|
19
|
-
`
|
23
|
+
`Vector2 diff = transform.position - Player_pos;`の部分で進行方向の向き(ベクトル)を取ります。この式は割とよく見かけます。
|
20
24
|
で、ifの条件は入力がある時の場合のみ、という感じの条件になってます。
|
21
25
|
それから得たベクトルを基に回転させる、といった処理になっていると思います。
|
22
26
|
|
23
27
|
|
24
28
|
```cs
|
29
|
+
using System.Collections;
|
25
|
-
|
30
|
+
using System.Collections.Generic;
|
31
|
+
using UnityEngine;
|
26
32
|
|
33
|
+
public class Player : MonoBehaviour {
|
34
|
+
|
35
|
+
public float speed; //プレイヤーの動くスピード
|
36
|
+
|
37
|
+
private Vector3 Player_pos; //プレイヤーのポジション
|
38
|
+
private float x; //x方向のImputの値
|
39
|
+
private float y; //y方向のInputの値
|
40
|
+
private Rigidbody2D rigd;
|
41
|
+
|
42
|
+
void Start()
|
43
|
+
{
|
44
|
+
Player_pos = GetComponent<Transform>().position; //最初の時点でのプレイヤーのポジションを取得
|
45
|
+
rigd = GetComponent<Rigidbody2D>(); //プレイヤーのRigidbodyを取得
|
46
|
+
}
|
47
|
+
|
48
|
+
void Update()
|
49
|
+
{
|
50
|
+
x = Input.GetAxis("Horizontal"); //x方向のInputの値を取得
|
51
|
+
y = Input.GetAxis("Vertical"); //z方向のInputの値を取得
|
52
|
+
|
53
|
+
rigd.velocity = new Vector2(x * speed, y * speed); //プレイヤーのRigidbodyに対してInputにspeedを掛けた値で更新し移動
|
54
|
+
|
55
|
+
Vector2 diff = transform.position - Player_pos; //プレイヤーがどの方向に進んでいるかがわかるように、初期位置と現在地の座標差分を取得
|
56
|
+
|
27
57
|
if (diff.magnitude > 0.01f) //ベクトルの長さが0.01fより大きい場合にプレイヤーの向きを変える処理を入れる(0では入れないので)
|
28
58
|
{
|
29
59
|
transform.rotation = Quaternion.LookRotation(diff); //ベクトルの情報をQuaternion.LookRotationに引き渡し回転量を取得しプレイヤーを回転させる
|
30
60
|
}
|
31
61
|
|
32
62
|
Player_pos = transform.position; //プレイヤーの位置を更新
|
63
|
+
}
|
64
|
+
}
|
33
65
|
```
|