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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Unity3D

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

Q&A

1回答

12783閲覧

再生時にキャラが宙に浮く、飛んでいく

Armr

総合スコア1

Unity3D

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

0グッド

1クリップ

投稿2020/05/10 20:57

編集2022/01/12 10:55

前提・実現したいこと

Unity入れ始めの初心者です。
円柱をキャラとし、WASD操作、スペースでジャンプができるようにしたい

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

再生すると円柱が宙に浮き、動くと飛んで行ってしまう
CharacterControllerとCapsuleColliderというのをセットしていて、CharacterControllerだけをオフにすると移動はできるがジャンプができなくなってしまい、CapsuleColliderをオフにすると地面をすり抜けて落ちてしまいます。

使っているスクリプト?

使っているのはサイトからコピーしてきた2つスクリプトで、
1つは「JumpChara」という名前で

using UnityEngine; using System.Collections; public class JumpChara : MonoBehaviour { private Animator animator; private CharacterController characterController; // 速度 private Vector3 velocity; // ジャンプ力 [SerializeField] private float jumpPower = 5f; void Start() { animator = GetComponent<Animator>(); characterController = GetComponent<CharacterController>(); velocity = Vector3.zero; } void Update() { if (characterController.isGrounded) { velocity = Vector3.zero; var input = new Vector3(Input.GetAxis("Horizontal"), 0f, Input.GetAxis("Vertical")); // 方向キーが多少押されている if (input.magnitude > 0f) { animator.SetFloat("Speed", input.magnitude); transform.LookAt(transform.position + input); velocity += input.normalized * 2; // キーの押しが小さすぎる場合は移動しない } else { animator.SetFloat("Speed", 0f); } // ジャンプキー(デフォルトではSpace)を押したらY軸方向の速度にジャンプ力を足す if (Input.GetButtonDown("Jump")) { velocity.y += jumpPower; } } velocity.y += Physics.gravity.y * Time.deltaTime; characterController.Move(velocity * Time.deltaTime); } }

のスクリプトと
次に「Player」という名前で

// Player.cs using UnityEngine; // プレイヤー public class Player : MonoBehaviour { [SerializeField] private Vector3 velocity; // 移動方向 [SerializeField] private float moveSpeed = 5.0f; // 移動速度 void Update() { // WASD入力から、XZ平面(水平な地面)を移動する方向(velocity)を得ます velocity = Vector3.zero; if (Input.GetKey(KeyCode.W)) velocity.x -= 1; if (Input.GetKey(KeyCode.A)) velocity.z -= 1; if (Input.GetKey(KeyCode.S)) velocity.x += 1; if (Input.GetKey(KeyCode.D)) velocity.z += 1; // 速度ベクトルの長さを1秒でmoveSpeedだけ進むように調整します velocity = velocity.normalized * moveSpeed * Time.deltaTime; // いずれかの方向に移動している場合 if (velocity.magnitude > 0) { // プレイヤーの位置(transform.position)の更新 // 移動方向ベクトル(velocity)を足し込みます transform.position += velocity; } } }

というスクリプトです。(このキャラはxのマイナス方向を北として動きたいので、移動する座標の向きはそれぞれ変えました

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

多分入れたばかりなので、Unityのバージョンは最新です
無知で本当に申し訳ないです。答えてくれると嬉しいです

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

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

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

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

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

sakura_hana

2020/05/11 00:51

https://teratail.com/help/question-tips 質問文が見辛いので、こちらも参考に質問のスクリプトの前後の行に「```」を入れてください。 少なくともPlayerクラスとJumpCharaとクラスで二重で移動させてるので、Playerクラスが要らないと思います。 また、再生前の円柱の位置をちょっと宙に浮かせてみてください。(地面に置いているつもりでも実際は少しColliderが地面に埋まっていて、再生時に衝突・反発して上に飛び上がる可能性があります)
Armr

2020/05/12 03:57

すみません、指摘ありがとうございます。見やすく更新しました。 CharacterControllerとCapsuleColliderがオンである限り、スクリプトを両方オフにしても宙に浮いてしまいます、、、 円柱を地面から少し浮かせて再生しても、同じところまで浮かびます、、、(動いても変わらずどこかに飛んでいく)
sakura_hana

2020/05/12 04:27

CharacterControllerは何もしないと重力が効かないので、スクリプトを両方消したら落下しないのは正しい挙動です。 付近に別のColliderが存在していてそっちと衝突しているとかはありませんか? また、出来るだけ簡略化したコードを加えていって逐一挙動を見るといいと思います。(最初に重力だけ掛けてちゃんと落下・接地するか確認→それが出来たら移動用コードを加える、など)
Armr

2020/05/12 19:29

いえ、むしろ再生時に特定の位置(y=2くらい?)まで浮き上がるんです...(スクリプトありもなしも両方です) Colliderがあまり良く何か分かってないですけど、付近に何もないです。真っ平のPlaneの上に置いているだけです やっぱりコードが読めるようにならないといけないですかね...もう少し深く勉強してみることにします...
guest

回答1

0

physics(物理的要素)の問題ですね。僕も以前に使おうと思いましたが、設定が難しすぎてできませんでした。component⇒physics、またはcomponent⇒physics 2Dを選択すればいいと思います。

詳しくは、Unity docs:Physicsか、

Unity docs:physics 2D

を参考にして頂けばいいかと思います。

投稿2020/05/14 08:51

U_Bonche

総合スコア19

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問