public void SyncTransform(World world, Entity entity, SyncTransformMessage msg) { EntityManager manager = world.EntityManager; TransformSyncData transform = manager.GetComponentData <TransformSyncData> (entity); Translation translation = manager.GetComponentData <Translation> (entity); RotationEulerXYZ rot = manager.GetComponentData <RotationEulerXYZ> (entity); transform.timeTillLastSync = 0f; transform.oposX = translation.Value.x; transform.oposY = translation.Value.y; transform.oposZ = translation.Value.z; transform.orotX = rot.Value.x; transform.orotY = rot.Value.y; transform.orotZ = rot.Value.z; if (msg.isPos) { transform.posX = msg.pos.x; transform.posY = msg.pos.y; transform.posZ = msg.pos.z; } if (msg.isRot) { transform.rotX = msg.rot.x; transform.rotY = msg.rot.y; transform.rotZ = msg.rot.z; transform.rotW = msg.rot.w; } manager.SetComponentData(entity, transform); }
private void OnReceiveMovementMessage(NetworkMessage _message) { SyncTransformMessage _msg = _message.ReadMessage <SyncTransformMessage>(); if (_msg.forObjectID != netId) { Manager.Instance.ConnectedObjects[_msg.forObjectID].GetComponent <NetworkSyncMessenger>().ReceiveMovementMessage(_msg.positionX, _msg.positionY, _msg.positionZ, _msg.eulerY, _msg.time); } }
public void SendMovementMessage(NetworkInstanceId _playerID, Vector3 _position, Quaternion _rotation, float _timeTolerp) { SyncTransformMessage _msg = new SyncTransformMessage() { positionX = FloatToInt(_position.x), positionY = FloatToInt(_position.y), positionZ = FloatToHalf(_position.z), eulerY = FloatToHalf(_rotation.eulerAngles.y), forObjectID = _playerID, time = FloatToHalf(_timeTolerp) }; NetworkManager.singleton.client.Send(movement_msg, _msg); }
public virtual void OnNewMessage(GlobalGameData msg, Player player) { switch (msg.type) { case "synctransform": { SyncTransformMessage syncTransformMessage = JsonUtility.FromJson <SyncTransformMessage> (msg.data); var objExist = match.spawnedObjects.ContainsKey(msg.objectId); if (objExist) { if (!match.spawnedObjects[msg.objectId].ready) { return; } Entity e = match.spawnedObjects[msg.objectId].entity; managerComponent.SyncTransform(match.world, e, syncTransformMessage); match.BroadcastExceptPlayer("gamedata", msg, player); } break; } } }
protected override JobHandle OnUpdate(JobHandle inputDeps) { float deltaTime = Time.DeltaTime; var isServer = _isServer; var clientHandler = _clientHandler; var serverHandler = _serverHandler; Entities.WithoutBurst().ForEach( (ref TransformSyncData syncData, ref Translation translation, ref RotationEulerXYZ rot, in IdentityData identity, in Entity entity) => { syncData.timeTillLastSync += deltaTime; if (identity.hasLocalAuthority) { var msg = new SyncTransformMessage(null, null, false, false); if (syncData.timeTillLastSync >= syncData.syncTime) { syncData.timeTillLastSync = 0f; if (syncData.syncPosition) { var oldPos = new Vector3(syncData.posX, syncData.posY, syncData.posZ); if (Vector3.Distance(oldPos, translation.Value) > 0.1f) { msg.pos = new Float4(translation.Value.x, translation.Value.y, translation.Value.z, 0); syncData.posX = translation.Value.x; syncData.posY = translation.Value.y; syncData.posZ = translation.Value.z; msg.isPos = true; } } if (syncData.syncRotation) { var oldRot = new Vector3(syncData.rotX, syncData.rotY, syncData.rotZ); if (Vector3.Distance(oldRot, rot.Value) > 0.01f) { msg.rot = new Float4(rot.Value.x, rot.Value.y, rot.Value.z, 0); syncData.rotX = rot.Value.x; syncData.rotY = rot.Value.y; syncData.rotZ = rot.Value.z; msg.isRot = true; } } } if (msg.isPos || msg.isRot) { if (isServer) { serverHandler.SendToMatch("synctransform", identity.objectId, msg, identity.matchId); } else { clientHandler.SendGameData("synctransform", identity.objectId, msg); } } } else { var t = syncData.timeTillLastSync / syncData.syncTime; if (syncData.syncPosition) { if (syncData.syncPosMode == TransformSyncData.PosMode.Translation) { if (syncData.interpolatePosition && !isServer) { translation.Value = Vector3.Slerp(new Vector3(syncData.oposX, syncData.oposY, syncData.oposZ), new Vector3(syncData.posX, syncData.posY, syncData.posZ), t); } else { translation.Value = new float3(syncData.posX, syncData.posY, syncData.posZ); } } } if (syncData.syncRotation) { if (syncData.syncRotMode == TransformSyncData.RotMode.Euler) { if (syncData.interpolateRotation && !isServer) { rot.Value = Vector3.Slerp( new Vector3(syncData.orotX, syncData.orotY, syncData.orotZ), new Vector3(syncData.rotX, syncData.rotY, syncData.rotZ), t); } else { rot.Value = new float3(syncData.rotX, syncData.rotY, syncData.rotZ); } } } } }).Run();
private void OnReceivePlayerMovementMessage(NetworkMessage _message) { SyncTransformMessage _msg = _message.ReadMessage <SyncTransformMessage>(); NetworkServer.SendToAll(movement_msg, _msg); }