public override void Execute(Snapshot snapshot) { string message = $"Расстановка объектов по местам. Кол-во сущностей в контексте {withHpGroup.count}| " + $"Кол-во сущностей в снимке {snapshot.transforms.Count}"; // log.Debug(message); HashSet <ushort> needHandle = new HashSet <ushort>(snapshot.transforms.Keys); foreach (var withHp in withHpGroup) { var isActive = snapshot.transforms.ContainsKey(withHp.id.value); if (!isActive) { //выключить если этот объект тогда не существовал withHp.transform.value.gameObject.SetActive(false); } else { needHandle.Remove(withHp.id.value); //передвинуть если этот объект был withHp.transform.value.gameObject.SetActive(true); ViewTransformCompressed viewTransform = snapshot.transforms[withHp.id.value]; withHp.transform.value.Change(viewTransform); } } if (needHandle.Count != 0) { log.Info($"Не обработано {needHandle.Count} объектов из снимка"); } }
public bool IsSame(ViewTransformCompressed viewTransform1, ViewTransformCompressed viewTransform2) { // bool sameAngle = Math.Abs(viewTransform1.Angle - viewTransform2.Angle) < 1; bool sameAngle = true; bool sameX = Math.Abs(viewTransform1.X - viewTransform2.X) < 1; bool sameZ = Math.Abs(viewTransform1.Z - viewTransform2.Z) < 1; bool sameViewType = viewTransform1.viewTypeEnum == viewTransform2.viewTypeEnum; if (!sameAngle) { log.Debug($"!sameAngle = {viewTransform1.Angle} {viewTransform2.Angle}"); } if (!sameX) { log.Debug($"!sameX = {viewTransform1.X} {viewTransform2.X}"); } if (!sameZ) { log.Debug($"!sameZ = {viewTransform1.Z} {viewTransform2.Z}"); } if (!sameViewType) { log.Debug($"!sameViewType = {viewTransform1.viewTypeEnum} {viewTransform2.viewTypeEnum}"); } return(sameAngle && sameX && sameZ && sameViewType); }
private void AddNewObject(ushort id, ViewTransformCompressed viewTransform) { ServerGameEntity gameEntity = gameContext.CreateEntity(); gameEntity.AddId(id); gameEntity.AddViewType(viewTransform.viewTypeEnum); Quaternion quaternion = Quaternion.AngleAxis(viewTransform.Angle, Vector3.up); gameEntity.AddSpawnTransform(viewTransform.GetPosition(), quaternion); }
public void Execute() { HashSet <ushort> ids = new HashSet <ushort>(withTransformGroup .GetEntities() .Select(item => item.id.value)); float matchTime = matchTimeStorage.GetMatchTime(); Snapshot snapshot; try { snapshot = snapshotManager.CreateInterpolatedSnapshot(matchTime); } catch (Exception e) { log.Error(e.FullMessage()); return; } if (snapshot == null) { throw new NullReferenceException($"snapshot is null"); } foreach (var pair in snapshot.transforms) { ushort entityId = pair.Key; ViewTransformCompressed viewTransform = pair.Value; ServerGameEntity gameEntity = gameContext.GetEntityWithId(entityId); if (gameEntity == null) { AddNewObject(entityId, viewTransform); } else { UpdateTransform(gameEntity, viewTransform); ids.Remove(gameEntity.id.value); } } foreach (ushort id in ids) { // log.Debug($"Удаление объекта id = {id}"); ServerGameEntity gameEntity = gameContext.GetEntityWithId(id); gameEntity.isDestroyed = true; } }
/// <param name="t">Параметр прогресса между p1 и p2. Принимает значение в диапазоне от 0 до 1</param> /// <param name="p0"></param> /// <param name="p1"></param> /// <param name="p2"></param> /// <param name="p3"></param> /// <returns></returns> public static Snapshot Interpolate(float t, Snapshot p0, Snapshot p1, Snapshot p2, Snapshot p3) { if (t < 0 || 1 < t) { throw new ArgumentOutOfRangeException($"t was {t}"); } Snapshot result = new Snapshot(); foreach (ushort entityId in p2.transforms.Keys) { bool v0Exists = p0.transforms.TryGetValue(entityId, out var v0); bool v1Exists = p1.transforms.TryGetValue(entityId, out var v1); //always true bool v2Exists = p2.transforms.TryGetValue(entityId, out var v2); bool v3Exists = p3.transforms.TryGetValue(entityId, out var v3); ViewTransformCompressed interpolated; //Сколько точек есть для интерполяции? if (v0Exists && v1Exists && v2Exists && v3Exists) { //интерполяция между черытьмя точками Vector3 position = CatmullRomSpline .GetCatmullRomPosition(t, v0.GetPosition(), v1.GetPosition(), v2.GetPosition(), v3.GetPosition()); float angle = Mathf.LerpAngle(v1.Angle, v2.Angle, t); interpolated = new ViewTransformCompressed(position.x, position.z, angle, v2.viewTypeEnum); } else if (v1Exists && v2Exists) { //интерполяция между двумя точками Vector3 position = v1.GetPosition() * (1 - t) + v2.GetPosition() * t; float angle = Mathf.LerpAngle(v1.Angle, v2.Angle, t); interpolated = new ViewTransformCompressed(position.x, position.z, angle, v2.viewTypeEnum); } else { //сущность была создана на этом кадре. интерполяция невозможна interpolated = v2; } result.transforms.Add(entityId, interpolated); } return(result); }
public Snapshot Create() { Dictionary <ushort, ViewTransformCompressed> dictionary = new Dictionary <ushort, ViewTransformCompressed>(); foreach (var entity in warshipsGroup) { ushort id = entity.id.value; Transform transform = entity.transform.value; float angle = entity.transform.value.rotation.eulerAngles.y; ViewTypeEnum viewTypeEnum = entity.viewType.value; Vector3 position = transform.position; var viewTransform = new ViewTransformCompressed(position.x, position.z, angle, viewTypeEnum); dictionary.Add(id, viewTransform); } return(new Snapshot(dictionary)); }
private void UpdateTransform(ServerGameEntity entity, ViewTransformCompressed viewTransform) { ushort playerId = PlayerIdStorage.PlayerEntityId; if (entity.id.value == playerId) { return; } Vector3 vector = viewTransform.GetPosition(); entity.transform.value.position = vector; entity.transform.value.rotation = Quaternion.AngleAxis(viewTransform.Angle, Vector3.up); ViewTypeEnum oldViewType = entity.viewType.value; if (oldViewType != viewTransform.viewTypeEnum) { string mes = $"Смена типа сущности. Было {oldViewType.ToString()} стало {viewTransform.viewTypeEnum}"; log.Debug(mes); entity.ReplaceViewType(viewTransform.viewTypeEnum); } }
public static void Change(this Transform transform, ViewTransformCompressed viewTransform) { transform.position = new Vector3(viewTransform.X, 0, viewTransform.Z); transform.rotation = Quaternion.AngleAxis(viewTransform.Angle, Vector3.up); }