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;