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

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

詳細はこちら
Unity3D

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

Q&A

2回答

1561閲覧

重力処理がどんなやり方をしても上手く実装できない。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity3D

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

0グッド

0クリップ

投稿2019/12/09 04:06

編集2020/02/14 07:36

提示コード////コメント部のコード 台の上から落ちる時や坂道を下るときにかかる重力などを設定したいのですが以下の色んなやり方を試しましたが何かしらのバグが発生するので実装できません。いろいろやり方はあると思うのですがどすればいいのでしょうか?

1、use gravityを使って常にY軸をマイナス方向に力を掛ける。やり方、小さい数字から大きい数字まで試しましたがガタガタ画面が揺れてしまい上手く実装できません。※AddForceを使ってY軸は0にしました。

2、rb.AddForceを使ってY軸に-20設定しましたがこんどは坂道を下がるときに空中に浮いてから下がり始めるため上手く実装できません。

3,velocityを使ってみましたがY軸に-20くらいの設定しましたが同じ動かせなくなり坂道で画面がガタガタしたり挙動がおかしくないります。

結論として上手く実装する方法がわかりません。どうしたらいいのでしょうか? つまり地面にくっついて移動して落ちる時は落下したいという処理なのですがどの方法を使っても上手く実装できません。
坂を下る時の処理で空中に浮いたり、浮きはしないがガタガタしたり、なんやかんだで目的の処理が実現できないので重力どうこうまず、やり方自体を変えないといけないと思いましてこの参考サイトを見たのですが下る時はこのようなやり方で実装するのでしょうか? 提示コードにはありませんがこのような処理を入れたのですが上手く坂道を下ってくれず空中に浮くというバグが発生していまいます。

参考サイト:https://gametukurikata.com/program/rigidbodyandcollider

イメージ説明

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Controller : MonoBehaviour { private float input_h; private float input_v; private Vector3 move; private Rigidbody rb; private float walk_speed;//移動速度 private Animator ani;//移動速度 private Vector3 gravity; private bool isJump = false;//ジャンプしてるかどうかを管理する private Vector3 v; private bool isDush; GameObject Ground; GameObject Slope; // Use this for initialization void Start() { Ground = GameObject.Find("GroundCheck"); Slope = GameObject.Find("SlopeCheck"); walk_speed = 5.0f; gravity = Vector3.zero; rb = GetComponent<Rigidbody>(); ani = GetComponent<Animator>(); } void Gravity_Mng()//ジャンプ管理 { } void Move_Mng() { input_h = Input.GetAxis("Horizontal"); input_v = Input.GetAxis("Vertical"); Vector3 move_z = new Vector3(); Vector3 move_x = 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; move = move_x + move_z; if (move != Vector3.zero) { transform.rotation = Quaternion.LookRotation(move.normalized); } } // Update is called once per frame void Update() { Gravity_Mng(); Move_Mng(); move.x *= 200; move.z *= 200; } ////////////////////////////////////////////////////////////////////////////////////////////// void FixedUpdate() { // rb.velocity = new Vector3(move.x, 0, move.z); rb.AddForce(move.x, -50, move.z); Debug.Log("velocity: " + rb.velocity); } ////////////////////////////////////////////////////////////////////////////////////////////// }

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

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

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

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

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

guest

回答2

0

台の上から落ちる時や坂道を下るときにかかる重力

すみません、Unityから離れてしまって、かなり時間が経ってしまったので、詳しい設定方法などは忘れましたが、質問文を読む限り、AddForceは関係ないような気がします。その滑り台のようなオブジェクトの滑る部分の摩擦係数を氷と同じぐらいにしてやれば、Unityなら勝手に滑ったはずです。

もちろん、坂の上り下がりを想定されていれば、話は違いますが、Unityにおいて斜面の処理はUnityが勝手にやってくれた(姿勢制御等は別)はずです。

投稿2020/02/14 07:22

stdio

総合スコア3307

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

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

退会済みユーザー

退会済みユーザー

2020/02/15 07:29

坂の下がりを正確に綺麗にしたいのですが超正確に実装するにはどうしたらいいのでしょうか?Rayを飛ばししたりAddForceでY軸に常に力を掛ける、use gravityを使うなど様々な方法を試しましたが画面がガタガタしたり挙動が不自然になったりと上手く実装できません。
stdio

2020/11/06 08:28 編集

挙動が不自然になるのは、どのような現象が起こるのかもう少し具体的に説明して欲しいです。 ガクガクなるのは、当たっている間はY軸のvelocityを0に、Y軸の位置をその座標に合わせて再設定していないからではないでしょうか?
guest

0

坂道を上り下りしたいときは法線ベクトルに沿うように力を加えてあげれば坂道にピッタリくっついて移動してくれます。
一部抜粋して書いてみました

C#

1Vector3 GroundNormal 2{ 3 get 4 { 5 Ray ray = new Ray(_rigidbody.position, Vector3.down); 6 Physics.SphereCast(ray, _collider.radius, out RaycastHit hit, _collider.height); 7 return hit.normal; 8 } 9}

で法線ベクトルを算出して

C#

1// directionは入力した方向 2public RigidbodyController Move(Vector3 direction) 3{ 4 if (SlopeAngle >= slopeLimit) 5 { 6 _rigidbody.AddForce(GroundNormal * _rigidbody.mass); 7 return this; 8 } 9 10 // ProjectOnPlaneを使うと法線ベクトルに沿ったベクトルを作れる 11 var onPlaneDirection = Vector3.ProjectOnPlane(direction, GroundNormal); 12 13 // velocityが0以下だとふわふわする 14 if (_rigidbody.velocity.y <= 0f) 15 { 16 var velocity = _rigidbody.velocity; 17 velocity.y = 0f; 18 // Normal分を引いてあげると坂道でもずり落ちない 19 _rigidbody.AddForce(moveSensitivity * _rigidbody.mass * (onPlaneDirection - velocity - GroundNormal)); 20 21 return this; 22 } 23 24 _rigidbody.AddForce(moveSensitivity * _rigidbody.mass * (onPlaneDirection - _rigidbody.velocity)); 25 26 return this; 27}

投稿2020/11/05 14:19

編集2020/11/13 03:04
Summit_Ridge

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問