Сделал мультиплеер посредством Unet
На сцене есть объект (маска которую можно надеть на персонажа), сам скрипт работает корректно , что у первого что у второго игрока, но вот синхронизация оставляет желать лучшего.
Когда я на хосте (сервере, создателе сервера, как угодно) надеваю маску на своего персонажа, она нормально одевается и снимается тоже, если смотреть на это дело со стороны клиента (подключившего игрока), то прекрасно видно как он снимает и надевает его
весь код скрипта :
public class ForMask : NetworkBehaviour
{
public Transform Formask;
public Transform Formask2;
public Transform Drop;
public bool OnMe = false;
public bool Resolution = false;
public bool OnMe2 = false;
public bool Resolution2 = false;
float rotationX = 0;
public float lookSpeed = 2.0f;
public float lookXLimit = 45.0f;
public Transform mask;
public bool TextOver = false;
public Text MyTestLabel;
// Start is called before the first frame update
void Start()
{
//Formask = GameObject.FindGameObjectWithTag("Formask").transform;
//Formask2 = GameObject.FindGameObjectWithTag("Formask2").transform;
//Drop = GameObject.FindGameObjectWithTag("Drop").transform;
}
// Update is called once per frame
void Update()
{
TextOverObject();
//Formask = GameObject.FindGameObjectWithTag("Formask").transform;
//Formask2 = GameObject.FindGameObjectWithTag("Formask2").transform;
//Drop = GameObject.FindGameObjectWithTag("Drop").transform;
if (Input.GetKey(KeyCode.Mouse0) && Resolution) //если нажали на лкм и игрок рядом то надеваем на него
{
Formask = GameObject.FindGameObjectWithTag("Formask").transform;
GetComponent<BoxCollider>().enabled = false;
GetComponent<Rigidbody>().useGravity = false;
transform.position = Formask.position;
OnMe = true;
}
if (Input.GetKey(KeyCode.Mouse0) && Resolution2)
{
Formask2 = GameObject.FindGameObjectWithTag("Formask2").transform;
GetComponent<BoxCollider>().enabled = false;
GetComponent<Rigidbody>().useGravity = false;
transform.position = Formask2.position;
OnMe2 = true;
}
if (Input.GetKey(KeyCode.Mouse1) && Resolution)
{
Drop = GameObject.FindGameObjectWithTag("Drop").transform;
OnMe = false;
transform.position = Drop.position;
GetComponent<Rigidbody>().useGravity = true;
GetComponent<BoxCollider>().enabled = true;
}
if(Input.GetKey(KeyCode.Mouse1) && Resolution2)
{
Drop = GameObject.FindGameObjectWithTag("Drop").transform;
OnMe2 = false;
transform.position = Drop.position;
GetComponent<Rigidbody>().useGravity = true;
GetComponent<BoxCollider>().enabled = true;
}
if (OnMe)
{
transform.position = Formask.position;
transform.rotation *= Quaternion.Euler(0, Input.GetAxis("Mouse X") * lookSpeed, 0);
}
if (OnMe2)
{
transform.position = Formask2.position;
transform.rotation *= Quaternion.Euler(0, Input.GetAxis("Mouse X") * lookSpeed, 0);
}
}
void OnTriggerEnter(Collider col) //проверяем приблизился ли игрок
{
if(col.gameObject.tag == "Player")
{
Resolution = true;
}
else if (col.gameObject.tag == "Player2")
{
Resolution2 = true;
}
}
void OnTriggerExit(Collider col)
{
if(col.gameObject.tag == "Player")
{
Resolution = false;
}
else if (col.gameObject.tag == "Player2")
{
Resolution2 = false;
}
}
Но вот со стороны клиента, когда я ее надеваю, на хосте этого не видно.
по сути я надел маску, на клиенте это видно, а у хоста она все так же продолжает лежать на столе.
Полистал в интернете насчет этого, но исчерпывающего ответа так и не нашел, везде лишь речь про синхронизацию игроков. Мне стало интересно почему же когда сервер что-то делает, то это видит клиент,а вот в обратном порядке синхронизации просто никакой.
(я настроил все что нужно, сами игроки двигаются правильно и плавно, но вот взаймодействие хромает причем на обе ноги)
В чем вопрос, как мне от лица клиента, дать хосту понять что я изменил положение этой "маски", когда надел, и то что я изменил его обратно, когда снял?
(дело не в маске, не так принципиально, оно ни на каких объектах толком нормально не пашет)
знаю что код костыльный, но мне в данный момент важна его работоспособность, а не чистота