public async UniTask <BuildingRender> Build(BuildingModel model, Vector3 position) { if (cancellationTokenSource != null) { return(null); } Dispose(); cancellationTokenSource = new CancellationTokenSource(); var prefab = buildingAssets.FindBuilding(model.Id); var building = GameObject.Instantiate(prefab, root); var delay = TimeSpan.FromMilliseconds(model.Сonditions.BuildDuration); var token = cancellationTokenSource.Token; building.Root.position = position; progressConstructor.Progress(building.Root.gameObject, delay); await UniTask.Delay(delay, cancellationToken : token); cancellationTokenSource = null; progressConstructor.Stop(building.Root.gameObject); return(building); }
public void Visit(MiningBuildingModel model) { var goal = new MiningGoal(model.Mining, db, buildingService); var progressRoot = building.Root.gameObject; var progressDuration = TimeSpan.FromMilliseconds(model.Mining.Delay); goal.Mining .Where(isActive => isActive) .Subscribe(_ => progressConstructor.Progress(progressRoot, progressDuration)) .AddTo(building); building.Disabled .Subscribe(_ => goal.Dispose()) .AddTo(building); building.Interactived .Subscribe(_ => goal.Execute()) .AddTo(building); goal.Start(); }