А тип Joystick точно совместим? Прост в твоем коде joystick звучит как какой-то public Joystick joystick. Он говорит, что тип должен быть именно Joystick. Если тип не совпадает, измени тип переменной joystick.
Добавь потом проверку в начале работы. Имею ввиду в сам метод start
void Start()
{
rb = GetComponent<Rigidbody>();
if (joystick == null)
{
Debug.LogError("Joystick не назначен в инспекторе!");
}
}
Надо бы понять, происходит ли потеря ссылки на джойстик после старта игры
using UnityEngine;
using Mirror;
public class PlayerController : NetworkBehaviour
{
public float speed = 5.0f;
public float jumpForce = 5.0f;
private bool isGrounded;
public Joystick joystick;
private Rigidbody rb;
public float rotationSpeed = 2f;
private Camera mainCam;
public Vector3 cameraOffset = new Vector3(0, 2, -5); // Смещение камеры
private void Awake()
{
mainCam = Camera.main;
}
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (!isLocalPlayer) return;
if (joystick == null)
{
Debug.LogError("Joystick не назначен в инспекторе!");
return;
}
float horizontal = joystick.Horizontal;
float vertical = joystick.Vertical;
Vector3 direction = new Vector3(horizontal, 0, vertical).normalized;
if (direction.magnitude >= 0.1f)
{
Vector3 moveDirection = Quaternion.Euler(0, mainCam.transform.eulerAngles.y, 0) * direction;
transform.Translate(moveDirection * speed * Time.deltaTime, Space.World );
Quaternion toRotation = Quaternion.LookRotation(moveDirection, Vector3.up);
transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, rotationSpeed * Time.deltaTime);
}
if (Input.GetButtonDown("Jump") && isGrounded)
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}
CameraMovement();
}
private void CameraMovement()
{
Vector3 desiredPosition = transform.position + cameraOffset;
mainCam.transform.position = Vector3.Lerp(mainCam.transform.position, desiredPosition, Time.deltaTime * 3);
mainCam.transform.LookAt(transform.position);
}
void OnCollisionStay(Collision collision)
{
isGrounded = true;
}
void OnCollisionExit(Collision collision)
{
isGrounded = false;
}
}