Ответы пользователя по тегу Unity
  • Зависание сцены во время получения сообщения с сервера, что делать?

    @Senture Автор вопроса
    Решил проблему так:
    void Start()
        {
            Thread t = new Thread(ReceiveData);
            t.Start();
        }
    
        private void ReceiveData()
        {
            while (true)
            {
                if (connected)
                {
                    Debug.Log("Run");
                    try
                    {
                        int bytes = 0; // Счетчик полученных байт с сервера
                        byte[] buffer = new byte[1024]; // Массив байт, для данных полученных с сервера
    
                        StringBuilder builder = new StringBuilder();
    
                        do
                        {
                            bytes = socket.Receive(buffer); // Прием данных от сервера
                            builder.Append(Encoding.UTF8.GetString(buffer, 0, bytes)); // Строим сообщение из полученных данных ( массива байт )
                        }
                        while (socket.Available > 0);
    
                        string[] allInfo = builder.ToString().Split(';');
                        for (int i = 0; i < allInfo.Length; i++)
                        {
                            string[] info = allInfo[i].Split('|');
    
                            Action action = () => { data.Add(info[0], info[1] + '|' + info[2] + '|' + info[3]); };
                            action.Invoke(); 
                        }
                    }
                    catch (Exception ex)
                    {
                        Debug.Log("Error in Helper.FixedUpdate: " + ex.Message);
                    }
                }
            }
        }

    Все прекрасно работает =)
    Всем огромное спасибо!
    Ответ написан
    Комментировать
  • Что посоветуете для написания сервера под мультиплеерную 3d игру на Unity?

    @Senture Автор вопроса
    Ребят всем спасибо за все ваши советы. Я уже имею представление в написание сервера, еще я вычитал что использование tcp в action играх очень плохо сказывается на ping'е, вот сижу изучаю udp который лучше подойдет для этого.
    Ответ написан
    Комментировать
  • Как синхронизировать GameObject(пулю) в мультиплеере на Unity?

    @Senture Автор вопроса
    Реализовал вот так:
    spoiler
    [SyncVar] Vector3 syncBulletStartPosition;
        [SyncVar] Quaternion syncBulletStartRotation;
        [SyncVar] bool syncTrueFire;
    
        /// <summary>
        /// Метод для осуществления стрельбы
        /// </summary>
        private void Update()
        {
            if(isLocalPlayer)
            {
                if (Input.GetButton("Fire1"))
                {
                    //CmdShoot();
    
                    int weapon = 0;
                    // Create the Bullet from the Bullet Prefab
                    GameObject bullet = (GameObject)Instantiate(
                        bulletPref[weapon],
                        bulletPivot[weapon].position,
                        bulletPivot[weapon].rotation);
    
    
                    CmdSendBullet(bulletPivot[weapon].position, bulletPivot[weapon].rotation);
                }
            }
        }
    
        [Command]
        void CmdSendBullet(Vector3 startPosition, Quaternion startRotation)
        {
            syncBulletStartPosition = startPosition;
            syncBulletStartRotation = startRotation;
            syncTrueFire = true;
        }
    
        /// <summary>
        /// Вызов всех еобходимых методов для смены и синхронизации оружия
        /// </summary>
        void FixedUpdate()
        {
            SpawnBulletToAllClients();
        }
    
        void SpawnBulletToAllClients()
        {
            if (!isLocalPlayer)
            {
                if (syncTrueFire == true)
                {
                    int weapon = 0;
    
                    GameObject bullet = (GameObject)Instantiate(
                        bulletPref[weapon],
                        bulletPivot[weapon].position,
                        bulletPivot[weapon].rotation);
    
                    CmdSyncTrueFire();
                    syncTrueFire = false;
                }
            }
        }
    
        [Command]
        void CmdSyncTrueFire()
        {
            syncTrueFire = false;
        }



    P.S. Спасибо большое всем, отдельное спасибо GavriKos
    Ответ написан
    Комментировать
  • Синхронизация выбранного оружия для каждого из игроков в мультиплеерном шутере на Unity?

    @Senture Автор вопроса
    Проблема решена, это было из за того что 2 приложения клиент и сервер были запущены на 1пк, после того как сервер и клиент были запущены на разных пк, почти все заработало, но почему то клиент видит как сервер меняет оружие, а сервер не видит как клиент меняет оружие. Есть у кого варианты решения данной задачки?

    Что никто не знает как это сделать? Я уже весь инет перерыл по поводу смены оружия в мультиплеере и его синхронизацию но пусто!!! Помогите -_- пожалуйста)

    Решение:
    spoiler
    using UnityEngine;
    using UnityEngine.Networking;
    
    public class PlayerScrolWeapon : NetworkBehaviour
    {
        public GameObject[] weapon;
        [SyncVar] int syncWeaponIndex;
        private int weaponIndex = 0;
    	
        [Client]
    	void FixedUpdate()
        {
            ScrolWeapon();
            if(isLocalPlayer)
                CmdSendToServerSyncWeapon(weaponIndex);
            SendToClientSyncWeapon();
    	}
    
        void ScrolWeapon()
        {
            if(isLocalPlayer)
            {
                if(Input.GetAxisRaw("Mouse ScrollWheel") > 0f)
                {
                    if (weaponIndex > 3)
                        weaponIndex = 0;
                    else
                        weaponIndex++;
                }
                else if(Input.GetAxisRaw("Mouse ScrollWheel") < 0f)
                {
                    if (weaponIndex < 0)
                        weaponIndex = 3;
                    else
                        weaponIndex--;
                }
    
                for (int i = 0; i < 4; i++)
                    if (i == weaponIndex)
                        weapon[i].SetActive(true);
                    else
                        weapon[i].SetActive(false);
            }
        }
    
        void SendToClientSyncWeapon()
        {
            if(!isLocalPlayer)
            {
                for (int i = 0; i < 4; i++)
                    if (i == syncWeaponIndex)
                        weapon[i].SetActive(true);
                    else
                        weapon[i].SetActive(false);
            }
        }
    
        [Command]
        void CmdSendToServerSyncWeapon(int _weaponIndex)
        {
            syncWeaponIndex = _weaponIndex;
        }
    }



    Это 1 скрипт который отвечает и за смену оружия и за его синхронизацию, может кому то пригодится.

    P.S. Тема закрыта!
    Ответ написан
    Комментировать
  • Unity Network как уменьшить ping?

    @Senture Автор вопроса
    Оказалось что я просто не правильно настроил NetworkManager и NetworkTransform.

    P.S. Всем большое спасибо!!!
    Ответ написан