unity第一人称控制视角,移动跳跃全能代码,挂载就能用,代码中使用了CharacterController控制器

本文详细描述了一个使用Unity引擎的角色移动和控制逻辑,包括移动速度控制、冲刺、跳跃机制、鼠标操作和鼠标光标的隐藏。
摘要由CSDN通过智能技术生成

    public float speed = 5f; // 移动速度
    public float sprintMultiplier = 1.5f; // 冲刺速度倍率
    public float jumpForce = 8f; // 初始跳跃力度
    public float jumpCooldown = 2f; // 跳跃冷却时间
    private CharacterController characterController;
    private bool canJump = true;

    void Start()
    {
        characterController = GetComponent<CharacterController>();
    }

    void Update()
    {
        Move();
        MouseLook();

        // 检测鼠标左键按下
        if (Input.GetMouseButtonDown(0))
        {
            ToggleCursorVisibility(false); // 隐藏鼠标
        }
    }

    void Move()
    {
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

        // 按下 Shift 键时增加速度
        float currentSpeed = Input.GetKey(KeyCode.LeftShift) ? speed * sprintMultiplier : speed;

        Vector3 moveDirection = transform.right * x + transform.forward * z;
        moveDirection.Normalize();
        moveDirection *= currentSpeed * Time.deltaTime;

        // 处理跳跃
        if (Input.GetButtonDown("Jump") && characterController.isGrounded && canJump)
        {
            StartCoroutine(JumpCoroutine());
        }

        // 重力
        moveDirection.y -= 9.8f * Time.deltaTime;

        characterController.Move(moveDirection);
    }

    IEnumerator JumpCoroutine()
    {
        float airTime = 0f;
        float jumpDuration = 0.1f; // 跳跃的持续时间

        while (airTime < jumpDuration)
        {
            float jumpHeight = Mathf.Lerp(0f, jumpForce, airTime / jumpDuration);
            Vector3 jumpVelocity = Vector3.up * jumpHeight;
            characterController.Move(jumpVelocity * Time.deltaTime);

            airTime += Time.deltaTime;
            yield return null;
        }

        canJump = false; // 触发跳跃后设置为false
        Invoke("ResetJump", jumpCooldown); // 延迟 jumpCooldown 秒后重置 canJump 为 true
    }

    void MouseLook()
    {
        float mx = Input.GetAxis("Mouse X");
        float my = -Input.GetAxis("Mouse Y");
        Quaternion qx = Quaternion.Euler(0, mx, 0);
        Quaternion qy = Quaternion.Euler(my, 0, 0);
        transform.rotation = qx * transform.rotation;
        transform.rotation = transform.rotation * qy;
        float angle = transform.eulerAngles.x;
        if (angle > 180) { angle -= 360; }
        if (angle < -180) { angle += 360; }
        if (angle > 80)
        {
            Debug.Log("A" + transform.eulerAngles.x);
            transform.eulerAngles = new Vector3(80, transform.eulerAngles.y, 0);
        }
        if (angle < -80)
        {
            Debug.Log("A" + transform.eulerAngles.x);
            transform.eulerAngles = new Vector3(-80, transform.eulerAngles.y, 0);
        }
    }

    void ToggleCursorVisibility(bool visible)
    {
        Cursor.lockState = visible ? CursorLockMode.None : CursorLockMode.Locked;
        Cursor.visible = visible;
    }

    void ResetJump()
    {
        canJump = true;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值