@XaoTikS
Программист, начинающий разработчик видеоигр.

Как сделать правильное управление игроком с помощью джойстика, используя CharacterController?

На сцене есть игрок, его ребёнок - камера. Передвижение игрока реализовано через Collider и Rigidbody, что не очень правильно, поскольку игрок может застревать в объектах. Ниже привёл скрипты передвижения игрока через transform, а нужно их переделать под CharacterController(rigidBody и CaplsuleCollider в этом случае убираем), что исключит прохождение через стены, а ещё нужно учесть управление персонажем по взгляду камеры игрока. На игроке висит скрипт PlayerMovement, на камере - PlayerLock.

Скрипт PlayerMovement:
using UnityEngine;
using System.Collections.Generic;

public class PlayerMuvment : MonoBehaviour
{

    public float speed = 5;
    Vector2 velocity;
    public Transform playerCamera;
    public FloatingJoystick floatingJoystick;
    private float Hor, Ver;
    public float jumpStrength = 2f;
    public bool isGrounded;
    Rigidbody rigidb;


    public List<System.Func<float>> speedOverrides = new List<System.Func<float>>();

    private void Start()
    {
        rigidb = GetComponent<Rigidbody>();
    }
    void OnCollisionEnter(Collision other)
    {
        isGrounded = true;
    }

    public void JumpButton()
    {
        if (isGrounded)
        {
            isGrounded = false;
            rigidb.AddForce(Vector3.up * 100 * jumpStrength);
        }
    }

    void FixedUpdate()
    {
        transform.rotation = Quaternion.Euler(transform.rotation.eulerAngles.x, playerCamera.rotation.eulerAngles.y, transform.rotation.eulerAngles.z);

        Hor = floatingJoystick.Horizontal;
        Ver = floatingJoystick.Vertical;

        float movingSpeed = speed;
        if (speedOverrides.Count > 0)
            movingSpeed = speedOverrides[speedOverrides.Count - 1]();
        velocity.y = Ver * movingSpeed * Time.deltaTime;
        velocity.x = Hor * movingSpeed * Time.deltaTime;
        transform.Translate(velocity.x, 0, velocity.y);
    }
}


Скрипт PlayerLook:
using UnityEngine;

public class PlayerLock : MonoBehaviour
{
    
    public Transform playerBody;
    public float sens = 0.3f;
    float xRot;
    public bool lockCursor;

    public FixedTouchField fixedTouchField;
    [HideInInspector]
	public Vector2 LockAxis;
 

    void Start()
    {
       if (lockCursor) Cursor.lockState = CursorLockMode.Locked;
    }

  
    void Update()
    {
        LockAxis = fixedTouchField.TouchDist;

        float mouX = LockAxis.x * (sens * 5) * Time.deltaTime;
        float mouY = LockAxis.y * (sens * 5) * Time.deltaTime;

        xRot -= mouY;
        xRot = Mathf.Clamp(xRot, -90f, 90f);

        transform.localRotation = Quaternion.Euler(xRot, 0f, 0f);

        playerBody.Rotate(Vector3.up * mouX);

    }
    
}
  • Вопрос задан
  • 66 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы