【发布时间】:2017-11-15 04:09:30
【问题描述】:
我正在制作一个简单的 LAN 游戏,以便了解 Unity Networking。它应该做的就是当玩家点击网格中的一个正方形时,它会将其变为蓝色。我的问题是当局域网主机点击一个方块时,它只在本地更新,不更新客户端。当客户端点击一个方块时,它会在本地更新,LAN 主机会更新,但其他客户端不会更新。我所有的网格块都附加了一个网络标识
有什么想法吗?
代码如下:
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class Player_Paint : NetworkBehaviour {
[SyncVar]GameObject syncGridPiece;
GameObject gridPiece;
void Update () {
Paint();
TransmitGridColours();
}
void Paint(){
if(isLocalPlayer && Input.GetMouseButtonDown(0)){
RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
if(hit.collider != null){
print(GameObject.Find (hit.transform.name));
gridPiece = hit.collider.transform.gameObject;
gridPiece.GetComponent<SpriteRenderer>().color = Color.blue;
}
}
}
[Command]
void CmdProvideGridColourToServer(GameObject gridPiece){
if(gridPiece){
syncGridPiece = gridPiece;
syncGridPiece.GetComponent<SpriteRenderer>().color = Color.blue;
}
}
[Client]
void TransmitGridColours(){
if(isLocalPlayer){
CmdProvideGridColourToServer(gridPiece);
}
}
}
【问题讨论】:
-
"if(gridPiece) {" ?这是一个游戏对象...顺便说一句,您只需更新同步变量,所有属性/值/等都由“本地”玩家推送到服务器(即更改颜色,然后向上推 GO)
-
"if(gridPiece) {" 是游戏开始时 GO 为空。仅在单击时才会填充。只是把它放在那里以阻止它向我抛出参考错误。我不完全明白你的意思。当我执行“syncGridPiece = gridPiece;”时这不是更新变量吗?
-
[Command] == 使用本地播放器调用它以向服务器提交数据(通过 [SyncVar] 标记的成员变量。)。 [ClientConnect] == 通过标有 [Command] 前缀的方法接收数据
-
抱歉,我还是没跟上。可以给我一个代码示例吗?
标签: unity3d unity5 unity-networking