質問編集履歴

3 修正

Z_Silver

Z_Silver score 25

2019/05/15 22:24  投稿

Unity ジャンプ処理で連続でクリック(タップ)を行うと地面の着地する前に判定してキャラクターが不自然なジャンプしてしまいます
###前提・実現したいこと
自作のランゲームを作っているのですが
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
になります。
**改良したソースコード**
// コライダーのフィルター(追加)
   [SerializeField] ContactFilter2D filter2d = default;
//地面レイヤー判定(改良)
       if (GetComponent<Rigidbody2D>().IsTouching(filter2d))
       {
           isGroud = true;
       }
  • C#

    12574 questions

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

  • Unity

    8526 questions

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

  • Unity2D

    2086 questions

2 修正

Z_Silver

Z_Silver score 25

2019/05/15 19:49  投稿

Unity ジャンプ処理で連続でクリック(タップ)を行うと地面の着地する前に判定してキャラクターが不自然なジャンプしてしまいます
###前提・実現したいこと
自作のランゲームを作っているのですが
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
になります。
になります。
**改良したソースコード**
// コライダーのフィルター(追加)
   [SerializeField] ContactFilter2D filter2d = default;
//地面レイヤー判定(改良)
       if (GetComponent<Rigidbody2D>().IsTouching(filter2d))
       {
           isGroud = true;
       }
  • C#

    12574 questions

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

  • Unity

    8526 questions

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

  • Unity2D

    2086 questions

1 修正

Z_Silver

Z_Silver score 25

2019/05/13 22:19  投稿

Unity ジャンプ処理で連続でクリック(タップ)を行うと地面の着地する前に判定してキャラクターが不自然なジャンプしてしまいます
###前提・実現したいこと
自作のランゲームを作っているのですが
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
になります。
  • C#

    12574 questions

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

  • Unity

    8526 questions

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

  • Unity2D

    2086 questions

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る