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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1761閲覧

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

Z_Silver

総合スコア27

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/05/13 12:33

編集2019/05/15 13:24

###前提・実現したいこと
自作のランゲームを作っているのですが
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 になります。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

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

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

投稿2019/05/14 02:32

ganta7188

総合スコア436

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Z_Silver

2019/05/14 18:27 編集

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

2019/05/15 10:51 編集

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

2019/05/16 00:05

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

2019/05/16 15:47

k.matsuda様、ご回答ありがとうございます。 こちらの問題は https://teratail.com/questions/189613 にて別枠で質問し無事問題が解決しましたので報告いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問