前提・実現したいこと
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のバージョンは最新です
無知で本当に申し訳ないです。答えてくれると嬉しいです
https://teratail.com/help/question-tips
質問文が見辛いので、こちらも参考に質問のスクリプトの前後の行に「```」を入れてください。
少なくともPlayerクラスとJumpCharaとクラスで二重で移動させてるので、Playerクラスが要らないと思います。
また、再生前の円柱の位置をちょっと宙に浮かせてみてください。(地面に置いているつもりでも実際は少しColliderが地面に埋まっていて、再生時に衝突・反発して上に飛び上がる可能性があります)
すみません、指摘ありがとうございます。見やすく更新しました。
CharacterControllerとCapsuleColliderがオンである限り、スクリプトを両方オフにしても宙に浮いてしまいます、、、
円柱を地面から少し浮かせて再生しても、同じところまで浮かびます、、、(動いても変わらずどこかに飛んでいく)
CharacterControllerは何もしないと重力が効かないので、スクリプトを両方消したら落下しないのは正しい挙動です。
付近に別のColliderが存在していてそっちと衝突しているとかはありませんか?
また、出来るだけ簡略化したコードを加えていって逐一挙動を見るといいと思います。(最初に重力だけ掛けてちゃんと落下・接地するか確認→それが出来たら移動用コードを加える、など)
いえ、むしろ再生時に特定の位置(y=2くらい?)まで浮き上がるんです...(スクリプトありもなしも両方です)
Colliderがあまり良く何か分かってないですけど、付近に何もないです。真っ平のPlaneの上に置いているだけです
やっぱりコードが読めるようにならないといけないですかね...もう少し深く勉強してみることにします...