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

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

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

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

Unity3D

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

受付中

UnityでRigitbodyを使った移動で坂を下るときに自機が浮いてしまう。【動画あり】

Benway
Benway

総合スコア1

C#

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

Unity3D

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

0回答

-1評価

1クリップ

159閲覧

投稿2022/06/14 07:48

編集2022/06/15 14:19

前提

題名の通りです。
UnityでRigidbodyを使った移動で坂を下るときに浮いてしまいます。
https://www.youtube.com/watch?v=AVCt2Y3YhU0
坂から降りるときすこしふわぁってなってしまいます。イメージ説明
こちらの画像はCharacterスクリプトの詳細です。
また、カプセルコライダーの下のスクリプトはRigidbodyの重力を切って、Unity側の重力を上げているスクリプトです。

実現したいこと

坂にぴったり張り付いておりたい

該当のソースコード

C#

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; [RequireComponent(typeof(PlayerInput))] [RequireComponent(typeof(Rigidbody))] public class Character : MonoBehaviour { private Rigidbody rb; private CapsuleCollider capsuleCollider; private InputAction moveAction, jumpAction, CameraAction, dashAction ,squatActiont; //_これ(アンダーヴァー)を識別で着けたりする。unity道場では突けてる public float Speed = 500; //スピードを1.0とインスペクター上で仮定して public float JumpSpeed = 500.0f; public float LimitSpeed = 10.0f; Quaternion targetRotation; private int Jumpflg; public float Stamina = 100; public float Multiplier = 1f; Vector3 normalVector = Vector3.zero; private void Awake() { var input = GetComponent<PlayerInput>(); var actionMap = input.currentActionMap; rb = GetComponent<Rigidbody>(); capsuleCollider = GetComponent<CapsuleCollider>(); moveAction = actionMap["Move"]; moveAction.canceled += OnMoveStop; jumpAction = actionMap["Jump"]; jumpAction.started += Onjump; dashAction = actionMap["Dash"]; dashAction.canceled += DashMoveStop; dashAction.performed += DashMove; squatActiont = actionMap["Squat"]; squatActiont.performed += SquatStart; squatActiont.canceled += SquatStop; targetRotation = transform.rotation; } void OnCollisionEnter(Collision col) { Jumpflg = 0; //Jumpflgを0にする } private void OnCollisionStay(Collision collision) { // 衝突した面の、接触した点における法線を取得 normalVector = collision.contacts[0].normal; Debug.Log(normalVector); } private void Start() { Jumpflg = 0; } void OnMoveStop(InputAction.CallbackContext obj) { Debug.Log("離した"); rb.velocity = new Vector3(0, 0, 0); } void Onjump(InputAction.CallbackContext obj) { if(Jumpflg <= 1) { rb.AddForce(new Vector3(0.0f, JumpSpeed, 0.0f)); Jumpflg++; } } void DashMove(InputAction.CallbackContext obj) { Debug.Log("抑えて"); Speed = 15f; LimitSpeed = 100.0f; } void DashMoveStop(InputAction.CallbackContext obj) { Debug.Log("STOP"); Speed = 10f; LimitSpeed = 10.0f; } void SquatStart(InputAction.CallbackContext obj) { capsuleCollider.height = 1.0f; Speed = 2.5f; Debug.Log("しゃがみなう"); } void SquatStop(InputAction.CallbackContext obj) { capsuleCollider.height = 2.0f; Speed = 5f; Debug.Log("しゃがみ解除"); } void FixedUpdate() { var Dirction = moveAction.ReadValue<Vector2>(); Vector3 inputVector = Vector3.zero; inputVector.x = Dirction.x; inputVector.z = Dirction.y; Vector3 onPlane = Vector3.ProjectOnPlane(inputVector, normalVector); Vector3 cameraForward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized; //Scale は乗算 〇〇,new Vector 2 or 3 で左のほう掛ける右のほうになる、この場合XとZを1をかけて取り出してにゼロを掛けて取り出さないようにしている。 Vector3 moveForward = cameraForward * Dirction.y + Camera.main.transform.right * Dirction.x; //カメラのトランスフォームの赤軸(X)  if (moveForward != Vector3.zero) { targetRotation = Quaternion.LookRotation(moveForward); } transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, Time.deltaTime * 600); rb.velocity = moveForward * Speed + new Vector3(0, rb.velocity.y * onPlane.y , 0); if (rb.velocity.magnitude > LimitSpeed) { rb.velocity = new Vector3(rb.velocity.x / 1.1f, rb.velocity.y / 1.1f, rb.velocity.z / 1.1f); } rb.AddForce((Multiplier - 1f) * Physics.gravity, ForceMode.Acceleration); } }

試したこと

原因は動かしている対象の下にかかる力が弱いため浮いてるのだと思っています。けれども重力やAddforceを使うと逆に坂を登れなくなってしまいます。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

Unity3D

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。