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

回答編集履歴

1

ミス修正

2020/01/10 06:27

投稿

Y0241-N
Y0241-N

スコア1066

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
- なので、Rigidbodyを用いた移動方法にしているんじゃないでしょうか。
18
+ なので、Rigidbody2Dを用いた移動方法にしているんじゃないでしょうか。
15
19
 
16
20
  > どのようにすれば望んだ結果が得られるのか
17
21
 
18
22
  このスクリプト内の以下の部分が肝ですね。
19
- `Vector3 diff = transform.position - Player_pos;`の部分で進行方向の向き(ベクトル)を取ります。この式は割とよく見かけます。
23
+ `Vector2 diff = transform.position - Player_pos;`の部分で進行方向の向き(ベクトル)を取ります。この式は割とよく見かけます。
20
24
  で、ifの条件は入力がある時の場合のみ、という感じの条件になってます。
21
25
  それから得たベクトルを基に回転させる、といった処理になっていると思います。
22
26
 
23
27
 
24
28
  ```cs
29
+ using System.Collections;
25
- Vector3 diff = transform.position - Player_pos; //プレイヤーがどの方向に進んでいるかがわかるように、初期位置と現在地の座標差分を取得
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
  ```