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

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

ただいまの
回答率

90.51%

  • C#

    9062questions

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

  • Unity

    5521questions

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

  • Unity2D

    1271questions

Unity ジャンプ処理で連続でクリック(タップ)を行うと地面の着地する前に判定してキャラクターが不自然なジャンプしてしまいます

解決済

回答 1

投稿 編集

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

Z_Silver

score 6

前提・実現したいこと

自作のランゲームを作っているのですが
1回だけクリック(タップ)した際はキャラクターがジャンプし地面に着地するまで
問題ないのですが、ひたすら連続でクリック(タップ)を行うと地面に着地前にジャンプ処理に
入っているみたいで「ジャンプ➔小ジャンプ」みたいな不自然な挙動になっております。

これはジャンプ処理にクールタイムみたいな処理を追加すべきなのでしょうか?
それともコールチン処理でタイミングを取った方がいいのでしょうか?

回答よろしくお願いします。

該当のソースコード

    private const float SPEED = 6.5f;   //移動速度固定
    private float moveSpeed;            //移動速度
    private float JumpPower = 450f;    //ジャンプ力
    private bool isGroud = false;     //地面着地判定

    private float lastMovingTime = 0;       //移動前用の時間

    public enum PLAYER_STATE                //キャラの状態を定義
    {
        STOP,   //停止中
        MOVE,   //移動中
        DOWN,   //ヤラレタ
    };
  public PLAYER_STATE playerState = PLAYER_STATE.STOP;//キャラの状態(停止)

--------------省略--------------------

void FixedUpdate(){
        switch (playerState)
        {
            case PLAYER_STATE.STOP://停止中
                moveSpeed = 0;
                break;
            case PLAYER_STATE.MOVE://移動中
                moveSpeed = SPEED;
                break;
            case PLAYER_STATE.DOWN://敵や壁にぶつかった
                moveSpeed = -3f;
                isAlive = false;
                break;
        }
        //キャラの移動
        rd2D.velocity = new Vector2(moveSpeed, rd2D.velocity.y);

        //ジャンプアニメーション制御
        float velY = rd2D.velocity.y;
        animator.SetFloat ("velY", velY);
        animator.SetBool ("isGround", isGroud);
    }
void Update () {
        //待機モード処理(タップされるまで)
        if (gameController.gameMode == GameController.GAME_MODE.READY)
        {
            animator.SetBool("isDash", false);  //ダッシュアニメフラグ停止

            if (Input.GetMouseButtonDown(0))
            {
                lastMovingTime = Time.realtimeSinceStartup;//ボタン押した時間を保存

                gameController.GameStart();         //ゲームスタートへ
                playerState = PLAYER_STATE.MOVE;    //キャラの状態(移動中へ)
            }
        }

        if(playerState == PLAYER_STATE.MOVE)
        {
            animator.SetBool("isDash", true);//ダッシュアニメフラグ開始
        }

        //地面レイヤー判定
        isGroud = Physics2D.Linecast (
            transform.position + transform.up * 1,
            transform.position - transform.up * 0.1f,
            grundLayer);


        //ボタンをクリック(タップ)した時
        if (isGroud && Input.GetMouseButtonDown(0))
        {
#if UNITY_EDITOR
            //ボタンを押した場合画面のタッチは無視する
            if (EventSystem.current.IsPointerOverGameObject())
            {
                return;
            }
#else
            //スマートフォン用
            if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
            {
                return;
            }
#endif
            //開始直後にタップを一時無効化(タップでゲームを開始した直後にジャンプ処理させないため)
            if (Time.realtimeSinceStartup - lastMovingTime > 0.0f)
            {
                //ヤラレタ場合,ステージクリアエリアに入った場合ジャンプ不可
                if ((playerState == PLAYER_STATE.DOWN)||(!isAlive)){
                    return;
                }

                animator.SetBool("isDash", false);      //ダッシュアニメフラグ
                animator.SetTrigger("Jump");            //ジャンプトリガー
                rd2D.AddForce(Vector2.up * JumpPower);  //ジャンプ力分上に加速
                isGroud = false;                        //地面レイヤー判定を戻す
            }
        }
    }

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

Unity 2018.3.11f1
言語:C#

ゲーム開始後は設置している(一時停止等の)ボタン以外のどの画面を
クリック(タップ)しても、ジャンプ処理に入るようにしています。

主なゲームの流れ
REDY(待機)➔クリック(タップ)➔GameStart(ゲーム開始)
➔GameOver
➔GameClear
になります。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

恐らくですが、接地判定の問題だと思います。
この接地判定では、ジャンプした直後、少し地面から浮いたタイミングでジャンプボタンを押すと、
isGroundはtrueになっているのではないでしょうか?

LineCastの長さを調節してみてください。
(今はtransform.up * 1 ~ transform.up * 0.1の長さですね)

RaycastやLineCastを使わない方法もあるので試してみてください。

参考:
http://tsubakit1.hateblo.jp/entry/2018/04/07/234028

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/15 03:26 編集

    ご回答ありがとうございます。
    LineCastの長さを調節して少し改善しました。(後は徐々に調整が必要かと思います)
    また参考サイト通りRaycastやLineCastを使わない方法を試して問題なければこちらを採用したいと思います。
    ありがとうございました。

    キャンセル

  • 2019/05/15 19:45 編集

    LineCastを使わない方法でサイトを参考に
    if (GetComponent<Rigidbody2D>().IsTouching(filter2d))
    {
    isGroud = true;
    }
    と追加しジャンプ処理を追加しましたが
    なぜか2段ジャンプになってしまいました?
    もう少し調べてそれでも改善しない場合は別枠で質問したいと思います。

    キャンセル

  • 2019/05/16 09:05

    ジャンプ直後に、isGroundがtrueに戻ってしまっているのかもしれませんね。

    Jumpのトリガーが入った直後は、isGroundがtrueに戻らないようにする処理が必要かもしれません。

    キャンセル

  • 2019/05/17 00:47

    k.matsuda様、ご回答ありがとうございます。

    こちらの問題は
    https://teratail.com/questions/189613
    にて別枠で質問し無事問題が解決しましたので報告いたします。

    キャンセル

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

  • C#

    9062questions

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

  • Unity

    5521questions

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

  • Unity2D

    1271questions

  • トップ
  • C#に関する質問
  • Unity ジャンプ処理で連続でクリック(タップ)を行うと地面の着地する前に判定してキャラクターが不自然なジャンプしてしまいます