Клиент Unity3D не может создавать префабы

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

player.cs

void Update(){
    if (!isLocalPlayer) {
        return;
    }
    if (Input.GetMouseButton(0)) {
        CmdDefaultAttack(_skillDefault);
    }

}

[Command]
protected void CmdDefaultAttack(GameObject _attackObject) {

    GameObject bullet = (GameObject)Instantiate(_attackObject,_skill_Default_Spawn.position, _skill_Default_Spawn.rotation);

    bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * 6.0f;

    ClientScene.RegisterPrefab(bullet);

    NetworkServer.Spawn(bullet);

    Destroy(bullet, 2);
}


но я хочу реализовать CmdDefaultAttack в другом унаследованном интерфейсе класса и вызвать его из Player.cs

источник ниже

public interface ISkill {
    void initiate(Player _player);
    void CmdAttack();
    bool CmdMotion();
}

public class SphereSkillDefault : NetworkBehaviour, ISkill {
    Plyaer player;
    public GameObject _skill_Default_Level1;
    public GameObject _skill_Default_Cannon

    public void initiate(Player_player) {
        this.player = _player;
    }
    [Command]
    public void CmdAttack() {
        GameObject bullet = (GameObject)Instantiate(_skill_Default_Level1, player._skill_Default_Spawn.position, player._skill_Default_Spawn.rotation);
        bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * 6.0f;
        NetworkServer.Spawn(bullet);
        Destroy(bullet, 2);
    }

}

player.cs

    ISkill _Idefaultattack;
    public GameObject _defaultattack;

void Start() {
        if (NetworkServer.active)
            Debug.Log("Actived");
        else
            Debug.Log("DeActived");

        if (isLocalPlayer) {
            _Idefaultattack = _defaultattack.GetComponent<SphereSkillDefault>();
            _Idefaultattack.initiate(this);
        }
    }
    void Update() {
        if (!isLocalPlayer) {
            return;
        }
        _Idefaultattack.CmdAttack();
    }

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

И только серверный игрок может стрелять пулями, и это действительно видно клиентам. Но клиенты могут стрелять только со своей стороны, и это не видно другим клиентам или серверу.

я застрял в этой проблеме в течение нескольких дней. Кто-нибудь может дать мне совет?

Спасибо.


person Daniel    schedule 07.07.2016    source источник
comment
Проверьте мой ответ, но также можете ли вы узнать, где вы берете isLocalPlayer?   -  person Jerry Switalski    schedule 07.07.2016
comment
@JerrySwitalski, это из NetworkBehaviour   -  person Daniel    schedule 07.07.2016
comment
Хорошо, спасибо, дайте мне знать, если ответ помог.   -  person Jerry Switalski    schedule 07.07.2016
comment
@JerrySwitalski спасибо за ответ, но в таком случае сервер даже не работает. он по-прежнему вызывает TriggerCmdAttack(), но не вызывает CmdAttack()   -  person Daniel    schedule 07.07.2016
comment
Я понимаю. Тогда я удалю ответ и попробую что-нибудь еще.   -  person Jerry Switalski    schedule 07.07.2016


Ответы (1)


Эта проблема является прямым вызовом другого класса. Итак, вам нужна функция моста. Я написал источник.

ISkill _Idefaultattack;
public GameObject _defaultattack;

void Start() {
    if (NetworkServer.active)
        Debug.Log("Actived");
    else
        Debug.Log("DeActived");

    if (isLocalPlayer) {
        _Idefaultattack = _defaultattack.GetComponent<SphereSkillDefault>();
        _Idefaultattack.initiate(this);
    }
}
void Update() {
    if (!isLocalPlayer) {
        return;
    }
    //_Idefaultattack.CmdAttack();
    CmdAck();
}

[Command]
void CmdAck(){
    _Idefaultattack.CmdAttack();
}
person Old_Rabbit    schedule 28.07.2016
comment
..И этот мост должен быть командным, как я понимаю. Это работает? Это проверено? - person Jerry Switalski; 28.07.2016