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

}
}

person PeterK    schedule 26.10.2015    source источник
comment
Апельсин - объект игрока?   -  person user3071284    schedule 28.10.2015
comment
Апельсин - объект игрока.   -  person PeterK    schedule 30.10.2015
comment
NetworkServer.ReplacePlayerForConnection () должен быть тем, что вы хотите. Попробуйте это и включите свой код, если он не работает.   -  person user3071284    schedule 30.10.2015
comment
@ user3071284 Спасибо за ваш ответ, это тоже мое предположение. Однако требуются следующие параметры: conn: Соединение, которое добавляет игрока. player: объект игрока, созданный для игрока. playerControllerId: Идентификационный номер контроллера игрока, указанный клиентом. Как мне найти правильное соединение?   -  person PeterK    schedule 31.10.2015


Ответы (2)


Используйте 1_:

// 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);

}
person user3071284    schedule 31.10.2015

Используйте AssignClientAuthority / RemoveClientAuthority

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

GetComponent<NetworkIdentity> ().localPlayerAuthority = false;
GetComponent<NetworkIdentity> ().serverOnly = false;
person Sergey Molchanovsky    schedule 29.05.2018