0

これはhttp://forum.unity3d.com/threads/re...ms-to-be-broken-in-5-2-1.359149/#post-2785856と同じ問題です

私の問題は次のとおりです。

1) オブジェクトにクライアント権限を割り当てます: AssignClientAuthority

2)オブジェクトを移動します。

3) RemoveClientAuthority を適用すると、オブジェクトはクライアント側の元の位置に戻ります。「TEST」呼び出しは、それが最後のオブジェクトに適用されるかどうかを確認するためのものです。

これはバグですか、それとも私が何か間違ったことをしているのですか?

これは私が行うテストのコード例です:

    foreach (string tagName in MP_Singleton.Instance.master_Object_List) {

        temp_GameObject = GameObject.FindWithTag(tagName);

        Cmd_LocalAuthority (true, temp_GameObject);

        temp_GameObject.GetComponent<Renderer>().sortingOrder = z;

        randomX = UnityEngine.Random.Range (-0.055f, 0.055f);
        randomY = UnityEngine.Random.Range (-0.055f, 0.055f);
        randomX = randomX + deckStartPosX;
        randomY = randomY + deckStartPosY;

        Rpc_Position (temp_GameObject, randomX, randomY, z, twistAngle);

        // Add to depth
        z++;

    }

    Cmd_LocalAuthority (false, temp_GameObject); //<< TEST

RPC:

[ClientRpc]
void Rpc_Position(GameObject myGO, float ranX, float ranY, int zDepth, float twist) {

    myGO.transform.position = new Vector3 (ranX, ranY, zDepth);
    myGO.transform.localEulerAngles = new Vector3(0f, 0f, twist);

}

Cmd_LocalAuthority:

[Command]
void Cmd_LocalAuthority(bool getAuthority, GameObject obj) {

    objNetId = obj.GetComponent<NetworkIdentity> ();        // get the object's network ID

    if (getAuthority) {
        objNetId.AssignClientAuthority (connectionToClient);    // assign authority to the player
    } else {
        objNetId.RemoveClientAuthority (connectionToClient);    // remove the authority from the player
    }
}
4

1 に答える 1

0

Unity の優秀な人々がこの問題を解決するのを手伝ってくれましたが、それは私自身の過ちでした。

修正に少なくとも 2 ~ 3 か月費やしたものは、すぐに修正されました。

私が見逃したのは、問題の原因となった pos-sync-script の権限のチェックがあったことです。「Cmd_ProvidePositionToServer」にあります。

コードは次のとおりです。

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

public class Object_SyncPosition : NetworkBehaviour {

private Transform myTransform;
[SerializeField] float lerpRate = 5;
[SyncVar] private Vector3 syncPos;
private NetworkIdentity theNetID;

private Vector3 lastPos;
private float threshold = 0.5f;


void Start () {
    myTransform = GetComponent<Transform> ();
    syncPos = GetComponent<Transform>().position;
}


void FixedUpdate () {
    TransmitPosition ();
    LerpPosition ();
}

void LerpPosition () {
    if (!hasAuthority) {
        myTransform.position = Vector3.Lerp (myTransform.position, syncPos, Time.deltaTime * lerpRate);
    }
}

[Command]
void Cmd_ProvidePositionToServer (Vector3 pos) {
    syncPos = pos;
}

[ClientCallback]
void TransmitPosition () {
    if (hasAuthority  && Vector3.Distance(myTransform.position, lastPos) > threshold) {
        Cmd_ProvidePositionToServer (myTransform.position);
        lastPos = myTransform.position;
    }
}
}
于 2016-09-17T11:51:03.490 に答える