【问题标题】:Getting Race Position in Multiplayer Game in Unity3D using UNET使用 UNET 在 Unity3D 中获取多人游戏中的比赛位置
【发布时间】:2018-09-06 23:15:06
【问题描述】:

我正在使用 UNET 在 Unity3D 中构建 Runnig Race 多人游戏。我有 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");
            }
        }
    }
}

【问题讨论】:

  • 什么是isLocalPlayer,它是如何设置的?
  • 此脚本附加到玩家游戏对象并仅与本地玩家共享。并将仅对本地播放器启用。
  • 我认为他试图问的是isLocalPlayerRpcPosition 方法内的客户端上永远为真。也许可以尝试绕过 Server 方法,只执行 Command 和 ClientRpc 看看是否可行。
  • 不,它不起作用。 @Dtb49
  • 您是否进入了RpcPosition 中的if(isLocalPlayer) 语句?

标签: c# unity3d multiplayer unet


【解决方案1】:

所以这是我自己确定的答案。我所做的是我为 Player Position Indicator 添加了 2 个 Slider 以显示谁是第一和谁是第二,我将 Slider 的最小值设置为 Player 的 Start Position,Max Value 设置为 Player 的 Finish Position,然后我比较了值滑块。

代码如下:

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;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多