Проект «Искореженный металл» по мотивам Twisted Metal 4. UNITY. Часть 8

Поделиться.

Всем доброго времени суток. В этой статье мы должны были синхронизировать миры, но я столкнулся с трудностями. Мне не совсем понятна логика синхронизаций событий. Чтоб в этом всем разобраться для начала мы создадим чат, это поможет нам понять как все работает. 

Чтоб клиенту вызвать изменения на всех клиентах он должен вызвать метод с атрибутом [Command], префиксом Cmd и отправить пакет с информацией на сервер. На сервере информация проходит проверку и вызывается метод с префиксом Rpc и атрибутом [ClientRpc], который рассылает информацию об изменениях на все клиенты.

Начнем, для начала добавим на сцену Панель UI, Кнопку, Input Field и Текст.

Для корректного функционирования   нам нужно написать два скрипта, первый будет определять компоненты нашего чата и передавать текущую информацию (Этот скрипт мы повесим на Панель UI), а второй обрабатывать ее и рассылать всем клиентам (Его мы повесим на Prefab нашего Игрока).

Теперь пишем логику. Первый скрипт — Определим переменную игрока, напишем метод Cmd который будет выполняться только на сервере — единственное, что он будет делать вызывать метод Rpc — метод рассылки информации клиентам.В Rpc мы будем проверять количество строк в поле, если больше четырех, то чистим поле и создаем на новой строчке текст с полученной информацией с клиента. Если нажат правый Shift — скрываем чат. В виде кода C# — это выглядит так:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class PlayerHellper : NetworkBehaviour {

Chat MyChat;

void Start(){
MyChat = GameObject.FindObjectOfType<Chat> ();
if (isLocalPlayer) {
MyChat.MyPlayer = this;
}
}
[Command] public void CmdSend (string massage){
RpcClient (massage);
}
[ClientRpc] public void RpcClient (string massage){
if (MyChat.Strok >= 4) {
MyChat.BlokText.text = «»;
MyChat.Strok = 0;
}
MyChat.BlokText.text += System.Environment.NewLine + massage;
MyChat.Strok++;
}
void Update(){
if (isLocalPlayer) {

if(Input.GetKeyDown(KeyCode.RightShift)){

if (MyChat.Activ == true) {
MyChat.ChatActive.SetActive (false);
MyChat.Activ = false;
}else{

MyChat.ChatActive.SetActive (true);
MyChat.Activ = true;
}
}}}}

Данный скрипт вешаем на игрока.

Второй скрипт — Создаем метод, который будет вызываться при нажатии кнопки отправить и при нажатии Enter — он будет вызывать Cmd на сервере с информацией которую мы запишем в Input Field. Далее ограничим максимальный размер сообщения 30 символами — если больше отправляем сообщение. В виде кода C# — это выглядит так:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;

public class Chat : NetworkBehaviour {
public GameObject ChatActive;
public InputField MyText;
public Text BlokText;
private PlayerHellper myPlayer;
public PlayerHellper MyPlayer;
public int Strok = 0;
public bool Activ = true;
public Text Ostatok;
int ostatok;

void Start(){
Vector2 Vnew = new Vector2 (Screen.height /2*3, Screen.width /10*5);
transform.position = Vnew;
}
public void Send(){
MyPlayer.CmdSend(MyText.text);
MyText.text = «»;
}
public void Update(){

ostatok = 30 — MyText.text.Length;
Ostatok.text = «Осталось символов » + ostatok;
if(Input.GetKeyDown(KeyCode.Return) & MyText.text.Length>0){
Send();
}
if (MyText.text.Length > 30) {
Send();
}
}
}

Повесим скрипт на панель UI и определим компоненты перетащив их из окна иерархии в соответствующие поля. 

Посмотрим что получилось.

Отлично все работает как надо, я попытаюсь разобраться с логикой этого всего получше и в следующей статье  синхронизировать более сложные вещи. Всем удачи и до скорых встреч :)!


Поделиться.

Добавить комментарий

Войти с помощью: 

Ваш e-mail не будет опубликован. Обязательные поля помечены *