Получение позиции в гонке в многопользовательской игре в Unity3D с использованием UNET

Я создаю многопользовательскую игру Runnig Race в Unity3D с использованием UNET. У меня сразу 2 игрока бегают в игре Subway Surfer. Я хочу обновить позицию игрока во время работы, кто первый, а кто второй, и наоборот, код работает для Host Player, но не обновляет позицию другого игрока. Пожалуйста, помогите мне, что я делаю неправильно.

Вот мой код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class PlayerPosition : NetworkBehaviour {

    GameObject[] Players;
    Vector3 playerPos;


    void Start () {
        InvokeRepeating("UpdatePosition", 0.5f, 0.5f);
    }

    void UpdatePosition () {

        if (!isLocalPlayer)
            return;

            ClientPositionCalls();
    }

    [Client]
    void ClientPositionCalls()
    {
        CmdServerPosition();
    }

    [Command]
    public void CmdServerPosition()
    {
        Position();
    }

    [Server]
    public void Position()
    {
        playerPos = transform.position;
        RpcPosition(playerPos);
    }

    [ClientRpc]
    void RpcPosition(Vector3 pos)
    {
        if (isLocalPlayer)
        {
            playerPos = pos;
            Players = GameObject.FindGameObjectsWithTag("Player");
            foreach (GameObject p in Players)
            {

                if (p.transform.position.z < pos.z)
                    PlayerCanvas.canvas.WritePositionText("1");
                else
                    PlayerCanvas.canvas.WritePositionText("2");
            }
        }
    }
}

person Jamshaid Alam    schedule 28.03.2018    source источник
comment
Что такое isLocalPlayer и как его установить?   -  person Ryanas    schedule 28.03.2018
comment
Этот скрипт прикреплен к игровому объекту Player и доступен только локальному игроку. и включит только для локального игрока.   -  person Jamshaid Alam    schedule 28.03.2018
comment
Я думаю, что то, что он пытался спросить, isLocalPlayer всегда верно для клиента внутри метода RpcPosition. Возможно, попробуйте обойти метод сервера и просто выполните Command и ClientRpc и посмотрите, сработает ли это.   -  person Dtb49    schedule 28.03.2018
comment
Нет, это не сработало. @Dtb49   -  person Jamshaid Alam    schedule 29.03.2018
comment
Вы попадаете внутрь оператора if(isLocalPlayer) в RpcPosition?   -  person Dtb49    schedule 29.03.2018
comment
Я это уже исправляю. Спасибо за ответ. :) Я опубликую исправление к завтрашнему дню.   -  person Jamshaid Alam    schedule 29.03.2018


Ответы (1)


Итак, вот ответ, исправленный мной. Что я сделал, так это добавил 2 ползунка для индикатора позиции игрока, чтобы показать, кто первый, а кто второй, и я установил минимальное значение ползунка для начальной позиции игрока и максимальное значение для конечной позиции игрока, а затем я сравнил значение слайдера.

вот код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class PlayerPosition : NetworkBehaviour {

    GameObject[] Players;
    Vector3 playerPos;

    // Update is called once per frame
    void Update() {

        if (!isLocalPlayer)
            return;
            ClientPositionCalls();

            if (PlayerCanvas.canvas.hostDotObj.GetComponent<Slider>().value > PlayerCanvas.canvas.clientDotObj.GetComponent<Slider>().value)
            {
                PlayerCanvas.canvas.WritePositionText("1");
            } else
            {
                PlayerCanvas.canvas.WritePositionText("2");
            }
    }

    [Client]
    void ClientPositionCalls()
    {
        CmdServerPosition();
    }

    [Command]
    public void CmdServerPosition()
    {
        playerPos = transform.position;
        RpcPosition(playerPos);
    }

    [ClientRpc]
    void RpcPosition(Vector3 pos)
    {
        if (isLocalPlayer)
        {
            PlayerCanvas.canvas.hostDotObj.GetComponent<Slider>().value = transform.position.z;
            playerPos = pos;
        } else
        {
            PlayerCanvas.canvas.clientDotObj.GetComponent<Slider>().value = pos.z;
        }
    }
}
person Jamshaid Alam    schedule 30.03.2018