Немного изменил код, для клиента создается игрок с FPS контроллером и камерой (Player), для остальных просто пустышки (otherPlayer), содержащие скрипт синхронизации. Объекты создаю не через Network, а локально, для каждого игрока. viewID присваиваю сразу при создании. Юнити не ругается ни на что, как на сервере, так и на клиентах.
Ошибка:
Клиент принимает данные сервера о перемещении его игрока и перемещает его у себя, но сервер не принимает данные клиентов.
Сижу парюсь уже два дня, объясните пожалуйста.
Полный код скрипта синхронизации:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
[RequireComponent( typeof(Rigidbody) )]
public class PlayerNetwork : MonoBehaviour
{
public float lastSynchronizationTime;
public float syncDelay = 0f;
public float syncTime = 0f;
public Vector3 syncStartPosition = Vector3.zero;
public Vector3 syncEndPosition = Vector3.zero;
public Quaternion syncStartRotation = Quaternion.identity;
public Quaternion syncEndRotation = Quaternion.identity;
public NetworkView netView;
public Rigidbody rigidbody;
void Start ()
{
netView.observed = this;
netView.stateSynchronization = NetworkStateSynchronization.Unreliable;
lastSynchronizationTime = Time.time;
}
void FixedUpdate ()
{
if (this.tag == "otherPlayer") {
syncTime += Time.fixedDeltaTime;
rigidbody.position = Vector3.Lerp (syncStartPosition, syncEndPosition, syncTime / syncDelay);
rigidbody.rotation = Quaternion.Lerp (syncStartRotation, syncEndRotation, syncTime / syncDelay);
}
}
void OnSerializeNetworkView (BitStream stream, NetworkMessageInfo info)
{
Vector3 syncPosition = Vector3.zero;
Vector3 syncVelocity = Vector3.zero;
Quaternion syncRotation = Quaternion.identity;
if (stream.isWriting) {
if (this.tag == "Player") {
syncPosition = rigidbody.position;
stream.Serialize (ref syncPosition);
syncVelocity = rigidbody.velocity;
stream.Serialize (ref syncVelocity);
syncRotation = rigidbody.rotation;
stream.Serialize (ref syncRotation);
}
} else {
stream.Serialize (ref syncPosition);
stream.Serialize (ref syncVelocity);
stream.Serialize (ref syncRotation);
syncTime = 0f;
syncDelay = Time.time - lastSynchronizationTime;
lastSynchronizationTime = Time.time;
syncEndPosition = syncPosition + syncVelocity * syncDelay;
syncStartPosition = rigidbody.position;
syncEndRotation = syncRotation;
syncStartRotation = rigidbody.rotation;
}
}
}
using System.Collections;
[RequireComponent( typeof(Rigidbody) )]
public class PlayerNetwork : MonoBehaviour
{
public float lastSynchronizationTime;
public float syncDelay = 0f;
public float syncTime = 0f;
public Vector3 syncStartPosition = Vector3.zero;
public Vector3 syncEndPosition = Vector3.zero;
public Quaternion syncStartRotation = Quaternion.identity;
public Quaternion syncEndRotation = Quaternion.identity;
public NetworkView netView;
public Rigidbody rigidbody;
void Start ()
{
netView.observed = this;
netView.stateSynchronization = NetworkStateSynchronization.Unreliable;
lastSynchronizationTime = Time.time;
}
void FixedUpdate ()
{
if (this.tag == "otherPlayer") {
syncTime += Time.fixedDeltaTime;
rigidbody.position = Vector3.Lerp (syncStartPosition, syncEndPosition, syncTime / syncDelay);
rigidbody.rotation = Quaternion.Lerp (syncStartRotation, syncEndRotation, syncTime / syncDelay);
}
}
void OnSerializeNetworkView (BitStream stream, NetworkMessageInfo info)
{
Vector3 syncPosition = Vector3.zero;
Vector3 syncVelocity = Vector3.zero;
Quaternion syncRotation = Quaternion.identity;
if (stream.isWriting) {
if (this.tag == "Player") {
syncPosition = rigidbody.position;
stream.Serialize (ref syncPosition);
syncVelocity = rigidbody.velocity;
stream.Serialize (ref syncVelocity);
syncRotation = rigidbody.rotation;
stream.Serialize (ref syncRotation);
}
} else {
stream.Serialize (ref syncPosition);
stream.Serialize (ref syncVelocity);
stream.Serialize (ref syncRotation);
syncTime = 0f;
syncDelay = Time.time - lastSynchronizationTime;
lastSynchronizationTime = Time.time;
syncEndPosition = syncPosition + syncVelocity * syncDelay;
syncStartPosition = rigidbody.position;
syncEndRotation = syncRotation;
syncStartRotation = rigidbody.rotation;
}
}
}