Unity3d 使用Unity中的Unet更改游戏对象上的材质
当我在任何客户端中单击游戏对象时,我想更改所有客户端上游戏对象的材质。我是UNET的新手,我认为我在概念上有缺陷。所以基本上我想做的是:Unity3d 使用Unity中的Unet更改游戏对象上的材质,unity3d,gameobject,unity3d-unet,Unity3d,Gameobject,Unity3d Unet,当我在任何客户端中单击游戏对象时,我想更改所有客户端上游戏对象的材质。我是UNET的新手,我认为我在概念上有缺陷。所以基本上我想做的是: 在NetworkPlayer上向场景中的对象发射光线 从播放机发送[命令] 在此[Command]中,对对象调用[ClientRpc] 在[ClientRpc]中更改此对象的材质 我的玩家: 使用UnityEngine; 使用UnityEngine。联网; //这个脚本在我的游戏玩家预置中 //(拆下凸轮运动部件) 公共阶级运动:网络行为 { 无效更新() {
[命令]
[Command]
中,对对象调用[ClientRpc]
[ClientRpc]
中更改此对象的材质使用UnityEngine;
使用UnityEngine。联网;
//这个脚本在我的游戏玩家预置中
//(拆下凸轮运动部件)
公共阶级运动:网络行为
{
无效更新()
{
如果(!isLocalPlayer)
{
返回;
}
if(Input.GetMouseButtonDown(0))
{
光线=cam.ScreenPointRoay(输入.鼠标位置);
雷卡斯特击中;
如果(物理.光线投射(光线,出击))
CmdNextColor(hit.transform.gameObject);
}
}
[命令]
public void CmdNextColor(游戏对象hitObject)
{
RPC_ColorChange ColorChange=hitObject.GetComponent();
if(colorChange!=null)
{
colorChange.RpcNextColor();
}
}
}
我的目标:
使用UnityEngine;
使用UnityEngine。联网;
使用UnityEngine.UI;
公共类RPC_颜色更改:网络行为{
公共材料[]材料;
[同步变量]
int curColOfThisObject;
文本;
私有void Start()
{
text=getComponentChildren();
}
[客户端RPC]
public void RpcNextColor()
{
如果(!isClient)
返回;
如果(材质长度>0)
{
Material curMaterial=this.GetComponent().Material;
curColOfThisObject++;
if(curColOfThisObject>=材质长度)
curColOfThisObject=0;
curMaterial=材料[curColOfThisObject];
}
}
私有void更新()
{
如果(iClient)
{
text.text=“此对象的新颜色:”+curColOfThisObject.ToString();
}
}
}
发生的情况是:
对象上的文字将更改为适当的颜色,但材质从未更改。如何更改材质
奖金问题:
如果有人知道如何定义UNET游戏的好教程,请告诉我。您的问题是,您在客户端计算
curColOfThisObject
的值,但同时使用[SyncVar]
进行计算
从:
这些变量的值将从服务器同步到客户端
->不要更改RpcNextColor
中客户机上的值,而应更改CmdNextColor
中服务器上的值。否则,curColOfThisObject
将立即被服务器上从未更改过的deafult值覆盖。我将把值作为[ClientRpc]
中的参数传递给客户机,这样从技术上讲,您甚至不需要[SyncVar]
在凸轮移动中
[命令]
public void CmdNextColor(游戏对象hitObject)
{
RPC_ColorChange ColorChange=hitObject.GetComponent();
if(colorChange!=null)
{
colorChange.NextColor();
//计算新curColOfThisObject后,将其发送到客户端(不再需要[SyncVar])
colorChange.RpcNextColor(curcolorfthisObject);
}
}
在RPC\u颜色更改中
//在服务器端计算值
[服务器]
私有void NextColor()
{
如果(材质长度>0)
{
Material curMaterial=this.GetComponent().Material;
curColOfThisObject++;
if(curColOfThisObject>=材质长度)
curColOfThisObject=0;
//同时在服务器上设置材质
curMaterial=材料[curColOfThisObject];
}
}
[客户端RPC]
公共void RpcNextColor(int newValue)
{
如果(!isClient)返回;
//如果保留curColOfThisObject变量,则更易于调试
curColOfThisObject=newValue;
if(newValue=>material.Length)
{
Debug.LogError(“材料中未找到索引”);
返回;
}
//您也可以使用newValue来代替curcolofthis对象
//但这更容易调试
curMaterial=材料[curColOfThisObject];
}
如果您想坚持使用
[SyncVar]
,也可以完全跳过ClientRpc
,将其作为[SyncVar]
的挂钩:
在凸轮移动中
[命令]
public void CmdNextColor(游戏对象hitObject)
{
RPC_ColorChange ColorChange=hitObject.GetComponent();
if(colorChange!=null)
{
colorChange.NextColor();
}
}
在RPC\u颜色更改中
[SyncVar(hook=“OnNextColor”)]
私有int CurfthisObject;
//在服务器端计算该值
[服务器]
私有void NextColor()
{
如果(材质长度>0)
{
Material curMaterial=this.GetComponent().Material;
curColOfThisObject++;
if(curColOfThisObject>=材质长度)
curColOfThisObject=0;
//同时在服务器上设置材质
curMaterial=材料[curColOfThisObject];
}
}
//当
//服务器上的curColOfObject更改为newValue
私有void OnNextColor(int newValue)
{
如果(!isClient)返回;
//如果保留curColOfThisObject变量,则更易于调试
curColOfThisObject=newValue;
if(newValue=>material.Length)
{
Debug.LogError(“材料中未找到索引”);
返回;
}
//除了curcolofthis对象,您还可以使用jus
[Command]
public void CmdNextColor(GameObject hitObject)
{
RPC_ColorChange colorChange = hitObject.GetComponent<RPC_ColorChange>();
if (colorChange != null)
{
int curColor = colorChange.GetCurColor();
// change color +1 on the clients
colorChange.RpcNextColor(curColor);
// assign a SyncVar with the current color
colorChange.SyncColorVar();
}
}