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

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

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

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

Unity

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

Q&A

1回答

830閲覧

Jumpが上手くできなくて、困ってます。どうコードを変更すればいいのでしょうか。CharacterControllerは使わないで、Rigidbodyで実現させたいです。

NekoCafe

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2021/11/21 16:14

前提・実現したいこと

該当のソースコードに記載のスクリプトでは、
Playerのジャンプがあまりジャンプ力が弱くて、困っています。
これを普通のゲームで出てくるキャラくらいのジャンプ力(ゲームにもよりますが)
にしたい。

Jump、Moveメソッド内のコードをどう変更すれば
rb.velocityの移動方法でも、Jump力はキャラの半分ちょっとの高さくらいまで、
ジャンプすることができるのでしょうか?

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

ジャンプ力が小さすぎて、すぐに地面に戻る。 あまりJumpForceの大きさはあげたくないのと、Gravityの値も変更したくないです

該当のソースコード

C#

1using UnityEngine; 2 3public class PlayerManager : MonoBehaviour 4{ 5 [SerializeField] private float moveSpeed = 3.0f; 6 [SerializeField] private float jumpForce = 400f; 7 8 9 private Rigidbody rb; 10 private float hInput; 11 private float vInput; 12 private bool isGround = false; 13 14 void Start() 15 { 16 rb = GetComponent<Rigidbody>(); 17 18 } 19 20 void Update() 21 { 22 hInput = Input.GetAxis("Horizontal"); 23 vInput = Input.GetAxis("Vertical"); 24 Jump(); 25 } 26 27 private void FixedUpdate() { 28 Move(); 29 } 30 31 32 private void Move() { 33 var direction = transform.position + (new Vector3(hInput, 0, vInput) * moveSpeed); 34 transform.LookAt(direction); 35 rb.velocity = new Vector3(hInput, 0, vInput) * moveSpeed; 36 } 37 38 private void Jump() { 39 if (isGround) { 40 if (Input.GetButtonDown("Jump") || Input.GetMouseButtonDown(0)) { 41 rb.AddForce(Vector3.up * jumpForce); 42 isGround = false; 43 } 44 } 45 } 46 47 //Checkground 48 private void OnCollisionEnter(Collision collision) { 49 int layerNameDefault = 0; 50 if(collision.gameObject.layer == layerNameDefault) { 51 if (!isGround) isGround = true; 52 } 53 } 54 55 56} 57

RigidbodyとCapsuleCollider
イメージ説明

試したこと

JumpForceの値を600に変更しましたがダメでした。
何となく

C#

1rb.velocity = new Vector3(hInput, 0, vInput) * moveSpeed

のあたりが怪しいと思ってますが、どうしてもうまく行きません。
やりたいのは、MovePositionやTranslateを使った移動ではなくて、
あくまでも、rb.velocityで移動するときにジャンプが不自然にならないようにしたいです。

今だと、ちょっとジャンプしてゆっくり地面に戻ってくるなんとも不思議なスクリプトになってしまってます。

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

2020.1.17f1 Personal

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

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

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

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

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

guest

回答1

0

まず最初に、velocityは直接書き換えないほうが良いです。
AddForceなどの用意されたメソッドを使いましょう。

今回もvelocityを直接書き換えたせいで、動作がおかしくなっています。
試しに、FixedUpdateとMoveメソッドをコメントアウトして動作を確認してみてください。きちんとジャンプ出来ていることが確認出来ると思います。

なぜそうなるかというと、Jumpメソッド内でAddForceを使って上下方向の速度(velocity)を加えたにもかかわらず、Moveメソッド内で

csharp

1rb.velocity = new Vector3(hInput, 0, vInput) * moveSpeed;

と、せっかく加えた上下方向のvelocityを無視して新たな速度(velocity)で置き換えてしまっています。
上下方向の速度を無視してしまえば、当然、ジャンプ動作が上手くいくわけないですよね。

そこで、上下方向の速度を維持しつつ、前後(?)方向の移動もするには、以下の記事が参考になるかと思います。

Unityで等速に移動する方法まとめ

ジャンプ以外の移動をどう実現したいのかがいまいちわからないですが、上記の記事を参考に、以下のようにFixedUpdateを置き換えると、それっぽい動きになります。(Moveメソッドは削除)

csharp

1 private void FixedUpdate(){ 2 const float targetVelocity = 2; 3 const float power = 20; 4 rb.AddForce(Vector3.right * ((targetVelocity - rb.velocity.x) * power), ForceMode.Acceleration); 5 }

投稿2021/11/23 05:04

編集2021/11/23 14:54
JunSuzukiJapan

総合スコア314

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

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

fana

2021/11/23 09:35

私はUnityを全然知らないので,単純に英単語の意味的な面から思う事でしかないのですが… > 加速度(velocity) "velocity" っていうのは「速度」ではないのでしょうか?
JunSuzukiJapan

2021/11/23 14:53

> fanaさん 深く考えずに「加速度」と書いてしまいましたが、速度のほうが正しそうですね。修正します。 ご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問