🏃

UnityのCharacterControllerでキャラを動かす

2024/11/02に公開

自分用にメモ
コードはほぼ下記のものですがコピペだとジャンプの反応が悪かったので自分用に一部書き換え
https://docs.unity3d.com/ja/2022.1/ScriptReference/CharacterController.Move.html

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CharacterMovement : MonoBehaviour
{
    private CharacterController controller;
    private bool groundedPlayer;
    private Vector3 playerVelocity;
    private float playerSpeed = 5.0f;
    private float jumpHeight = 2.0f;
    //private float gravityValue = -9.81f; 現実の重力加速度
    private float gravityValue = -20f;
    private float BASE_JUMP_POWER = -3f;

    // Start is called before the first frame update
    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {
        // プレイヤーが接地しているか
        groundedPlayer = controller.isGrounded;
        Debug.Log("接地してるか:" + groundedPlayer);
        // 下方向に無限に加速するのを防ぐために
        // 接地している場合は下方向への速度を一定にする
        if (groundedPlayer && playerVelocity.y < 0)
        {
            // 0にすると接地判定がTrue,Falseを行き来してしまうので少しマイナスを加える
            playerVelocity.y = -0.5f;
        }
        
        // 入力方向を取得して移動
        Vector3 move = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
        controller.Move(move * Time.deltaTime * playerSpeed);
        
        // オブジェクトの正面を移動した方向に向かせる
        if (move != Vector3.zero)
        {
            gameObject.transform.forward = move;
        }

        // 接地しているかつボタンを押下した際にジャンプ
        if (Input.GetButtonDown("Jump") && groundedPlayer)
        {
            playerVelocity.y += Mathf.Sqrt(jumpHeight * BASE_JUMP_POWER * gravityValue);
        }

        playerVelocity.y += gravityValue * Time.deltaTime;
        controller.Move(playerVelocity * Time.deltaTime);
    }
}

Discussion