使用 UNET 在 Unity3D 多人游戏中获取比赛位置
Getting Race Position in Multiplayer Game in Unity3D using UNET
我正在使用 UNET 在 Unity3D 中构建一个 Runnig Race 多人游戏。我有 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");
}
}
}
}
所以这是我自己确定的答案。我所做的是为 Player Position Indicator 添加了 2 个 Slider 以显示谁是第一位,谁是第二位,我将 Slider 的最小值设置为玩家的起始位置,将最大值设置为玩家的完成位置然后我比较了值滑块。
代码如下:
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;
}
}
}
我正在使用 UNET 在 Unity3D 中构建一个 Runnig Race 多人游戏。我有 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");
}
}
}
}
所以这是我自己确定的答案。我所做的是为 Player Position Indicator 添加了 2 个 Slider 以显示谁是第一位,谁是第二位,我将 Slider 的最小值设置为玩家的起始位置,将最大值设置为玩家的完成位置然后我比较了值滑块。
代码如下:
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;
}
}
}