问题的一部分在于使用较新的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,并且它们都按预期数据执行。
我真的不知道还能做什么。我感觉我想要做的事情非常简单,但我在任何问题、教程或其他资源中都没有遇到同步非玩家游戏对象的方法。有任何想法都会有所帮助,谢谢。