Нужно прояснить одну вещь в этом многопользовательском руководстве по AR.

Я экспериментирую с простым многопользовательским приложением AR, созданным с помощью этого руководства:

https://www.youtube.com/watch?v=n3a-aaSYR8s

Исходный код

Оно работает! Но я не уверен, почему 2 объекта, которые были созданы одинаково, расположены по-разному: луна и игрок.

Почему игровой объект «Игрок» остается привязанным к телефону пользователя, а «Луна» — к какому-то месту в комнате? И почему расположение луны после инстанцирования не совпадает с плеером?

Оба они создаются с помощью одной и той же команды:

PhotonNetwork.Instantiate ("SampleMoon", Vector3.zero, Quaternion.identity, 0);

Если код создания экземпляра одинаков для обоих из них, имеет ли разница в позиционировании какое-то отношение к самим этим префабам? Что именно вызывает это?


person Rumata    schedule 16.09.2018    source источник
comment
Я добавил к вашему вопросу ссылку на репозиторий из видео на YouTube, чтобы людям было проще посмотри на это   -  person derHugo    schedule 17.09.2018
comment
@derHugo Спасибо!   -  person Rumata    schedule 17.09.2018


Ответы (1)


Посмотрите еще раз видео с 17:16!

Разница не в экземпляре, а в компонентах, к которым присоединены созданные объекты (префабы):

MoonController (используется Moon ) vs PlayerController (используется игрок)


В то время как MoonController практически ничего не делает чем регистрация Луны:

void Start () 
{
    // Register this object to the current game controller.
    // This is important so that all clients have a reference to this object.
    GameController.Instance.RegisterMoon (this);
}

Для PlayerController всегда устанавливается значение position и rotation камеры в методе Update (в этом приложении «Камера = смартфон игрока»). Я выделил значимые строки жирным шрифтом:

public Transform CameraTransform;

    private void Start ()
    {
        CameraTransform = FindObjectOfType ().transform;
        // Register this player to the GameController. 
        // Important: all clients must have a reference to this player.
        GameController.Instance.RegisterPlayer (this);

        // Hide your own model if you are the local client.
        if (photonView.isMine)
            gameObject.transform.GetChild (0).gameObject.SetActive (false);
    }

    void Update () 
    {
        // If this player is not being controlled by the local client
        // then do not update its position. Each client is responsible to update
        // its own player.
        if (!photonView.isMine && PhotonNetwork.connected)
            return;

        // The player should have the same transform as the camera
        gameObject.transform.position = CameraTransform.position;
        gameObject.transform.rotation = CameraTransform.rotation;
    }
}

Таким образом, в первом кадре после создания экземпляров обоих объектов объект Player уже находится в позиции и вращении камеры, в то время как Луна остается в точке создания экземпляра 0,0,0.

person derHugo    schedule 17.09.2018
comment
Большое спасибо, это действительно полезно! - person Rumata; 17.09.2018
comment
Рад, что смог помочь! - person derHugo; 17.09.2018