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

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

ただいまの
回答率

90.48%

  • C#

    7432questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    4199questions

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

  • Unity3D

    1360questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity3Dでの<Rigidbody>().velocityを用いた斜め前ジャンプについて

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 561

mikaduki444

score 2

 前提・実現したいこと

unity3DでGetCompornent<Rigidbody>().velocityを用いてキャラクターの向いている方向の正面斜め上(0,1,1)にジャンプさせたいのですが、以下のソースコードでは何故か上方向にしか力がかからずその場ジャンプになってしまいます。
エラー等は発生せず実行は可能です。

 該当のソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Jumper : MonoBehaviour
{

    Vector3 force;
    new Rigidbody rigidbody;

    void OnTriggerExit(Collider other)
    {

        Player.animator.SetBool("Walking", false);
        Player.animator.SetBool("Running", false);
        Player.animator.SetBool("Jumping", true);
        StartCoroutine("Jump");
    }

    private IEnumerator Jump()
    {
        rigidbody = MazeStageGeneral.utc.GetComponent<Rigidbody>();
        MazeStageGeneral.utc.GetComponent<Player>().enabled = false;
        MazeStageGeneral.utc.transform.localEulerAngles = transform.localEulerAngles;
        force =(Vector3.up + Vector3.forward) * 3;

        yield return new WaitForSeconds(0.4f);

        GetComponent<ParticleSystem>().Play();
        rigidbody.velocity = force;


        yield return new WaitForSeconds(1f);
        Player.animator.SetBool("Jumping", false);
        MazeStageGeneral.utc.GetComponent<Player>().enabled = true;
    }
}

 Player.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player: MonoBehaviour
{
    [SerializeField] Vector3 velocity;             //移動方向
    public static float speed = 2.0f;           //移動速度
    [SerializeField] float rotation = 0.2f;        //回転速度
    public static Animator animator;

    void Start()
    {
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        velocity = Vector3.zero;

        if(Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.UpArrow))
        {
            animator.SetBool("Walking", true);
            if (!ForestSound.footsteps.isPlaying) { ForestSound.footsteps.PlayOneShot(ForestSound.footsteps.clip); }

            if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
            {
                speed = 5.0f;
                if (!ForestSound.footsteps.isPlaying) { ForestSound.footsteps.PlayOneShot(ForestSound.footsteps.clip); }
                animator.SetBool("Walking", false);
                animator.SetBool("Running", true);
            }
            if (Input.GetKeyUp(KeyCode.LeftShift) || Input.GetKeyUp(KeyCode.RightShift))
            {
                speed = 2.0f;
                if (ForestSound.footsteps.isPlaying) { ForestSound.footsteps.Stop(); }
                animator.SetBool("Running", false);
                animator.SetBool("Walking", true);
            }
        }
        else
        {
            animator.SetBool("Walking", false);
            animator.SetBool("Running", false);
            if (ForestSound.footsteps.isPlaying) { ForestSound.footsteps.Stop(); }
        }

        if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
        {
            //移動(X軸、Y軸、Z軸)
            velocity.x += 1;
        }
        if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
        {
            velocity.x -= 1;
        }
        if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
        {
            velocity.z += 1;
        }
        if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
        {
            velocity.z -= 1;
        }
        if ((Input.GetKey(KeyCode.W)&& Input.GetKey(KeyCode.A)) || (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.LeftArrow)))
        {
            velocity.x -= 1;
            velocity.z += 1;
        }
        if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.D) || (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.RightArrow)))
        {
            velocity.x += 1;
            velocity.z += 1;
        }
        if (Input.GetKey(KeyCode.S) && Input.GetKey(KeyCode.A) || (Input.GetKey(KeyCode.DownArrow) && Input.GetKey(KeyCode.LeftArrow)))
        {
            velocity.x -= 1;
            velocity.z -= 1;
        }
        if (Input.GetKey(KeyCode.S) && Input.GetKey(KeyCode.D) || (Input.GetKey(KeyCode.DownArrow) && Input.GetKey(KeyCode.RightArrow)))
        {
            velocity.x += 1;
            velocity.z -= 1;
        }

        velocity = velocity.normalized * speed * Time.deltaTime;
        if(velocity.magnitude > 0)
        {
            transform.position += velocity;
            transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(velocity), rotation);
        }

    }

}

 試したこと

