На сцене есть игрок, его ребёнок - камера. Передвижение игрока реализовано через 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);
}
}