0

есть скрипт 1

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
public class PlayerShoot : NetworkBehaviour {
public Weapon weapon;/*dalee ssylaysa na weaponchange*/
public Camera CameraTR;
private RaycastHit hit;
private Ray ray;

public string str;

void Update () 
{
    if (Input.GetKeyDown(KeyCode.Mouse0))
    {
        Shoot ();
    }
}

void Shoot()
{
    ray = CameraTR.ScreenPointToRay (Input.mousePosition);
    if (Physics.Raycast(ray,out hit, weapon.range))
    {
        if (hit.transform.tag == "Player") {
            string id = hit.transform.name;
            Cmdshoot (id, weapon.damage);

        } 
        else if (hit.transform.tag == "destroyable")
        {
            string id = hit.transform.name;
            Cmddestroy (id);
            Debug.Log ("wwwwwww");
        }
    }
}
[Command]
void Cmdshoot (string Id,int dmg)
{
    GameObject go = GameObject.Find (Id);
    go.GetComponent<PlayerInfo> ().GetDamage (dmg);

}
[Command]
void Cmddestroy (string ID)
{
    GameObject go = GameObject.Find (ID);
     go.GetComponent<destroycube> ().f = true;
    Debug.Log ("dddddddd");
    GetComponent<SyncCube> ().ch -= 1;
}

}

и скрипт 2

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

public class destroycube : NetworkBehaviour {
public bool f;
// Use this for initialization
void Start () {
    f = false;
}

void Update () {
    if (f)
    {
        Destroy (this.gameObject);
    }
}
}

в первом скрипте в строке go.GetComponent<destroycube> ().f = true; выпадает ошибка 'NullReferenceException' при попытке клиента удалить объект. Подскажите, пожалуйста, как исправить?

Komrad
  • 1
  • 3
    Как бы очевидно, что GameObject go = GameObject.Find (ID); не нашла с таким ID ничего, потому, видимо, go == null. Это же нужно заниматься отладкой: ставить точку останова на эту строку и проверять значение ID и go при след.шаге. – Bulson Jan 25 '18 at 10:42
  • А вообще на будущее: когда в коде есть поиск чего-то и результат присваивается какой-то переменной, то в коде нужно проверять эту переменную на допустимые значения, перед тем как начать её использовать в дальнейших операциях. – Bulson Jan 25 '18 at 10:46
  • дело в том, что он правильно находит GameObject, так как со стороны сервера все работает отлично. Проблема возникает только у клиента. – Komrad Jan 25 '18 at 11:25

1 Answers1

0

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

Предмет должен создаваться и уничтожаться на мастер-клиенте, на остальных клиентах только подхватываются эти изменения.

M. Green
  • 5,128