AddForceなども試しましたが挙動が怪しく、velocityで実装したい所存です。

 補足情報(FW/ツールのバージョンなど)

Unity 2017.3.1f1 Personal(64bit)
Microsoft Visual Studio 2016
windows10

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • Bongo

    2018/05/29 12:53

    念のため確認したいのですが、MazeStageGeneral.utcのRigidbodyには「Freeze Position」あたりのチェックは入れていませんよね?その前提で、ご提示のスクリプト以外にMazeStageGeneral.utcの動きに影響を与えるコードがあれば、それもご提示いただけると回答がつきやすくなりそうです。私の見たところ、「キャラクターの向いている方向の正面斜め上にジャンプさせたい」という意図に反して、速度を与える方向がワールド座標系での固定方向になっている疑いがあるのですが、それにしても真上にしかジャンプしてくれないという現象がいまいち説明がつかないのです。他のスクリプトが何か悪さをしてはいないか気になりますが、可能性はあるでしょうか?

    キャンセル

  • mikaduki444

    2018/05/30 00:02

    確認したところ「Freeze Rotate」ではz,xにチェックを入れていますが、「Freeze Position」にはチェックは入れていませんでした。また、utcに影響を与えていそうなものとして、スクリプト内で無効にはしていますが、念のためPlayer.csを記載します。

    キャンセル

回答 1

0

キャラクターにアタッチされていると思われる「Animator」コンポーネントのチェックを外して無効化した場合、動きはどうなるでしょうか?
もしチェックを外せば斜めに跳ぶようになるようでしたら、スクリプトから与えたキャラクターの動きをアニメーションが上書きしてしまって正しい方向に跳ばない可能性がありそうです(参考:Unity5でRoot Motionを利用したアニメーションと、その注意点について - テラシュールブログ)。

Jumpメソッドに少々手を加えて、ジャンプコルーチン実行中はapplyRootMotionをオフにしてみました。
ですが、もし他のアニメーションもルートモーション不適用で問題ないなら、コードは元のままにして、インスペクタ上でキャラクターの「Animator」コンポーネントの「Apply Root Motion」をオフにするだけでもいいかと思います。

    private IEnumerator Jump()
    {
        // ルートモーションの適用設定が疑わしい?
        // 現在のapplyRootMotionを覚えておいて、一旦applyRootMotionは切る
        var applyRootMotion = Player.animator.applyRootMotion;
        Player.animator.applyRootMotion = false;

        rigidbody = MazeStageGeneral.utc.GetComponent<Rigidbody>();
        MazeStageGeneral.utc.GetComponent<Player>().enabled = false;
        MazeStageGeneral.utc.transform.localEulerAngles = transform.localEulerAngles;

        // コメントで申し上げた「与える速度がワールド座標に対する固定方向になっている疑い」に関する修正...
        // 上方向はVector3.upでいいと思いますが、前方向としてVector3.forwardを与えてしまうと
        // キャラクターの向きにかかわらずZ軸+方向に跳んでしまうのではないでしょうか?
        // ご質問の文面から想像すると、前方ベクトルとしてはキャラクターのforwardの方が適切かと思います
        // (Vector3.forwardの方が意図通りの動きであれば、この修正は不要なので元に戻してしまってください)
        force = (Vector3.up + MazeStageGeneral.utc.transform.forward) * 3;

        yield return new WaitForSeconds(0.4f);
        GetComponent<ParticleSystem>().Play();
        rigidbody.velocity = force;

        yield return new WaitForSeconds(1f);
        Player.animator.SetBool("Jumping", false);
        MazeStageGeneral.utc.GetComponent<Player>().enabled = true;

        // applyRootMotionを元に戻す
        Player.animator.applyRootMotion = applyRootMotion;
    }

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • C#

    7432questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    4199questions

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

  • Unity3D

    1360questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。