Unity3d 使用Unity中的Unet更改游戏对象上的材质

Unity3d 使用Unity中的Unet更改游戏对象上的材质,unity3d,gameobject,unity3d-unet,Unity3d,Gameobject,Unity3d Unet,当我在任何客户端中单击游戏对象时,我想更改所有客户端上游戏对象的材质。我是UNET的新手,我认为我在概念上有缺陷。所以基本上我想做的是: 在NetworkPlayer上向场景中的对象发射光线 从播放机发送[命令] 在此[Command]中,对对象调用[ClientRpc] 在[ClientRpc]中更改此对象的材质 我的玩家: 使用UnityEngine; 使用UnityEngine。联网; //这个脚本在我的游戏玩家预置中 //(拆下凸轮运动部件) 公共阶级运动:网络行为 { 无效更新() {

当我在任何客户端中单击游戏对象时,我想更改所有客户端上游戏对象的材质。我是UNET的新手,我认为我在概念上有缺陷。所以基本上我想做的是:

  • 在NetworkPlayer上向场景中的对象发射光线
  • 从播放机发送
    [命令]

  • 在此
    [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();
            }
        }