PUN2, Unity, multipayer
добавил онлайн, но есть проблема, не знаю как её решать
проблема в том что камера игрока на одном персонаже а управляет он другим(или как это назвать) и ни 1 ни 2 игрок друг друга не видят, если надо скину скрипты( сразу скажу я недавно в Unity и C# так что мой код может быть ужасным и нечитаемым) в общем не знаю что делать, если кто то знает как работать с PUN2, то подскажите
using UnityEngine;
using Photon.Pun;
public class PlayerMovement : MonoBehaviourPun
public CharacterController controller;
public float walkSpeed = 5f;
public float runSpeed = 10f;
public float crouchSpeed = 2.5f;
public float jumpHeight = 2f;
public float gravity = -9.81f;
public float crouchHeight = 1f;
public float standHeight = 2f;
private Vector3 velocity;
private bool isGrounded;
private bool isCrouching;
void Start()
{
if (!photonView.IsMine)
{
Debug.Log("Этот персонаж не мой, отключаем CharacterController");
GetComponent<CharacterController>().enabled = false;
enabled = false;
return;
}
controller = GetComponent<CharacterController>();
transform.position = new Vector3(transform.position.x, 1f, transform.position.z);
}
void Update()
{
if (!photonView.IsMine || controller == null)
return;
Debug.Log("Этот персонаж не мой, управление отключено!");
// Проверяем, на земле ли игрок
isGrounded = controller.isGrounded;
if (isGrounded && velocity.y < 0)
velocity.y = -2f;
float currentSpeed = (Input.GetKey(KeyCode.LeftShift) && !isCrouching) ? runSpeed : walkSpeed;
if (isCrouching)
currentSpeed = crouchSpeed;
.
float moveX = -Input.GetAxis("Horizontal");
float moveZ = -Input.GetAxis("Vertical");
Vector3 moveDirection = transform.right * moveX + transform.forward * moveZ;
if (moveDirection.magnitude > 1f)
moveDirection.Normalize();
Vector3 horizontalMove = moveDirection * currentSpeed;
// Прыжок
if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
{
velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
// Приседание
if (Input.GetKeyDown(KeyCode.C))
{
isCrouching = !isCrouching;
controller.height = isCrouching ? crouchHeight : standHeight;
}
velocity.y += gravity * Time.deltaTime;
Vector3 finalMove = horizontalMove + new Vector3(0, velocity.y, 0);
controller.Move(finalMove * Time.deltaTime);
}
}
вверху скрипт управления
первый скрин вид от лица 2 игрока второй от лица 1 игрока( на скринах два игрока, но первый игрок управляет вторым)
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
public class PhotonManager : MonoBehaviourPunCallbacks
{
public GameObject playerPrefab;
public GameObject menuUI;
void Start()
{
PhotonNetwork.ConnectUsingSettings();
}
public override void OnConnectedToMaster()
{
Debug.Log("Connected to Photon Master Server");
PhotonNetwork.JoinLobby();
}
public override void OnJoinedLobby()
{
Debug.Log("Joined Photon Lobby");
}
public override void OnJoinedRoom()
{
Debug.Log("Joined Room: " + PhotonNetwork.CurrentRoom.Name);
if (PhotonNetwork.IsMasterClient)
{
Debug.Log("You are the Master Client");
}
SpawnPlayer();
if (menuUI != null)
menuUI.SetActive(false);
}
void SpawnPlayer()
{
if (playerPrefab == null)
{
Debug.LogError("Player Prefab is not assigned in PhotonManager!");
return;
}
if (PhotonNetwork.LocalPlayer.TagObject != null)
{
Debug.LogWarning("Игрок уже создан! Пропускаем спавн.");
return;
}
Vector3 spawnPos = new Vector3(Random.Range(-5f, 5f), 1f, Random.Range(-5f, 5f));
GameObject player = PhotonNetwork.Instantiate(playerPrefab.name, spawnPos, Quaternion.identity);
PhotonNetwork.LocalPlayer.TagObject = player;
Debug.Log($"Спавн игрока: {player.name}, IsMine: {player.GetComponent<PhotonView>().IsMine}");
}
public void CreateRoom()
{
RoomOptions options = new RoomOptions { MaxPlayers = 10 };
PhotonNetwork.CreateRoom("Room1", options, TypedLobby.Default);
}
public void JoinRoom()
{
PhotonNetwork.JoinRoom("Room1");
}
}
вверху скрипт PhotonManager

