2016-10-04 68 views
0

我試圖解決這個問題,現在幾個星期沒有成功,真的需要幫助。UNET - 同步。非玩家對象上的顏色腳本

當我啓動實際播放器對象上的顏色同步時,我可以在非播放器對象上同步顏色。

但是,我遇到的問題是我想將腳本附加到管理顏色同步的非播放器對象。我有相同的位置和旋轉同步工作。

當我拖動非玩家對象時,我將它變成紅色,當我拖動拖動時,我將它重新變成白色。但是,當在遠程客戶端上拖動時,我遇到了授權方面的問題,這就是爲什麼我認爲我無法解決問題。

這裏是序列:

  1. 導通的dragstart一個)AssignNetworkAuthority b)中改變顏色以紅色
  2. On_DragEnd一個)重畫,以白色b)中ReleaseNetworkAuthority

當我從遠程客戶端執行此操作時出現權限錯誤。我的結論可能是錯誤的,因爲出於某種原因,分配 - 移除權限聲明與繪畫不同步。

這裏是我使用的代碼(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語句並檢查顏色是否已更改。

回答

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; 
} 

}