🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

1回答

1790閲覧

velocity addforce 同時に使いたい

退会済みユーザー

退会済みユーザー

総合スコア0

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2019/09/28 15:19

キャラクターの左右前後ろ移動にはvelocityを使い、ジャンプの上昇と落下にはAddForceを使いたいのですが
提示コードのf_move()関数部の処理は正しく使えてるのでしょうか?

質問 無理やり同時に使っているため何か対処法があれば教えていただきたいです。

イメージ説明

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { private float input_h; private float input_v; private Vector3 move; private Rigidbody rb; private Animator ani; /*調整量関係*/ private Vector3 jump_force = new Vector3(0,-10.0f,0); private const float walk_speed = 40.0f;//移動速度 // Use this for initialization void Start() { rb = GetComponent<Rigidbody>(); ani = GetComponent<Animator>(); // Physics.gravity = new Vector3(0,-100,0); } // Update is called once per frame void Update() { f_Animation(); f_Move(); // Physics.gravity = new Vector3(0, -10, 0); } /*移動*/ void f_Move() { input_h = Input.GetAxis("Horizontal"); input_v = Input.GetAxis("Vertical"); Vector3 move_x = new Vector3(); Vector3 move_z = new Vector3(); move_z = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized * input_v * walk_speed; move_x = Camera.main.transform.right * input_h * walk_speed; Vector3 t_move = move_x + move_z + new Vector3(0,rb.velocity.y,0); move = move_x + move_z + new Vector3(0,0,0); if (move != Vector3.zero) { //Debug.Log(move.normalized); Vector3 v = Vector3.Scale(t_move , new Vector3(1, 0, 1)); transform.rotation = Quaternion.LookRotation(v.normalized); // transform.rotation = Quaternion.LookRotation(move.normalized); } Debug.Log(t_move.normalized); // rb.velocity = move; rb.velocity = t_move; if(rb.velocity.y > 0) { rb.velocity = Vector3.Scale(t_move , new Vector3(1,0,1)); } rb.AddForce(jump_force); } /*アニメーション管理*/ void f_Animation() { float speed = Mathf.Sqrt((move.z * move.z) + (move.x * move.x)); // ani.SetFloat("Walk_Speed", speed); ani.SetFloat("Run_Speed", speed); // ani.speed = speed / 10; } void OnCollisionEnter(Collision c) { rb.velocity = new Vector3(0,0,0); } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

正しいか正しくないかで言えば、velocityを直接入力している時点であまり正しくないと思います。
「やるべきではない」とリファレンスにも書いてあります。
Rigidbody-velocity - Unity スクリプトリファレンス

それ以外でも現状のコードは破綻している気がします。

まずrb.AddForce(jump_force);を毎フレーム実行しているのはおかしいですよね。問答無用で力が掛かりっぱなしです。
今はなぜかjump_forceが下向きの力を掛けているので目に見えてはいません(というか重力約2倍状態になっている)が、普通は「ジャンプに対応するキーが呼ばれた時に上向きの力を加える」だと思います。

ここを直したとしても「rb.velocity.y > 0だった場合、rb.velocity.y = 0にする」という処理がある毎フレーム実行されるので、上昇しないかちょこっとだけ上昇するかでしょう。
(1フレームだけrb.AddForce(jump_force);が効く為)

上記を直した後も「ジャンプ後、空中で前後左右に移動出来る」「空中ジャンプが無限に可能」という挙動をします。
そういうゲームであるならいいのですが、そうでなければ「前後左右移動とジャンプが出来るのは着地中のみ」という条件分岐(つまり接地判定)が必要です。

投稿2019/09/29 07:04

sakura_hana

総合スコア11427

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

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

退会済みユーザー

退会済みユーザー

2019/09/29 09:02

質問なのですがrb.velocityと違って速度を打ち消される速度が少ないためすごい長い間動いてしまっていってかといってキーを話した瞬間停止するという処理ではなくすこし余韻?が欲しいのですがどうすればいいのでしょうか?
sakura_hana

2019/09/30 00:01

以前の質問で回答した気もしますが、毎フレームvelocityを書き換えるのがいけないのであって、キーを押した瞬間だけvelocity書き換えは一応OKなのかなと思います(リファレンスにサンプルコードがありますし)。 AddForceを使った時に長い間動く場合は、 1.長くAddForceしていないか確認する(キーを押された瞬間だけAddForceする) 2.AddForceの第二引数を変更する(参考:https://ekulabo.com/force-mode) 3.摩擦や空気抵抗を調整する(参考:https://ekulabo.com/physic-material https://xr-hub.com/archives/3533) 以上を試してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問