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

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

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

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

Unity

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

Q&A

解決済

1回答

4121閲覧

慣性無しでジャンプ中に自由に横方向に移動できるようにしたい。

tsk1999

総合スコア8

C#

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

Unity

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

0グッド

0クリップ

投稿2020/07/04 12:23

前提・実現したいこと

慣性を無くした状態でジャンプ中物体を自由に横方向に空中移動できるようにしたいです。

発生している問題・エラーメッセージ

ジャンプ中に横移動をするとジャンプによる上昇が途中でキャンセルされてしまいます。

該当のソースコード

public class charakey : MonoBehaviour { Rigidbody2D rigidbody2D; float jumpforce = 1000.0f; float walkspeed = 80.0f; float maxWalkspeed = 10.0f; // Start is called before the first frame update void Start() { this.rigidbody2D = GetComponent<Rigidbody2D>(); float yoko = this.rigidbody2D.velocity.x; float tenkan = this.rigidbody2D.angularVelocity; } // Update is called once per frame void Update() { // ジャンプ if (Input.GetKeyDown(KeyCode.Space)&&this.rigidbody2D.velocity.y==0){ this.rigidbody2D.AddForce(transform.up *this.jumpforce); } //左右移動 int key = 0; if (Input.GetKeyDown(KeyCode.RightArrow)) { Vector2 yoko = Vector2.zero; rigidbody2D.angularVelocity = 0f; }else if (Input.GetKeyDown(KeyCode.LeftArrow)) { Vector2 yoko = Vector2.zero; rigidbody2D.angularVelocity = 0f; } if (Input.GetKey(KeyCode.RightArrow)) key = 1; else if (Input.GetKey(KeyCode.LeftArrow)) key = -1; float speedx = Mathf.Abs(this.rigidbody2D.velocity.x); //スピードに制限をかける if (speedx < this.maxWalkspeed) { this.rigidbody2D.AddForce(transform.right * key * this.walkspeed); } if (transform.position.y < -7) { SceneManager.LoadScene("SampleScene"); } } void Stop() { //this.rigidbody2D.velocity = Vector2.zero; // rigidbody2D.angularVelocity = 0f; } }

試したこと

Stop()を呼び出す方法を止め、特定のキー(左右移動)を押した時のみvelocityを0にしたのですが、ジャンプしながら横移動をすると慣性が発生してしまい床に着地するまで反対方向に物体を移動させることができなくなりました。

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

バージョンは2019.2.9f1です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下の2点を調べるとよいでしょう。

  1. 「接地判定」をして、「接地している時のみジャンプする」ようにする
  2. 慣性をなくしたいならば、AddForce するのではなく直接 velocity に値をセットする

「慣性を無くした状態でジャンプ中物体を...」という記述と貼ってあったコードから「空中にいる時のみ慣性をなくしたい、地上にいる時は慣性をありにしたい」という意味かと思いそういうコードを書いてみましたが、それだとかなり変な挙動になったので「地上でも空中でも慣性をなくしたい、地上でも空中でも変わらず左右に移動したい」というコードを以下に例示しておきます。

csharp

1using UnityEngine; 2using UnityEngine.SceneManagement; 3 4public class PlayerController2D : MonoBehaviour 5{ 6 Rigidbody2D rb2d; 7 [SerializeField] float jumpForce = 1000.0f; 8 [SerializeField] float walkSpeed = 10.0f; 9 /// <summary>接地判定の長さ</summary> 10 [SerializeField] float groundCheckLength = 1f; 11 /// <summary>「地面」と判定するオブジェクトのレイヤーを指定する。自分のいるレイヤーは含めないこと。</summary> 12 [SerializeField] LayerMask layerMask = ~0; 13 14 void Start() 15 { 16 this.rb2d = GetComponent<Rigidbody2D>(); 17 } 18 19 void Update() 20 { 21 float h = Input.GetAxisRaw("Horizontal"); 22 Vector2 dir = (h * Vector2.right).normalized; 23 // 慣性が無い = 力を加えるのではなく直接 Velocity を書き変える 24 rb2d.velocity = dir * walkSpeed + Vector2.up * rb2d.velocity.y; 25 26 if (Input.GetButtonDown("Jump") && IsGrounded()) 27 { 28 this.rb2d.AddForce(transform.up * this.jumpForce); 29 } 30 31 if (transform.position.y < -7) 32 { 33 SceneManager.LoadScene("SampleScene"); 34 } 35 } 36 37 /// <summary> 38 /// 接地判定をする。 39 /// </summary> 40 /// <returns>接地している⇒true、空中にいる⇒false</returns> 41 bool IsGrounded() 42 { 43 Vector2 start = this.transform.position; 44 Vector2 end = start - groundCheckLength * (Vector2)this.transform.up; 45 Debug.DrawLine(start, end); 46 return Physics2D.Linecast(start, end, layerMask); 47 } 48} 49 50

投稿2020/07/04 19:35

編集2020/07/04 19:59
bboydaisuke

総合スコア5308

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

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

tsk1999

2020/07/05 03:43

例に倣ってコードを修正してみたところ目的通りに実現できました、ありがとうございます。最初シリアル化などがよくわからなくて調べてみて初めて理解したので参考にしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問