Система строительства в мультиплеере

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Система строительства в мультиплеере

Сообщение AppingC# 08 ноя 2018, 18:55

Вообщем пытаюсь сделать систему строительства в мультиплеере .
Написал скрипт , он работает , но если создаю объект на хосте то клиент видит это , но если создаю на клиенте то хост этого не видит.
Вот скрипт :
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class InstSynCube : NetworkBehaviour
{
        public Camera Caaamera;
        public GameObject Cubee;
private GameObject StartObject;
private bool building;
private Material StartMaterial;
public Material BuildMaterial;
        private float heightObject;    
        private float xObject;
        // Use this for initialization
        void Start () {
       
        }
       
        // Update is called once per frame
        void Update ()
        {
                if (!isLocalPlayer)
                        return;
                if(Input.GetKeyDown(KeyCode.B)){
                building = true;
                }
                if(building == true && Cubee != null) {
                        RaycastHit hit;
                        if(Physics.Raycast(Caaamera.transform.position, Caaamera.transform.forward, out hit, 15)) {
                                if(StartObject == null) {
                                        StartObject = (GameObject)Instantiate(Cubee, Vector3.zero, Quaternion.identity);
                                        if(StartObject.GetComponent<MeshRenderer>()) {
                                                StartMaterial = StartObject.GetComponent<MeshRenderer>().material;
                                                StartObject.GetComponent<MeshRenderer>().material = BuildMaterial;
                                        }
                                        if(StartObject.GetComponent<Rigidbody>()) {
                                                StartObject.GetComponent<Rigidbody>().isKinematic = true;
                                        }
                                        if(StartObject.GetComponent<BoxCollider>()) {
                                                StartObject.GetComponent<BoxCollider>().enabled = false;
                                        }
                                        if(StartObject.GetComponent<SphereCollider>()) {
                                                StartObject.GetComponent<SphereCollider>().enabled = false;
                                        }
                                        if(StartObject.GetComponent<MeshCollider>()) {
                                                StartObject.GetComponent<MeshCollider>().enabled = false;
                                        }
                                        if(StartObject.GetComponent<CapsuleCollider>()) {
                                                StartObject.GetComponent<CapsuleCollider>().enabled = false;
                                        }
                                }else{
                                        heightObject = StartObject.transform.lossyScale.y/2 + hit.point.y;
                                        xObject = StartObject.transform.lossyScale.x/2 + hit.point.x;
                                        StartObject.transform.position = new Vector3(xObject, heightObject, hit.point.z);
                                                Cmd_Inst (hit.point);
                       
       
                                }
                                }
               
                }

        }
       

        [Command]
        public void Cmd_Inst(Vector3 pos)
        {
                        if(Input.GetMouseButtonDown(0)) {
                               
                                                if(StartObject.GetComponent<MeshRenderer>()) {
                                                        StartObject.GetComponent<MeshRenderer>().material = StartMaterial;
                                                }
                                                if(StartObject.GetComponent<Rigidbody>()) {
                                                        StartObject.GetComponent<Rigidbody>().isKinematic = false;
                                                }
                                                if(StartObject.GetComponent<BoxCollider>()) {
                                                        StartObject.GetComponent<BoxCollider>().enabled = true;
                                                }
                                                if(StartObject.GetComponent<SphereCollider>()) {
                                                        StartObject.GetComponent<SphereCollider>().enabled = true;
                                                }
                                                if(StartObject.GetComponent<MeshCollider>()) {
                                                        StartObject.GetComponent<MeshCollider>().enabled = true;
                                                }
                                                if(StartObject.GetComponent<CapsuleCollider>()) {
                                                        StartObject.GetComponent<CapsuleCollider>().enabled = true;
                                               
                                       
                                                }
                                                        NetworkServer.Spawn (StartObject);
                                                        StartObject = null;
                                                       
                                                heightObject = 0;
                                                xObject = 0;
                                                building = false;

               
       

        }
        }

       
}
 


Уже какие только варианты не пробовал , всё тоже самое ...
AppingC#
UNец
 
Сообщения: 2
Зарегистрирован: 08 ноя 2018, 18:45

Re: Система строительства в мультиплеере

Сообщение Saltant 08 ноя 2018, 23:43

Создавай на хосте по запросу клиента. Юнетом я еще не занимался, и возможно не верно понял вопрос, просто по логике если клиент создает объект которого не существует на сервере то понятно что сервер не увидит его, по логике клиент должен дать указание серверу на создание объекта, сервер его создает и его все видят. Если я не прав, поправьте меня.
Аватара пользователя
Saltant
UNец
 
Сообщения: 39
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
Skype: saltant1989
  • Сайт

Re: Система строительства в мультиплеере

Сообщение KanycTa 09 ноя 2018, 13:52

Объект зарегистрирован в NetworkManager'е?

Для спавна на всех сторонах нужно чтобы префаб получил уникальный ид, префаб который нужно заспавнить нужно предварительно добавить в NetworkManager чтобы NetworkServer знал какой именно объект заспавнить
Аватара пользователя
KanycTa
UNIт
 
Сообщения: 83
Зарегистрирован: 25 июл 2018, 18:41
Откуда: г. Ульяновск
  • Сайт

Re: Система строительства в мультиплеере

Сообщение AppingC# 10 ноя 2018, 02:15

В NetworkManager добавил тоже самое
AppingC#
UNец
 
Сообщения: 2
Зарегистрирован: 08 ноя 2018, 18:45


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 13