private async UniTask TransportInternal(TransporterView transporter) { var destination = transporter.transform.position; var stateChangers = _gamePlayers.PlayerList.Select(x => x.GetComponent <PlayerStateChanger>()).ToList(); // プレイヤーの入力を停止 foreach (var player in _gamePlayers.PlayerList) { player.SetFreezeMode(true); } await UniTask.WhenAll(stateChangers.Select(x => x.DoChangeAsync(PlayerState.Photosphere))); var transportAsyncEnumerable = _gamePlayers.PlayerList .Select(player => DoMovePlayer(player, destination, TweenDuration)) .Append(_gameCamera.MoveAsync(transporter.Owner)); await UniTask.WhenAll(transportAsyncEnumerable); await UniTask.WhenAll(stateChangers.Select(x => x.DoChangeAsync(PlayerState.Neutral))); // プレイヤーの入力を再開 foreach (var player in _gamePlayers.PlayerList) { player.SetFreezeMode(false); } transporter.Owner.Enter(_gamePlayers.PlayerList); }
/// <summary> /// 転送 /// </summary> /// <param name="transporter"></param> /// <returns></returns> public UniTask TransportAsync(TransporterView transporter) { if (transporter == null) { throw new ArgumentNullException(nameof(transporter)); } // TODO: Play Transport Animation return(new UniTask(() => TransportInternal(transporter))); }