Unity 5.2 UNet: освободить GameObject от его владельца

Я тестирую UNET (Unity 5.2), но столкнулся с проблемой вещей, которые, вероятно, должны быть очень простыми.

У меня есть апельсиновый фрукт (GameObject), который я могу перетащить и прикрепил сетевое преобразование в коде. Когда я отпускаю мышь (Mouse Up), я хочу освободить владельца Orange, чтобы никто не владел им, а потом присоединить к другому игроку. Я проверил с ReplacePlayerForConnection и несколько других вещей, но полностью испортил код.

Я сейчас все сбросил и должен попросить помощи, как это сделать.

Сценарии, которые я прилагаю к Orange GameObject:

1

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

public class orange : NetworkBehaviour {

float distance = 10;


void Start() {

    if (isLocalPlayer) {

        //GameObject.Find("Main Camera").SetActive(false);

    }

}

void OnMouseDrag() {

    Vector3 mousePosition = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, distance);
    Vector3 objPosition = Camera.main.ScreenToWorldPoint (mousePosition);

    transform.position = objPosition;

}

void OnMouseUp() {
    print (">>> MOUSE UP <<<");

    if (isLocalPlayer) {
        GetComponent<NetworkIdentity> ().localPlayerAuthority = false;
        GetComponent<NetworkIdentity> ().serverOnly = false;
    }

}

Вот сценарий № 2, прикрепленный к Orange GameObject:

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

public class Orange_SyncPosition : NetworkBehaviour {

[SyncVar] // Server will automatically transmit this value to all players when it changes
private Vector3 syncPos;

[SerializeField] Transform myTransform;
[SerializeField] float lerpRate = 15;

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

void LerpPosition() {

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

}

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

[ClientCallback]
void TransmitPosition () {

    if (isLocalPlayer) {
        CmdProvidePositionToServer (myTransform.position);
    }

}
}

2 ответа

Использование NetworkServer.ReplacePlayerForConnection():

// Player is a NetworkBehaviour on the existing player object
void ReplacePlayer (Player existingPlayer) {

    var conn = existingPlayer.connectionToClient;
    var newPlayer = Instantiate<GameObject>(playerPrefab);

    Destroy(existingPlayer.gameObject);
    NetworkServer.ReplacePlayerForConnection(conn, newPlayer, 0);

}

Использование AssignClientAuthority / RemoveClientAuthority

И никогда не трогайте эти параметры во время выполнения:

GetComponent<NetworkIdentity> ().localPlayerAuthority = false;
GetComponent<NetworkIdentity> ().serverOnly = false;
Другие вопросы по тегам