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

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

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

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

受付中

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

Armr
Armr

総合スコア1

Unity3D

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

1回答

0評価

1クリップ

6374閲覧

投稿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のバージョンは最新です
無知で本当に申し訳ないです。答えてくれると嬉しいです

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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の上に置いているだけです やっぱりコードが読めるようにならないといけないですかね...もう少し深く勉強してみることにします...

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Unity3D

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