2016-03-28 2 views
5

Короче говоря, у меня очень простая многопользовательская игра. Это игра Roll A Ball (учебник Unity3D). Так что прямо сейчас у меня есть игроки и т. Д., И все они отлично умеют контролировать свои собственные шары.Как подключить камеру к объекту игрока, созданному HLAPI Network Manager?

Но вот в чем проблема: у меня есть основная камера по умолчанию. Поскольку сам локальный игрок должен это увидеть, я решил, что нет смысла пытаться создать отдельную камеру для каждого игрока на сервере.

Однако, чтобы камера следила за игроком, мне нужно прикрепить ее к игровому объекту игрока. Очевидно, я не могу прикрепить его к сборке игрока, так как это клон, которому должна следовать камера. Но поскольку игрок генерируется компонентом Network Manager, я понятия не имею, как обращаться к этому клону.

То, что я пробовал себя:

public class CameraController : NetworkManager 
{ 

    public GameObject playerPrefab; 
    public Transform target; 

    private Vector3 offset; 

    public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId) 
    { 
     GameObject player = (GameObject)Instantiate(playerPrefab, new Vector3(0, 0.5f, 0), Quaternion.identity); 
     target = player.transform; 
     NetworkServer.AddPlayerForConnection(conn, player, playerControllerId); 
    } 

    void Start() 
    { 
     offset = transform.position - target.position; 
    } 

    void LateUpdate() 
    { 
     transform.position = transform.position + offset; 
    } 
} 

Но это привело: Screenshot of Error

Что я нахожу очень странным, так как вы можете ясно видеть, что нет NetworkIdentity компонента на объекте NetworkManager. Я пробовал много вещей в течение последних 4 часов, и я просто не могу этого сделать. Так что теперь я надеюсь, что вы, ребята, можете мне помочь.

Редактировать: так Network Manager обычно порождает игрока. Как вы можете видеть, что нет никакого кода для нее:

Network manager player spawn

ответ

3

Я хотел бы добавить камеру к сборного, а затем написать сценарий игрока, как это:

using UnityEngine.Networking; 

public class Player : NetworkBehaviour 
{ 
    public Camera camera; 

    void Awake() 
    { 
     if(!isLocalPlayer) 
     { 
      camera.enabled = false; 
     } 
    } 
} 
+0

Хмм интересный подход. Лемм посмотрю, что я могу с этим сделать. Я дам Вам знать! – icecub

+0

Я пробовал, но камера вообще не размножается. Сначала я получил ошибку, что камера не была привязана к объекту. Он появился и остался неподвижным. Поэтому я прикрепил камеру. Ошибка исчезла, но она больше не порождена, ха-ха. Очевидно, снова, потому что прикрепленная камера является сборной, я думаю .. – icecub

+0

Хмм консоль сообщает мне, что (! IsLocalPlayer) возвращает true .. очевидно, причина, по которой нет камеры .. weird – icecub

2

Я действительно не работал с сетью, но что, если вы сделаете это после того, как вы икру местному игроку

Camera.main.transfor.SetParent(the transform of the local player here); 

Как я понимаю проблема каждого отдельного экземпляра игры имеет основную камеру.

+0

Вы понимаете правильно. Но чтобы иметь возможность сделать это, вам нужно повторить объект клонирования игрока. Который не существует по умолчанию. Игрок появляется только после того, как он присоединяется к команде. Обычно Network Manager просто порождает игрока, но нет никакой реакции на него. Вот почему я переопределяю игру игрока-разработчика компонентов и делаю это сам, поэтому у меня есть это refference 'GameObject player'. – icecub

+0

@icecub поэтому после того, как вы вызываете экземпляр, почему вы не можете установить камеру.main pos для игрока pos, родительский кулачок к объекту игрока, который создан и применяется смещение? –

+0

Потому что это точная проблема. Компонент Network Manager выполняет внутренний экземпляр. Для этого нет кода. Следовательно, переопределение, что приводит к указанной выше проблеме. Я обновил вопрос с помощью скриншота о том, как он работает по умолчанию. Возможно, это немного разъясняет это. – icecub

2

Благодаря точке Rafiwui в в правильном направлении, я, наконец, удалось получить его работу. Все, что мне нужно было сделать, было неплохо по сравнению с его кодом. Конечный результат был:

public Camera camera; 

void Awake() 
{ 
    camera.enabled = false; 
} 

public override void OnStartLocalPlayer() 
{ 
    camera.enabled = true; 
} 

СМОТРЕТЬ БОЛЬШЕ всем, кто помогает мне! Для меня это был целый день.

6

У меня была та же проблема и вышла из решения для последующих действий. Похоже, у вас уже есть решение, но, может быть, интересно поделиться некоторыми возможными способами для других людей в той же ситуации.

Это способ сделать это без камеры, прикрепленной к сборным плитам.

Я использую NetworkManager для создания экземпляров Player-prefabs. (То же, что и вы)

Я решил проблему поиска ссылок на объекты клона, позволяя клонам сообщать камере, кто они (или какое преобразование принадлежит им).

Игрок имеет следующий сценарий:

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

public class PlayerController : NetworkBehaviour { 



public override void OnStartLocalPlayer() 
{ 
    GetComponent<MeshRenderer>().material.color = Color.blue; 
    Camera.main.GetComponent<CameraFollow>().target=transform; //Fix camera on "me" 

} 

void Update() 
{ 
    if (!isLocalPlayer) 
    { 
     return; 
    } 
    var x = Input.GetAxis("Horizontal") * Time.deltaTime * 150.0f; 
    var z = Input.GetAxis ("Vertical") * Time.deltaTime * 3.0f; 

    transform.Rotate (0, x, 0); 
    transform.Translate (0,0,z); 

} 
} 

На моем умолчании основной камеры (там нет камеры прилагается к плееру сборного, только камеры по умолчанию) я поставил следующий сценарий на. Он принимает цель, которую я инициализировал с помощью prefab, используя инспектор.

using UnityEngine; 
using System.Collections; 

public class CameraFollow : MonoBehaviour { 

public Transform target; //what to follow 
public float smoothing = 5f; //camera speed 

Vector3 offset; 

void Start() 
{ 
    offset = transform.position - target.position; 
} 

void FixedUpdate() 
{ 
    Vector3 targetCamPos = target.position + offset; 
    transform.position = Vector3.Lerp (transform.position, targetCamPos,smoothing * Time.deltaTime); 
} 
} 

После запуска игры, каждый клон говорит камеру, кто он, так что целевые изменения отдельных клиентов клонировать с этой линией от сценария Игрока:

Camera.main.GetComponent<CameraFollow>().target=transform; //Fix camera on "me" 

Таким образом, вы не» вам нужно создать одну камеру на один экземпляр плей-плееров (я не уверен, что это сильно влияет на производительность), и вам не нужно деактивировать все камеры, которые не принадлежат вашему клиенту.

Если вы размещаете игру в редакторе, вы можете видеть, что на одну подключенную камеру есть только одна камера вместо одной камеры (например, когда вы прикрепляете ее к сборке).

Я думаю, что это хороший способ использования этого метода, вы можете использовать его, чтобы поместить в него вещи, которые должны применяться только к локальному проигрывателю.

public override void OnStartLocalPlayer() 
{ 
} 

Я пробовал, начиная игру в редакторе и в сборке, и, похоже, хорошо работает.

Смежные вопросы