protected override void OnUpdate() { for (var i = 0; i < transformData.Length; i++) { var rigidbody = transformData.GameObjectRigidBody[i]; var transform = transformData.Transform[i]; var nativePosition = new Vector3(transform.Location.X, transform.Location.Y, transform.Location.Z); var positionDifference = (rigidbody.position - origin - nativePosition).sqrMagnitude; // Sync if sufficient difference or if sufficient time has passed if (positionDifference <= ToleranceMeters) { var nativeRotation = new UnityEngine.Quaternion(transform.Rotation.X, transform.Rotation.Y, transform.Rotation.Z, transform.Rotation.W); var rotationDifference = UnityEngine.Quaternion.Angle(rigidbody.rotation, nativeRotation); if (rotationDifference <= ToleranceAngle) { var differencesGreaterThanZero = positionDifference == 0.0f && rotationDifference == 0.0f; if (differencesGreaterThanZero || tickSystem.GlobalTick - transform.Tick < MaxTicksUntilSync) { continue; } } } var position = rigidbody.position - origin; var location = new Location { X = position.x, Y = position.y, Z = position.z }; var rotation = new Quaternion { W = rigidbody.rotation.w, X = rigidbody.rotation.x, Y = rigidbody.rotation.y, Z = rigidbody.rotation.z }; var newTransform = new Transform.Component { Location = location, Rotation = rotation, Tick = tickSystem.GlobalTick }; var newPosition = new Position.Component { Coords = new Coordinates { X = newTransform.Location.X, Y = newTransform.Location.Y, Z = newTransform.Location.Z } }; transformData.Transform[i] = newTransform; transformData.Position[i] = newPosition; } }
private void UnitQuery(Entity entity, ref BaseUnitStatus.Component status, ref Position.Component position) { bool isActive = false; var pos = position.Coords.ToUnityVector() + this.Origin; foreach (var kvp in hexIndexes) { if (HexUtils.IsInsideHex(this.Origin, kvp.Key, pos) == false) { continue; } isActive = kvp.Value.IsActive; break; } if (isActive) { if (status.State == UnitState.Sleep) { status.State = UnitState.Alive; } } else { if (status.State == UnitState.Alive) { status.State = UnitState.Sleep; } } }
private void ResourceQuery(Entity entity, ref HexPowerResource.Component resource, ref Position.Component position) { var pos = position.Coords.ToUnityVector() + this.Origin; foreach (var kvp in this.HexDic) { var index = kvp.Key; if (HexUtils.IsInsideHex(this.Origin, index, pos, HexDictionary.HexEdgeLength) == false) { continue; } resourceDictionary.TryGetValue(index, out var current); resourceDictionary[index] = current + resource.Level * HexDictionary.HexResourceRate; } }
protected override void OnUpdate() { for (int i = 0; i < data.Length; ++i) { var t = data.Transform[i]; var coords = new Coordinates { X = t.Location.X, Y = t.Location.Y, Z = t.Location.Z, }; var position = new Position.Component { Coords = coords }; data.Position[i] = position; } }
private void TowerQuery(Entity entity, ref SymbolicTower.Component tower, ref Position.Component position) { var settings = TowerDictionary.Get(tower.Side); if (settings == null) { Debug.LogErrorFormat("There is no Tower Settings. Side:{0}", tower.Side); } GameObject towerObj; if (towerObjDic.ContainsKey(tower.Side) == false) { towerObj = GameObject.Instantiate(settings.TowerObject); towerObj.transform.SetParent(rootObject.transform, false); towerObjDic[tower.Side] = towerObj; } else { towerObj = towerObjDic[tower.Side]; } var t_pos = position.Coords.ToUnityVector() + this.Origin; var diff = t_pos - playerPosition.Value; var length = Mathf.Max(minLimitLength, diff.magnitude); if (minLength > length) { minLength = length; } var rate = Mathf.Min(1.0f, TowerDictionary.DispLength / length); var scaledPos = rate * diff + playerPosition.Value; towerObj.transform.localScale = Vector3.one * rate; towerObj.transform.position = scaledPos; }
private void Query(Entity entity, ref HexBase.Component hex, ref HexPower.Component power, ref Position.Component position, ref SpatialEntityId entityId) { if (hex.Attribute.IsTargetable() == false) { return; } if (hexDic.ContainsKey(hex.Index) == false) { hexDic[hex.Index] = new HexLocalInfo(); } hexDic[hex.Index].Index = hex.Index; hexDic[hex.Index].HexId = hex.HexId; hexDic[hex.Index].Side = hex.Side; hexDic[hex.Index].EntityId = entityId; hexDic[hex.Index].Powers = power.SidePowers; hexDic[hex.Index].isActive = power.IsActive; }
private void FactoryQuery(Unity.Entities.Entity entity, ref UnitFactory.Component factory, ref ResourceComponent.Component resource, ref BaseUnitStatus.Component status, ref Position.Component position, ref StrongholdSight.Component sight, ref SpatialEntityId entityId) { if (status.State != UnitState.Alive) { return; } if (UnitUtils.IsBuilding(status.Type) == false) { return; } if (status.Order == OrderType.Idle) { return; } FollowerOrder?f_order = null; SuperiorOrder?s_order = null; TeamOrder? team_order = null; TurretOrder? turret_order = null; FactoryOrderType orderType = FactoryOrderType.None; if (factory.SuperiorOrders.Count > 0) { s_order = factory.SuperiorOrders[0]; orderType = FactoryOrderType.Superior; } else if (factory.FollowerOrders.Count > 0) { f_order = factory.FollowerOrders[0]; orderType = FactoryOrderType.Follower; } else if (factory.TeamOrders.Count > 0) { team_order = factory.TeamOrders[0]; orderType = FactoryOrderType.Team; } else if (factory.TurretOrders.Count > 0) { turret_order = factory.TurretOrders[0]; orderType = FactoryOrderType.Turret; } if (orderType == FactoryOrderType.None) { return; } // calc time cost int resourceCost; float timeCost; if (CalcOrderCost(out resourceCost, out timeCost, f_order, s_order, team_order) == false) { return; } //Debug.LogFormat("ResourceCost:{0} TimeCost:{1}", resourceCost, timeCost); if (factory.CurrentType == FactoryOrderType.None) { if (resource.Resource < resourceCost) { //Debug.LogFormat("ResourcePoor:{0}", resource.Resource); return; } factory.ProductInterval = IntervalCheckerInitializer.InitializedChecker(timeCost); factory.CurrentType = orderType; resource.Resource -= resourceCost; } factoryInter = factory.ProductInterval; if (CheckTime(ref factoryInter) == false) { return; } Coordinates?random = null; if (sight.StrategyVector.Side != UnitSide.None) { random = GetEmptyCoordinates(entityId.EntityId, position.Coords, sight.StrategyVector.Vector, height_buffer, factory.Containers); } if (random == null) { //Debug.LogFormat("There is no Empty"); return; } //Debug.LogFormat("CreateUnit!"); factory.ProductInterval = factoryInter; var coords = random.Value;//GetEmptyCoordinates(entityId.EntityId, position.Coords, height_buffer, factory.Containers); EntityTemplate template = null; bool finished = false; UnitType type = UnitType.None; if (s_order != null) { template = CreateSuperior(factory.SuperiorOrders, coords, out finished); type = UnitType.Commander; } else if (f_order != null) { template = CreateFollower(factory.FollowerOrders, coords, f_order.Value.Customer, out finished); type = UnitType.Soldier; } if (template != null) { var request = new WorldCommands.CreateEntity.Request ( template, context: new ProductOrderContext() { f_order = f_order, s_order = s_order, type = type, strongholdId = entityId.EntityId, container = new UnitContainer(coords.ToFixedPointVector3(), ContainerState.Created) } ); this.CommandSystem.SendCommand(request); } else if (team_order != null) { CreateTeam(factory.TeamOrders, status.Side, entityId.EntityId, coords, out finished); } else if (turret_order != null) { // todo turret } if (finished) { factory.CurrentType = FactoryOrderType.None; } }