UNET - 同步。非玩家对象上的颜色脚本

时间:2016-10-04 18:44:35

标签: c# unity3d unity3d-5 unity3d-unet

我已经尝试解决这个问题几个星期而没有成功,真的需要帮助。

当我在实际玩家对象上启动颜色同步时,我可以在非玩家对象上同步颜色。

但是,我遇到的问题是我想将脚本附加到管理颜色同步的非玩家对象。我对位置和旋转同步有相同的作用。

当我拖动非玩家对象时,我将其着色为红色,当我放下拖动时,我将其重新着色为白色。但是,我在远程客户端上拖动时遇到授权问题,这就是为什么我认为我无法解决。

以下是序列:

  1. On-DragStart a)AssignNetworkAuthority b)将颜色更改为红色
  2. On_DragEnd a)重绘为白色b)ReleaseNetworkAuthority
  3. 当我从远程客户端执行此操作时,我收到权限错误。我的结论可能是错误的,因为某些原因,assign-remove权限声明与绘画不同步。

    这是我使用的代码(之前分配了childGameObject):

    public void On_DragStart (Gesture gesture) {
    
        if (!isLocalPlayer) 
            return;
    
        // Assign Network Authority
        myNetID = childGameObject.GetComponent<NetworkIdentity> ();
    
        // >>>> HERE I ASSIGN AUTHORITY
        Cmd_AssignNetworkAuthority (myNetID.netId, childGameObject);
    
        // >>>> HERE I CHANGE THE COLOR TO RED
        childGameObject.GetComponent<Renderer> ().material.color = Color.red;
    
    }
    
    public void On_Drag(Gesture gesture) {
    
        if (!hasAuthority)
            return;
    
        if (firstRun) {
            firstRun = false;
        }
    
        myTransform.transform.position = Camera.main.ScreenToWorldPoint (new Vector3 (gesture.position.x, gesture.position.y, 1f));
    
    }
    
    public void On_DragEnd (Gesture gesture) {
    
        if (!isLocalPlayer) 
            return;
    
        // >>>> HERE I CHANGE THE COLOR BACK TO WHITE
        //      gesture.pickedObject.GetComponent<Renderer> ().material.color = Color.white;
        childGameObject.GetComponent<Renderer> ().material.color = Color.white;
    
        // >>>> HERE I RELEASE AUTHORITY
        Cmd_ReleaseNetworkAuthority ();
    
    }
    

    以下是附加到非玩家对象的实际sync.script:

    using UnityEngine;
    using UnityEngine.Networking;
    using System.Collections;
    
    public class Object_ColorSync : NetworkBehaviour {
    
    [SyncVar] private Color syncColor;
    public GameObject myGO;
    
    void Start () {
        syncColor = myGO.GetComponent<Renderer> ().material.color;
    }
    
    void Update () {
        DoColor ();
    }
    
    void DoColor() {
        Cmd_DoColor (myGO.GetComponent<Renderer> ().material.color);
    }
    
    [Command]
    void Cmd_DoColor(Color _myColor) {
    
        syncColor = _myColor;
        Rpc_DoColor (_myColor);
    }
    
    [ClientRpc]
    void Rpc_DoColor(Color _syncColor) {
        myGO.GetComponent<Renderer> ().material.color = _syncColor;
    }
    }
    

    同步。脚本用于测试,因此在我关闭Cmd_DoColor时没有真正优化。在最后,我将添加一个if语句并检查颜色是否已更改。

1 个答案:

答案 0 :(得分:0)

问题解决了 :-)在我发布这个帖子后,我重新思考了解决这个问题的方法,然后做了一个SyncVar钩子而问题解决了!

以下是新的同步代码:

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class Object_ColorSync : NetworkBehaviour {

[SyncVar (hook = "OnColorChange")] Color newColor;
private Color currentColor;


void OnColorChange(Color _myColor) {

    gameObject.GetComponent<Renderer> ().material.color = _myColor;
    currentColor = _myColor;

}

void Update () {

    if (!hasAuthority)
        return;

    if (currentColor != gameObject.GetComponent<Renderer> ().material.color) {
        Cmd_DoColor (gameObject.GetComponent<Renderer> ().material.color);
    }
}

[Command]
void Cmd_DoColor(Color _theColor) {
    newColor = _theColor;
}

}