質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.38%

  • Unity

    5835questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

unity 3Dキャラ視点での移動方法

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 8,057

yzccdefine

score 54

現在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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

下記のURLを参考にするといいかもしれません。

URL先にも記載されていると思われますが、
まずカメラの現在の方向ベクトル(forward,right)を数値で取り、
その数値で十字キーの上下左右(Vartical,Horizontal)に補正をかけて
コントローラーに入れ込むと動いてくれるはずです。

http://stepism.sakura.ne.jp/unity/wiki/doku.php?id=wiki:unity:tips:040

ちなみに、CharacterControllerを使わなくても
ゲームオブジェクト自体に移動ベクトルを入れ込むだけで動かすこともできました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/26 22:25

    すみません自分の質問の仕方が悪かったです;;


    視点を前として移動はするのですが
    回転したらそれが前になるようにしたいのです。

    キャンセル

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)に変えただけです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.38%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Unity

    5835questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。