【问题标题】:UNET - Sync. script for color on non-player objectUNET - 同步。非玩家对象的颜色脚本
【发布时间】:2017-02-13 01:10:45
【问题描述】:

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

当我在实际播放器对象上启动颜色同步时,我能够在我的非播放器对象上同步颜色。

但是,我遇到的问题是我想将脚本附加到管理颜色同步的非播放器对象。我对位置和旋转同步也有同样的效果。

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

顺序如下:

  1. On-DragStart a) AssignNetworkAuthority b) 将颜色更改为红色
  2. 拖动
  3. On_DragEnd a) 重绘为白色 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 语句并检查颜色是否已更改。

【问题讨论】:

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


    【解决方案1】:

    问题已解决 :-) 在我发布此帖子并改为使用 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;
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-12-21
      • 2018-08-03
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多