1

UNET を使用して、Unity3D で Runnig Race マルチプレイヤー ゲームを構築しています。Subway Surfer というゲームで 2 人のプレイヤーが真っ直ぐ走っています。誰が最初で誰が2番目であるか、またはその逆の実行中にプレーヤーの位置を更新したいのですが、コードはホストプレーヤーに対して機能していますが、他のプレーヤーの位置を更新していません。私が間違っていることを助けてください。

これが私のコードです:

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");
            }
        }
    }
}
4

1 に答える 1

0

だからここに私自身が修正した答えがあります。私がしたことは、プレーヤーの位置インジケーターに2つのスライダーを追加して、誰が最初で誰が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;
        }
    }
}
于 2018-03-30T05:02:39.787 に答える