unity 3Dキャラ視点での移動方法
- 評価
- クリップ 1
- VIEW 9,978
現在unityちゃんを使って移動をしています。
3Dゲーム開発講座を使っているのですが、
移動方法がワールド座標での方向固定でカメラをキャラに追尾させても
歩く方向はやはりかわりません
どこにいても
右を押したら右に、
上を押したら画面奥に
下を押したら画面手前側に、
左を押したら左に移動する方法をおしえてください!
+++++++++++++++++++追記++++++++++++++++
調べてここまでは作成することができました。
前左右は問題ないのですが、後ろだけワールド座標の動きになり、かならず同じ向きに下がります。
それに加えバックするときだけがたがたします。
using UnityEngine;
using System.Collections;
public class Player : MonoBehaviour {
Vector3 direction;
//移動速度
public float move_speed = 5f;
//回転速度
public float rotate_speed = 180f;
//ジャンプ速度
public float jump_speed = 5f;
//重力
private float gravity=20f;
//アニメーターコンポーネント
Animator anim;
//キャラコントローラー
CharacterController chara;
Transform cam_trans;
// Use this for initialization
void Start () {
chara = GetComponent<CharacterController>();
anim = GetComponentInChildren<Animator>();
cam_trans = GameObject.Find("Main Camera").GetComponent<Transform>();
}
// Update is called once per frame
void Update () {
if (chara.isGrounded)
{
// direction = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));
direction = (cam_trans.transform.right * Input.GetAxis("Horizontal")) +
(cam_trans.transform.forward * Input.GetAxis("Vertical"));
if (direction.sqrMagnitude > 0.01f)
{
Vector3 forward = Vector3.Slerp(transform.forward, direction, rotate_speed * Time.deltaTime / Vector3.Angle(transform.forward, direction));
transform.LookAt(transform.position + forward);
}
if (Input.GetKeyDown(KeyCode.Space))
{
direction.y = jump_speed;
}
}
direction.y -= gravity * Time.deltaTime;
chara.Move(direction * Time.deltaTime * move_speed);
anim.SetFloat("Speed", chara.velocity.magnitude);
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
下記のURLを参考にするといいかもしれません。
URL先にも記載されていると思われますが、
まずカメラの現在の方向ベクトル(forward,right)を数値で取り、
その数値で十字キーの上下左右(Vartical,Horizontal)に補正をかけて
コントローラーに入れ込むと動いてくれるはずです。
http://stepism.sakura.ne.jp/unity/wiki/doku.php?id=wiki:unity:tips:040
ちなみに、CharacterControllerを使わなくても
ゲームオブジェクト自体に移動ベクトルを入れ込むだけで動かすこともできました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
check解決した方法
0
後ろに下がるときになぜ向きが固定されるのか
なぜ前は問題ないのに・・・
と思っていましたが
よくよく考えると前はもう向いているので変換が起こってないように見えてもおかしくありませんでした。
using UnityEngine;
using System.Collections;
public class Player : MonoBehaviour {
Vector3 direction;
//移動速度
public float move_speed = 5f;
//回転速度
public float rotate_speed = 180f;
//ジャンプ速度
public float jump_speed = 5f;
//重力
private float gravity=20f;
//アニメーターコンポーネント
Animator anim;
//キャラコントローラー
CharacterController chara;
Transform cam_trans;
// Use this for initialization
void Start () {
chara = GetComponent<CharacterController>();
anim = GetComponentInChildren<Animator>();
cam_trans = GameObject.Find("Main Camera").GetComponent<Transform>();
}
// Update is called once per frame
void Update () {
if (chara.isGrounded)
{
// direction = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));
direction = (cam_trans.transform.right * Input.GetAxis("Horizontal")) +
(cam_trans.transform.forward * Input.GetAxis("Vertical"));
Debug.Log(direction.sqrMagnitude);
if (direction.sqrMagnitude > 0.1f && Input.GetAxis("Vertical")==0)
{
Vector3 forward = Vector3.Slerp(transform.forward, direction, rotate_speed * Time.deltaTime / Vector3.Angle(transform.forward, direction));
transform.LookAt(transform.position + forward);
}
if (Input.GetKeyDown(KeyCode.Space))
{
direction.y = jump_speed;
}
}
direction.y -= gravity * Time.deltaTime;
chara.Move(direction * Time.deltaTime * move_speed);
anim.SetFloat("Speed", chara.velocity.magnitude);
}
}
とすることで成功しました。
if (direction.sqrMagnitude > 0.1f )を
if (direction.sqrMagnitude > 0.1f && Input.GetAxis("Vertical")==0)に変えただけです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
//WASDでの操作を想定しています。
if(Input.GetKey(KeyCode.W))/*動かすもの*/.transform.posiotion += camera.transform.forward;
if(Input.GetKey(KeyCode.S))/*動かすもの*/.transform.posiotion -= camera.transform.forward;
if(Input.GetKey(KeyCode.A))/*動かすもの*/.transform.posiotion -= camera.transform.right;
if(Input.GetKey(KeyCode.D))/*動かすもの*/.transform.posiotion += camera.transform.right;
としてみるのはどうでしょうか?
もしくは、こちらのサイトはどうでしょうか?
リンク
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.31%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/02/26 22:25
視点を前として移動はするのですが
回転したらそれが前になるようにしたいのです。