Получение полномочий локального игрока на Player Child - PullRequest
0 голосов
/ 18 октября 2018

Я получил свой префаб, прикрепленный к префабу игрока, как ребенок.Я хочу породить Gun Prefab в моем Hand Prefab (Дитя игроков).Так я могу сделать это с уровня руки?

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

NullReferenceException: Object reference not set to an instance of an object
UnityEngine.Networking.NetworkServer.SpawnWithClientAuthority (UnityEngine.GameObject obj, UnityEngine.Networking.NetworkConnection conn) (at C:/buildslave/unity/build/Extensions/Networking/Runtime/NetworkServer.cs:1565)
HandHolder.CmdGetGun () (at Assets/Scripts/HandHolder.cs:27)
HandHolder.Update () (at Assets/Scripts/HandHolder.cs:19)

Вот мой код для руки:

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

public class HandHolder : NetworkBehaviour {

    [SerializeField] GameObject gun;
    private GameObject playerGun;
    // Update is called once per frame
    void Update () {
        if(GetComponentInParent<NetworkIdentity>().isLocalPlayer)
        {
            if (playerGun)
            {
                playerGun.transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z - 1);
                playerGun.transform.rotation = transform.rotation;
            }
            else if (Input.GetKeyDown(KeyCode.I))
            {enter code here
                CmdGetGun();
            }
        }
    }

  // [Command]
    public void CmdGetGun()
    {
        playerGun = Instantiate(gun, transform.position, transform.rotation) as GameObject;
        NetworkServer.SpawnWithClientAuthority(playerGun, GetComponentInParent<NetworkIdentity>().connectionToClient);
    }
}

Когда я добавляю [Command] перед методом CmdGetGun (), в момент появления оружия я получаю эту ошибку:

There is no NetworkIdentity on this object. Please add one.
UnityEngine.Networking.NetworkBehaviour:get_isServer()
HandHolder:CallCmdGetGun()
HandHolder:Update() (at Assets/Scripts/HandHolder.cs:19)

Но когдая добавляю NetworkIdentity к своему детскому префабу рук, он показывает мне, что hasAuthority, isLocalPlayer является ложным как для руки, так и для игрока.

Я понятия не имею, как я могу вызвать пистолет в префабе.

ВотКомпоненты и дерево:

Prefabs

1 Ответ

0 голосов
/ 18 октября 2018

Ваш сетевой объект - это ваш проигрыватель, поэтому вам необходимо направить сетевые функции через ваш проигрыватель.

Вызовите CmdGetGun () * в вашем классе проигрывателя и отзовите его оттуда.
* CmdGetGun ()не должно быть [Command]

При желании вы можете вызвать CmdGetGun в качестве команды, но тогда вам не нужно сетевое создание, только локальное (команда будет вызываться всеми клиентами, поэтому все клиенты будут создавать локальнопистолет).

EDIT
CmdGetGun создаст объект на всех клиентах, но он не будет родительским, как вы ожидаете.Возможно, вам следует попробовать второй подход, который я упомянул (вызвать его как команду, но создать его локально)

...