// Use this for initialization void Start() { ARWorld.CreateWith(ARWorld.Platform.ARKit); ARWorld.ar.onClickPlane += (pos, rot) => { obj.transform.position = pos; obj.transform.rotation = rot; }; }
protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); RequestWindowFeature(WindowFeatures.NoTitle); SetContentView(Resource.Layout.Main); arMarkerLayout = FindViewById<RelativeLayout>(Resource.Id.arMarkerOverlay); world = new ARWorld<POI>(this, 0.1f, 50, UpdateElementsOnScreen); pois = new List<POI>() { new POI { GeoLocation = new Location { Latitude = -33.832855, Longitude = 151.211989 }, Id = 1, Name = "North" }, new POI { GeoLocation = new Location { Latitude = -33.839878, Longitude = 151.220633 }, Id = 2, Name = "East" }, new POI { GeoLocation = new Location { Latitude = -33.839309, Longitude = 151.195384 }, Id = 3, Name = "West" }, new POI { GeoLocation = new Location { Latitude = -33.848870, Longitude = 151.212342 }, Name = "South", Id = 4 } }; world.Initialize(pois); PopulateWorld(); }
private void RestoreView(ARWorld arWorld) { foreach (var playerView in FindObjectsOfType <PlayerView>()) { Destroy(playerView.gameObject); } _playerViews.Clear(); foreach (var keyValuePair in arWorld.Players) { var player = keyValuePair.Value; InstantiatePlayerView( new PlayerJoined(arWorld.RoomName, player.PlayerId, player.PlayerName, player.Position, player.Rotation)); } }
private void Start() { joinButton.OnClickAsObservable().TakeUntilDestroy(this) .Subscribe(async _ => { _arWorldClient = new ARWorldClient(); _arWorldClient.OnEventReceived.TakeUntilDestroy(this) .Subscribe(e => { switch (e) { case PlayerJoined playerJoined: _arWorld?.Mutate(e); InstantiatePlayerView(playerJoined); AppendLog($"Player {playerJoined.PlayerName} Joined."); break; case PlayerLeft playerLeft: _arWorld?.Mutate(e); DestroyPlayerView(playerLeft); AppendLog($"Player {playerLeft.PlayerName} Left."); break; case PlayerSpoke playerSpoke: _arWorld?.Mutate(e); AppendLog($"{playerSpoke.PlayerName} : {playerSpoke.Message}"); break; case PlayerMoved playerMoved: _arWorld?.Mutate(e); UpdatePlayerView(playerMoved); break; case ARWorldEventStream arWorldEventStream: _arWorld = new ARWorld(arWorldEventStream.RoomName, arWorldEventStream.EventStream, new DomainEventPublisher()); RestoreView(_arWorld); AppendLog( $"EventStreamLength: {arWorldEventStream.EventStream.Events.Count} / Messages : {_arWorld.Messages.Count}"); foreach (var message in _arWorld.Messages) { AppendLog($"restored {message.PlayerName} : {message.Message}"); } break; } }).AddTo(_compositeDisposable); _arWorldClient.Connect(); await _arWorldClient.ExecuteAsync(new JoinCommand() { RoomName = roomName.text, PlayerId = _playerId, PlayerName = userName.text, Position = new Vector3(), Rotation = new Quaternion() }); _isConnecting = true; }); leaveButton.OnClickAsObservable().TakeUntilDestroy(this) .Subscribe(async _ => { if (_arWorldClient == null) { return; } await _arWorldClient.ExecuteAsync(new LeaveCommand() { PlayerId = _playerId }); _isConnecting = false; await _arWorldClient.DisposeAsync(); _arWorldClient = null; _compositeDisposable.Clear(); log.text = ""; }); sayButton.OnClickAsObservable().TakeUntilDestroy(this) .Subscribe(async _ => { if (_arWorldClient == null) { return; } await _arWorldClient.ExecuteAsync( new PlayerSayCommand() { PlayerId = _playerId, Message = messageInputField.text }); }); Observable.EveryUpdate().Where(_ => _isConnecting).Subscribe(async _ => { var pos = mainCamera.transform.position - anchorObject.transform.position; var rot = Quaternion.Inverse(anchorObject.transform.rotation) * mainCamera.transform.rotation; rot.ToAngleAxis(out var angle, out var axis); if (Vector3.Distance(_lastPosition, pos) > 0.01f | angle > 5) { _lastPosition = pos; await _arWorldClient.ExecuteAsync(new PlayerMoveCommand() { PlayerId = _playerId, Position = pos, Rotation = rot }); } }); }
public override void ViewDidAppear(bool animated) { try { base.ViewDidAppear(animated); if (cameraFeedUtility == null) { cameraFeedUtility = new CameraFeedUtility(View, CameraView); } cameraFeedUtility.InitAndStartCamera(); if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0)) { locationManager.RequestWhenInUseAuthorization(); } world = new ARWorld<POI>(View, 50, UpdateElementsOnScreen); world.Initialize(pois); PopulateWorld(); world.StartSensors(); locationManager.LocationsUpdated += LocationManager_LocationsUpdated; locationManager.StartUpdatingLocation(); } catch (Exception ex) { Debug.WriteLine(ex.Message); } }
private async void Start() { var client = new ARWorldClient(); var events = new List <IEvent>(); var domainEventPublisher = new DomainEventPublisher(); var arWorld = new ARWorld("default", new EventStream() { Events = new List <IEvent>() }, domainEventPublisher); client.OnEventReceived.Subscribe(e => { if (e is ARWorldEventStream arWorldEventStream) { events = arWorldEventStream.EventStream.Events; arWorld = new ARWorld("default", arWorldEventStream.EventStream, domainEventPublisher); } else { events.Add(e); arWorld.Mutate(e); } Debug.Log(e.GetType().ToString()); }); client.Connect(); var playerId = Guid.NewGuid().ToString(); await client.ExecuteAsync( new JoinCommand() { PlayerId = playerId, Position = Vector3.zero, RoomName = "default", Rotation = Quaternion.identity, PlayerName = "test" }); await UniTask.Delay(TimeSpan.FromSeconds(3)); await client.ExecuteAsync( new PlayerSayCommand() { Message = "Hello World!", PlayerId = playerId }); await UniTask.Delay(TimeSpan.FromSeconds(3)); await client.ExecuteAsync(new LeaveCommand() { PlayerId = playerId }); await UniTask.Delay(TimeSpan.FromSeconds(3)); await client.WaitForDisconnect(); await client.DisposeAsync(); }
private void Update(string roomName, Action <ARWorld> execute) { var arWorld = new ARWorld(roomName, EventStore.LoadEventStream(), DomainEventPublisher); execute(arWorld); }
private void InitializeWorld() { world = new ARWorld<POI>(this, 50, UpdateElementsOnScreen); world.Initialize(pois); }