Страница 1 из 1

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

СообщениеДобавлено: 08 ноя 2018, 18:55
AppingC#
Вообщем пытаюсь сделать систему строительства в мультиплеере .
Написал скрипт , он работает , но если создаю объект на хосте то клиент видит это , но если создаю на клиенте то хост этого не видит.
Вот скрипт :
Синтаксис:
Используется 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;

               
       

        }
        }

       
}
 


Уже какие только варианты не пробовал , всё тоже самое ...

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

СообщениеДобавлено: 08 ноя 2018, 23:43
Saltant
Создавай на хосте по запросу клиента. Юнетом я еще не занимался, и возможно не верно понял вопрос, просто по логике если клиент создает объект которого не существует на сервере то понятно что сервер не увидит его, по логике клиент должен дать указание серверу на создание объекта, сервер его создает и его все видят. Если я не прав, поправьте меня.

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

СообщениеДобавлено: 09 ноя 2018, 13:52
KanycTa
Объект зарегистрирован в NetworkManager'е?

Для спавна на всех сторонах нужно чтобы префаб получил уникальный ид, префаб который нужно заспавнить нужно предварительно добавить в NetworkManager чтобы NetworkServer знал какой именно объект заспавнить

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

СообщениеДобавлено: 10 ноя 2018, 02:15
AppingC#
В NetworkManager добавил тоже самое