예제 #1
0
 // Use this for initialization
 void Start()
 {
     ARWorld.CreateWith(ARWorld.Platform.ARKit);
     ARWorld.ar.onClickPlane += (pos, rot) =>
     {
         obj.transform.position = pos;
         obj.transform.rotation = rot;
     };
 }
예제 #2
0
        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();
        }
예제 #3
0
        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));
            }
        }
예제 #4
0
        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
                    });
                }
            });
        }
예제 #5
0
        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);
            }
        }
예제 #6
0
        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();
        }
예제 #7
0
        private void Update(string roomName, Action <ARWorld> execute)
        {
            var arWorld = new ARWorld(roomName, EventStore.LoadEventStream(), DomainEventPublisher);

            execute(arWorld);
        }
예제 #8
0
 private void InitializeWorld()
 {
     world = new ARWorld<POI>(this, 50, UpdateElementsOnScreen);
     world.Initialize(pois);
 }