Первое, что пришло в голову это оставить полностью префаб как есть(немного измененный префаб из стандартных ассетов - FirstPersonController), только добавить скрипт типа
Синтаксис:
Используется csharp
public float Vertical, Horizontal, MouseX, MouseY;
public bool Jump, Fire;
public float NetVertical, NetHorizontal, NetMouseX, NetMouseY;
public bool NetJump, NetFire;
private bool isControllable;
void Update () {
if (isControllable) // локальный контроль - самим игроком
{
Horizontal = CrossPlatformInputManager.GetAxis("Horizontal");
Vertical = CrossPlatformInputManager.GetAxis("Vertical");
MouseX = CrossPlatformInputManager.GetAxis("Mouse X") ;
MouseY = CrossPlatformInputManager.GetAxis("Mouse Y") ;
Jump = CrossPlatformInputManager.GetButtonDown("Jump");
Fire = CrossPlatformInputManager.GetButtonDown("Fire1");
}
else // данные приходят по сети
{
Horizontal = NetHorizontal;
Vertical = NetVertical;
MouseX = NetMouseX;
MouseY = NetMouseY;
Jump = NetJump;
Fire = NetFire;
}
}
public bool Jump, Fire;
public float NetVertical, NetHorizontal, NetMouseX, NetMouseY;
public bool NetJump, NetFire;
private bool isControllable;
void Update () {
if (isControllable) // локальный контроль - самим игроком
{
Horizontal = CrossPlatformInputManager.GetAxis("Horizontal");
Vertical = CrossPlatformInputManager.GetAxis("Vertical");
MouseX = CrossPlatformInputManager.GetAxis("Mouse X") ;
MouseY = CrossPlatformInputManager.GetAxis("Mouse Y") ;
Jump = CrossPlatformInputManager.GetButtonDown("Jump");
Fire = CrossPlatformInputManager.GetButtonDown("Fire1");
}
else // данные приходят по сети
{
Horizontal = NetHorizontal;
Vertical = NetVertical;
MouseX = NetMouseX;
MouseY = NetMouseY;
Jump = NetJump;
Fire = NetFire;
}
}
+ не надо замарачиваться над разными компонентами типа звука шагов, физического взаимодействия и т.п. Все и так будет
- нет жесткой привязки к position и rotation, доп нагрузка если будут по карте бегать 10 физических объектов (сильная нагрузка ?)
Второй вариант. Добавить скрипт в котором при старте будет проверяться локальное ли управление. Если да, то все остается, если нет (если это префаб, которым управляет другой игрок по сети), то будут удаляться FPC, RB и character controller, а вместо них будет добавлен простецкий скрипт типа
Синтаксис:
Используется csharp
transform.position = Vector3.Lerp(transform.position, correctPlayerPos, Time.deltaTime * 5);
transform.rotation = Quaternion.Lerp(transform.rotation, correctPlayerRot, Time.deltaTime * 5);
transform.rotation = Quaternion.Lerp(transform.rotation, correctPlayerRot, Time.deltaTime * 5);
где correctPlayerPos, correctPlayerRot данные, приходящие по сети
+ не надо волноваться о положении игрока на другой машине т.к. идет жёсткая привязка
- надо будет заморочиться как передвать, что нужно проиграть звук шагом или прыжка, анимации опять же и т.п.