我正在研究和学习 Unity 5、UNET 和网络的一些基础知识。我制作了一个简单的 3D 游戏,您可以在其中四处走动并更改对象的颜色。但是我现在想使它成为多人游戏,而且我在弄清楚如何通过网络发送更改以便所有玩家都可以看到单个玩家的颜色变化时遇到了很多麻烦。
部分问题在于使用较新的 UNET 网络引擎很难找到答案。有时我会遇到适用于旧方式的答案。
所以主要问题是,我如何网络非玩家 GameObject 属性更改?颜色、形状、大小等。
这是我现在拥有的一些代码 - 我有很多不同的版本,所以我只发布当前的:
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class Player_Paint : NetworkBehaviour {
private int range = 200;
[SerializeField] private Transform camTransform;
private RaycastHit hit;
[SyncVar] private Color objectColor;
[SyncVar] private GameObject objIdentity;
void Update () {
CheckIfPainting();
}
void CheckIfPainting(){
if(Input.GetMouseButtonDown(0)) {
if (Physics.Raycast (camTransform.TransformPoint (0, 0, 0.5f), camTransform.forward, out hit, range)) {
string objName = hit.transform.name;
CmdPaint(objName);
}
}
}
[ClientRpc]
void RpcPaint(){
objIdentity.GetComponent<Renderer>().material.color = objectColor;
}
[Command]
void CmdPaint(string name) {
objIdentity = GameObject.Find (name); //tell us what was hit
objectColor = new Color(Random.value, Random.value, Random.value, Random.value);
RpcPaint ();
}
}
我尝试了更多解决方案,包括在我想要更改颜色的对象上编写单独的脚本,包括 [SyncVar] 和挂钩函数。我还尝试了 Debug.Log 对我期望更新客户端上的对象的每个函数,并且它们正在使用预期的数据执行。
我真的不知道还能做什么。我觉得这是我想做的一件非常简单的事情,但我在任何问题、教程或其他资源中都没有遇到过同步非玩家游戏对象的情况。任何想法都会有所帮助,谢谢。