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

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

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

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

Q&A

1回答

13435閲覧

Unity2Dで坂をスムーズに上り下りさせたい

vanitier

総合スコア38

C#

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

0グッド

4クリップ

投稿2015/10/28 23:15

Unity2Dで操作するプレイヤーなどを傾斜のある地面で移動させるとフワッと一瞬だけ空中に浮いてしまうのを何とかしたいのですが

素人なのでよくわからないのですが、接地している地面の傾きに合わせて左右の動きにY座標の加速を足せばスムーズに上り下りできるのではと考えてみたのですが、

・接地している地面の傾きの調べ方
・その傾きをどうすれば移動のVelocityに変換できるのか
・上りと下りを分けて処理するにはどうすればいいのか

着地判定はPhysics2D.OverlapPointAllで処理していて、自分が着地しているオブジェクトのタグなどを検知することはできるのですが、これらがどうしても分からず困ってます。

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

以下のリンクの壁ずりベクトルの求め方が参考になるかと思います。
その5 反射ベクトルと壁ずりベクトル

以下のソースコードではOnCollisionStay()を利用して斜面の法線を取得しています。

public class TestMove : MonoBehaviour { [SerializeField] private float m_speed = 1.0f; [SerializeField] private Vector3 m_moveDirection = Vector3.right; void Update() { Vector3 move = m_moveDirection * m_speed * Time.deltaTime; if( Input.GetKey( KeyCode.LeftArrow ) ) { transform.position -= move; } if( Input.GetKey( KeyCode.RightArrow ) ) { transform.position += move; } } void OnCollisionStay( Collision i_collision ) { // 地面以外にコリジョンに当たっていない前提。 // 複数のコリジョンに当たった場合は未対応。 var normal = i_collision.contacts[ 0 ].normal; Vector3 dir = m_moveDirection - Vector3.Dot( m_moveDirection, normal ) * normal; m_moveDirection = dir.normalized; } } // class TestMove

イメージ説明

OnCollisionStay()毎フレームコリジョンのチェックが入るため、決して軽い処理ではありません。
ゲームによっては使えない可能性がありますが、参考程度に見ていただけると恐縮です。

投稿2016/06/07 14:50

urahimono

総合スコア714

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問