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

Выбор модельки для игрока (Unity Network)

СообщениеДобавлено: 20 ноя 2018, 16:04
AppingC#
Доброго времени суток ! Хотел бы задать вопрос , вообщем , хочу сделать чтобы до того как появится сам игрок появлялась панель , в которой игрок сможет выбрать себе модельку персонажа, тоже самое чтобы было в клиента , в кратком хочу сделать возможность игрок выбрать себе модельку , пробовал делать по этой статье :

https://docs.unity3d.com/Manual/UNetPlayersCustom.html
Сделал вот это :
1.Создал скрипт (Network Manager) , в нём вот это :
Синтаксис:
Используется csharp
using UnityEngine;
using UnityEngine.Networking;
public class NetworkManagerr : NetworkManager
{
    public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
    {
    int RandoM = Random.Range(0,3);
        GameObject player = (GameObject)Instantiate(playerPrefab, Vector3.zero, Quaternion.identity);
        NetworkServer.AddPlayerForConnection(conn, player, playerControllerId);
        if(RandoM == 1){
    player.GetComponent<ChangePlayer>().Ch_1();
    }
        if(RandoM == 2){
    player.GetComponent<ChangePlayer>().Ch_2();
    }
        if(RandoM == 3){
    player.GetComponent<ChangePlayer>().Ch_3();
    }
   
}
}


2.Создал ещё один скрипт и повесил на префаб игрока :

Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class ChangePlayer : NetworkBehaviour {
public Mesh[] meshes;
public void Ch_1(){
    gameObject.GetComponent<MeshFilter>().sharedMesh = meshes[0];
    gameObject.GetComponent<ChangePlayer>().enabled = false;
}
public void Ch_2(){
    gameObject.GetComponent<MeshFilter>().sharedMesh = meshes[1];
        gameObject.GetComponent<ChangePlayer>().enabled = false;
}
public void Ch_3(){
    gameObject.GetComponent<MeshFilter>().sharedMesh = meshes[2];
        gameObject.GetComponent<ChangePlayer>().enabled = false;
}
}


Оно работает , но вообще не так как нужно , вообщем когда запускаю Host моделька меняется , но когда присоединяется клиент то Host видит себя например как мужчину , а клиент видит его как женщину (другую модель) , вот в чём проблема.

Re: Выбор модельки для игрока (Unity Network)

СообщениеДобавлено: 20 ноя 2018, 18:58
DimaJoke
А если сделать int переменную типо modelID на хосте, а потом в клиенте получать это значение и ставить нужную модель

Re: Выбор модельки для игрока (Unity Network)

СообщениеДобавлено: 21 ноя 2018, 01:22
AppingC#
Можно по подробнее ?

Re: Выбор модельки для игрока (Unity Network)

СообщениеДобавлено: 21 ноя 2018, 07:20
DimaJoke
Ну допустим у тебя 2 модельки мужчина и женщина
На сервере на каждого игрока есть int переменная ID допустим мужчина-1 АйДи женщина 2 АйДи и при выборе перса мы её меняем и сохраняем
Во время игры, когда игрок видит другого игрока он получает этот ID с сервера и его клиент ставит нужную модель

Re: Выбор модельки для игрока (Unity Network)

СообщениеДобавлено: 21 ноя 2018, 16:20
AppingC#
Спасибо , сделаю и сразу отпишусь !

Re: Выбор модельки для игрока (Unity Network)

СообщениеДобавлено: 21 ноя 2018, 17:07
AppingC#
Изменил в своём Network Manger :

Синтаксис:
Используется csharp
using UnityEngine;
using UnityEngine.Networking;
public class NetworkManagerr : NetworkManager
{
    public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
    {
        int RandoM = Random.Range(0,3);
        GameObject player = (GameObject)Instantiate(playerPrefab, Vector3.zero, Quaternion.identity);
        NetworkServer.AddPlayerForConnection(conn, player, playerControllerId);
        if(RandoM == 1){
player.GetComponent<ChangePlayer>().ModelID = 1;
    }
        if(RandoM == 2){
player.GetComponent<ChangePlayer>().ModelID = 2;
    }
        if(RandoM == 3){
player.GetComponent<ChangePlayer>().ModelID = 3;
    }
    }
}
 


На игроке :

Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class ChangePlayer : NetworkBehaviour {
public int ModelID;
public Mesh[] meshes;

void Update(){
        if(ModelID == 1){
        gameObject.GetComponent<MeshFilter>().sharedMesh = meshes[0];
        }
        if(ModelID == 2){
        gameObject.GetComponent<MeshFilter>().sharedMesh = meshes[1];
        }
        if(ModelID == 3){
        gameObject.GetComponent<MeshFilter>().sharedMesh = meshes[2];
        }
}
}

Re: Выбор модельки для игрока (Unity Network)

СообщениеДобавлено: 21 ноя 2018, 18:03
KanycTa
AppingC# писал(а):Доброго времени суток ! Хотел бы задать вопрос , вообщем , хочу сделать чтобы до того как появится сам игрок появлялась панель , в которой игрок сможет выбрать себе модельку персонажа, тоже самое чтобы было в клиента , в кратком хочу сделать возможность игрок выбрать себе модельку , пробовал делать по этой статье https://docs.unity3d.com/Manual/UNetPlayersCustom.html

Оно работает , но вообще не так как нужно , вообщем когда запускаю Host моделька меняется , но когда присоединяется клиент то Host видит себя например как мужчину , а клиент видит его как женщину (другую модель) , вот в чём проблема.


Используй низкоуровневые сообщения (LLAPI)

на клиенте регистрируй сообщение

Клиентская сторона:
Синтаксис:
Используется csharp
client.RegisterHandler(0xCC0, event_SelectModel);

private void event_SelectModel(NetworkMessage msg)
{
print("Сервер просит выбрать модельку");
}
 


Серверная сторона:
Синтаксис:
Используется csharp
NetworkServer.RegisterHandler(0xCC1, event_ClientSelectedModel);

private void event_ClientSelectedModel(NetworkMessage msg)
{
var message = msg.ReadMessage<Class>();
print("клиент выбрал модельку "+message.id);
}
 



При старте клиента будет обработчик который будет реагировать на принятые сетевые сообщения с ID: 0xCC3 (это как пример)

С сервера нужно отправлять клиенту(ам) сообщение что нужно выбрать модельку

После выбора модельки на клиенте отправляем серверу сообщение что мы выбрали модельку

Re: Выбор модельки для игрока (Unity Network)

СообщениеДобавлено: 21 ноя 2018, 23:57
AppingC#
Можешь дать свой скайп или дискорд ?