Photon, PlayFab и Unity3D - игроки, не появляющиеся после присоединения к Photon Room - PullRequest
0 голосов
/ 27 апреля 2018

Я работаю над многопользовательской игрой в Unity, которая использует Playfab и Authentication и Photon, в которой находится мультиплеер. Я могу успешно доставить игроков в одну комнату и загрузить сцену после того, как игроки «присоединятся» к этой комнате, однако, когда 2 игрока находятся в одной комнате, они не могут видеть друг друга.

Это мой сервис аутентификации:

public class LoginWithCustomID : MonoBehaviour
{
    private string _playFabPlayerIdCache;
    private bool _isNewAccount;
    private string _playerName;

    // Use this to auth normally for PlayFab
    void Awake()
    {
        PhotonNetwork.autoJoinLobby = false;
        PhotonNetwork.automaticallySyncScene = true;
        DontDestroyOnLoad(gameObject);
        authenticateWithPlayfab();
    }

    private void authenticateWithPlayfab()
    {
        var request = new LoginWithCustomIDRequest
        {
            CustomId = "CustomId123",
            CreateAccount = true,
            InfoRequestParameters = new GetPlayerCombinedInfoRequestParams()
            {
                GetUserAccountInfo = true,
                ProfileConstraints = new PlayerProfileViewConstraints()
                { ShowDisplayName = true }
            }
        };
        PlayFabClientAPI.LoginWithCustomID(request, requestPhotonToken, OnLoginFailure);
    }

    private void requestPhotonToken(LoginResult result)
    {
        PlayerAccountService.loginResult = result;
        _playFabPlayerIdCache = result.PlayFabId;
        _playerName = result.InfoResultPayload.AccountInfo.TitleInfo.DisplayName;
        if (result.NewlyCreated)
        {
            _isNewAccount = true;
            setupNewPlayer(result);
        }

        PlayFabClientAPI.GetPhotonAuthenticationToken(new GetPhotonAuthenticationTokenRequest()
        {
            PhotonApplicationId = "photonId123"
        }, AuthenticateWithPhoton, OnLoginFailure);
    }

    private void setupNewPlayer(LoginResult result)
    {
        PlayFabClientAPI.UpdateUserData(
            new UpdateUserDataRequest()
            {
                Data = new Dictionary<string, string>()
                {
                    { "Level", "1" },
                    { "xp", "0" }
                }
            }, success =>
            {
                Debug.Log("Set User Data");
            }, failure =>
             {
                 Debug.Log("Failed to set User Data..");
             }
        );
    }

    private void AuthenticateWithPhoton(GetPhotonAuthenticationTokenResult result)
    {
        Debug.Log("Photon token acquired: " + result.PhotonCustomAuthenticationToken);
        var customAuth = new AuthenticationValues { AuthType = CustomAuthenticationType.Custom };
        customAuth.AddAuthParameter("username", _playFabPlayerIdCache);
        customAuth.AddAuthParameter("token", result.PhotonCustomAuthenticationToken);
        PhotonNetwork.AuthValues = customAuth;
        setNextScene();            
    }

    private void setNextScene()
    {
        if(_isNewAccount || _playerName == null)
        {
            SceneManager.LoadSceneAsync("CreatePlayerName", LoadSceneMode.Single);
        }
        else
        {
            SceneManager.LoadSceneAsync("LandingScene", LoadSceneMode.Single);
        }
    }

    private void OnLoginFailure(PlayFabError error)
    {
        Debug.LogWarning("something went wrong in auth login");
        Debug.LogError("Here's some debug info:");
        Debug.LogError(error.GenerateErrorReport());
    }

}

}

Это все работает, и игрок входит в PlayFab, а также в Photon, я бы предположил, если бы я получил токен Photon auth. Это подводит меня к моей сцене приземления, которая, по сути, является местом, где аутентифицированный пользователь может нажать кнопку, чтобы присоединиться к случайной комнате через Photon:

public static GameManager instance;
public static GameObject localPlayer;

private void Awake()
{
    if (instance != null)
    {
        DestroyImmediate(instance);
        return;
    }
    DontDestroyOnLoad(gameObject);
    instance = this;
    PhotonNetwork.automaticallySyncScene = true;
}

// Use this for initialization
void Start()
{
    PhotonNetwork.ConnectUsingSettings("A_0.0.1");
}

public void JoinGame()
{
    RoomOptions ro = new RoomOptions();
    ro.MaxPlayers = 4;
    PhotonNetwork.JoinOrCreateRoom("Test Room 2", ro, null);
}

public override void OnJoinedRoom()
{
    Debug.Log("Joined Room!");
    if (PhotonNetwork.isMasterClient)
    {
        PhotonNetwork.LoadLevel("Test_Map1");
    }
}

private void OnLevelWasLoaded(int level)
{
    if (!PhotonNetwork.inRoom)
        return;

    localPlayer = PhotonNetwork.Instantiate(
        "Player",
        new Vector3(0, 1f, 0),
        Quaternion.identity,
        0);
}

public void LeaveRoom()
{
    PhotonNetwork.LeaveRoom();
    SceneManager.LoadScene("LandingScene", LoadSceneMode.Single);
}

Это успешно загружает сцену, которую я назвал «Test_scene1», и я показываю в своей сцене имя комнаты и количество активных игроков в комнате. Когда я выполняю запуск и сборку, я получаю playerPrefab пользователя для загрузки в комнату. Когда я провожу игру через единство, я могу заставить второго игрока войти в комнату. Проблема в том, что игроки не видят друг друга, и я не могу понять, почему это так. Я следую инструкциям PLayerfab / Photon на соответствующих сайтах, но я не могу найти ничего, что я сделал ни в одном из них.

Из того, что я прочитал, похоже, что мой метод создания экземпляров может быть неправильным, но я не уверен, почему. Ниже приведен префаб моего плеера с указанием прикрепленных к нему компонентов:

Player Prefab

Я прошу прощения за этот огромный вопрос, я просто хотел предоставить как можно больше информации.

1 Ответ

0 голосов
/ 30 апреля 2018

Этот вопрос был дан ответом на форумах PlayFab здесь .

...