{"id":320288,"date":"2021-03-25T21:01:56","date_gmt":"2021-03-25T21:01:56","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=320288"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=320288","title":{"rendered":"\u041e\u0441\u043d\u043e\u0432\u044b Unity + Mirror"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e89\/c77\/492\/e89c77492041f006fc80684eaa1cdf1e.png\" width=\"500\" height=\"477\"><figcaption><\/figcaption><\/figure>\n<p>\u0425\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0441 \u0442\u0435\u043c\u0438, \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u044f \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0438\u0433\u0440\u044b, \u043d\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u0441 \u0447\u0435\u0433\u043e \u043d\u0430\u0447\u0430\u0442\u044c. \u0422\u0430\u043a \u043a\u0430\u043a \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u043e \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043c\u043d\u043e\u0433\u043e, \u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0431\u044b\u043b\u043e \u043d\u0430\u0439\u0442\u0438 \u0442\u044f\u0436\u0435\u043b\u043e (\u0430 \u0432 \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435 \u0438 \u043f\u043e\u0434\u0430\u0432\u043d\u043e), \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0438\u0433\u0440\u044b \u043d\u0430 Unity \u0441\u0435\u0439\u0447\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>UNet. \u0423\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0430\u044f \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 deprecated \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0435 \u043f\u0430\u0440\u0443 \u043b\u0435\u0442. \u041d\u043e \u0447\u0442\u043e \u0436\u0435 Unity \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0432\u0437\u0430\u043c\u0435\u043d?<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/824\/3f2\/2a5\/8243f22a5df305b0d13e053787a7b970.jpg\" width=\"885\" height=\"473\"><figcaption><\/figcaption><\/figure>\n<ul>\n<li>\n<p>NetCode. \u041f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043a\u0440\u0443\u0442\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 Entity Component System. \u041d\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0436 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u043e\u043d\u0430 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0437\u0430 \u043f\u0430\u0440\u0443 \u043b\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0448\u043b\u043e 6 \u0432\u0435\u0440\u0441\u0438\u0439 \u0440\u0430\u0437\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0431\u0430\u0433\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438, api \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0435 \u043d\u0430 \u043d\u0435\u043c \u043f\u043e\u043a\u0430 \u0440\u0430\u043d\u043e\u0432\u0430\u0442\u043e. \u041a\u043e\u0433\u0434\u0430 \u0435\u0435 \u0434\u043e\u0434\u0435\u043b\u0430\u044e\u0442 \u2013 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e. \u042f \u0441\u043b\u0435\u0436\u0443 \u0437\u0430 \u043d\u0435\u0439 \u0443\u0436\u0435 \u043e\u043a\u043e\u043b\u043e \u0433\u043e\u0434\u0430 \u0438 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430 \u043d\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b.<\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0442\u043e \u0442\u043e\u0433\u0434\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f? \u0418\u0437 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u044d\u0442\u043e:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/mlapi.network\" rel=\"noopener noreferrer nofollow\">MLAPI<\/a>. \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 UNet \u0441 \u0448\u0438\u0440\u043e\u043a\u0438\u043c \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439. \u0414\u043e\u0441\u0442\u043e\u0439\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0441\u0442\u043e\u0438\u0442 \u043a \u043d\u0435\u043c\u0443 \u043f\u0440\u0438\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/mirror-networking.com\" rel=\"noopener noreferrer nofollow\">Mirror<\/a>. \u0414\u043e\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0434\u043e \u0443\u043c\u0430 UNet, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u0436\u0435 \u0432 MMO. \u041c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u041a\u043b\u0438\u0435\u043d\u0442+\u0421\u0435\u0440\u0432\u0435\u0440, \u0442\u0430\u043a \u0438 NoGUI-\u0421\u0435\u0440\u0432\u0435\u0440.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u043f\u043b\u0430\u0442\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f (\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u0441\u044f \u0441 \u043d\u0438\u043c\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c, \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0443 \u043a\u043e\u0433\u043e \u0431\u044b\u043b \u043e\u043f\u044b\u0442 \u043a\u0430\u043a \u043e\u043d\u0438):<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/www.photonengine.com\" rel=\"noopener noreferrer nofollow\">Photon<\/a>.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.darkriftnetworking.com\/darkrift2\" rel=\"noopener noreferrer nofollow\">DarkRift2<\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u044d\u0442\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043e\u0442 Unity:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6a2\/313\/b5c\/6a2313b5cbd1198f8ac96b84face01a4.png\" width=\"1500\" height=\"1202\"><figcaption><\/figcaption><\/figure>\n<p>\u041c\u043e\u0439 \u0432\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 Mirror, \u043a\u0430\u043a \u043d\u0430 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 \u043f\u043e\u0442\u043e\u043c\u043e\u043a UNet, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u043e\u0433\u043e UNet. \u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u044b Mirror, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e:<\/p>\n<ol>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>NetworkMessage \u0438 spawn \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435<\/p>\n<\/li>\n<li>\n<p>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c SyncVar<\/p>\n<\/li>\n<li>\n<p>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c SyncList<\/p>\n<\/li>\n<li>\n<p>Spawn \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u043c<\/p>\n<\/li>\n<\/ol>\n<hr>\n<h2>1. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u043a\u0443\u0440\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0414\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Unity 2020.3.0f1 \u0438 Mirror 32.1.4. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c Mirror \u0441\u0435\u0431\u0435 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/assetstore.unity.com\/packages\/tools\/network\/mirror-129321\" rel=\"noopener noreferrer nofollow\">Asset Store<\/a>, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442, \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c Mirror (Window -&gt; Package Manager -&gt; Packages -&gt; My Assets -&gt; Mirror -&gt; Import).<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0435\u0444\u0430\u0431 \u0438\u0433\u0440\u043e\u043a\u0430. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439 GameObject (\u043d\u0430\u0437\u043e\u0432\u0435\u043c \u0435\u0433\u043e Player), \u0432\u0435\u0448\u0430\u0435\u043c \u043d\u0430 \u043d\u0435\u0433\u043e SpriteRenderer, \u0437\u0430\u0434\u0430\u0435\u043c sprite Knob \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c \u0447\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u0435\u0433\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c. \u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 Player.cs \u0438 \u0432\u0435\u0448\u0430\u0435\u043c \u0435\u0433\u043e \u043d\u0430 \u0442\u043e\u0442 \u0436\u0435 GameObject. \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"cs\">using Mirror; using System.Collections; using System.Collections.Generic; using UnityEngine;  public class Player : NetworkBehaviour \/\/\u0434\u0430\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 {     void Update()     {         if (hasAuthority) \/\/\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u043d\u0430\u0441 \u043f\u0440\u0430\u0432\u0430 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442         {             float h = Input.GetAxis(\"Horizontal\");             float v = Input.GetAxis(\"Vertical\");             float speed = 5f * Time.deltaTime;             transform.Translate(new Vector2(h * speed, v * speed)); \/\/\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435         }     } }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e NetworkBehaviour \u0438 NetworkIdentity<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 NetworkIdentity \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u043e\u0433\u043e \u043e\u0442 NetworkBehaviour.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u043e\u0434\u043d\u043e\u043c GameObject (\u0438 \u0432\u0441\u0435\u0445 \u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043c\u043a\u0430\u0445) \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d NetworkIdentity.<\/p>\n<\/li>\n<li>\n<p>NetworkIdentity \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e (\u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c netId &#8212; \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c).<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 NetworkTransform, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0436\u0434\u0443 \u0432\u0441\u0435\u043c\u0438 \u0438\u0433\u0440\u043e\u043a\u0430\u043c\u0438. \u0421\u0442\u0430\u0432\u0438\u043c \u0433\u0430\u043b\u043e\u0447\u043a\u0443 ClientAuthority, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c, \u0441\u0447\u0438\u0442\u0430\u043b\u0438\u0441\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e NetworkTransform<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 NetworkIdentity \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 NetworkTransform (\u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u0435\u0449\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e).<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u0432, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0439\u0442\u0435 NetworkTransformChild \u043d\u0430 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442, \u0433\u0434\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c NetworkIdentity, \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0439\u0442\u0435 \u0432 Target \u0442\u043e\u0442 transform, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e GameObject <a href=\"https:\/\/docs.unity3d.com\/Manual\/CreatingPrefabs.html\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0444\u0430\u0431<\/a>. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/726\/2bd\/048\/7262bd04867920666180655f55bdc8c4.png\" width=\"1028\" height=\"473\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 NetMan.cs, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439 GameObject (\u043d\u0430\u0437\u043e\u0432\u0435\u043c \u0435\u0433\u043e NetMan) \u0438 \u0432\u0435\u0448\u0430\u0435\u043c \u043d\u0430 \u043d\u0435\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0448 \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u0442\u0430\u0440\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u043e\u0432.<\/p>\n<p>\u041f\u043e\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u043e\u0442 NetworkManager, \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.<\/p>\n<pre><code class=\"cs\">using Mirror; using System.Collections; using System.Collections.Generic; using UnityEngine;  public class NetMan : NetworkManager { }<\/code><\/pre>\n<p>\u0423 \u043d\u0430\u0441 \u0432 \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u043e\u0440\u0435 \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 KcpTransport. \u0414\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u043d\u0430 \u0442\u043e\u0442 \u0436\u0435 GameObject \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 NetworkManagerHUD (\u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f GUI).<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445:<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p><strong>Don\u2019t Destroy On Load<\/strong>. \u0411\u0443\u0434\u0435\u0442 \u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u0446\u0435\u043d\u0430\u043c\u0438?<\/p>\n<\/li>\n<li>\n<p><strong>Run In Background<\/strong>. \u0411\u0443\u0434\u0435\u0442 \u043b\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e?<\/p>\n<\/li>\n<li>\n<p><strong>Auto Start Server Build<\/strong>. \u0411\u0443\u0434\u0435\u0442 \u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0435\u0441\u043b\u0438 \u0431\u044b\u043b\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043e\u043f\u0446\u0438\u044f \u0431\u0438\u043b\u0434\u0430 \u00abServer Build\u00bb?<\/p>\n<\/li>\n<li>\n<p><strong>Show Debug Messages<\/strong>. \u041f\u043e \u044d\u0442\u043e\u0439 \u043e\u043f\u0446\u0438\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0438\u043b\u0438 \u043d\u0430\u0439\u0442\u0438 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e.<\/p>\n<\/li>\n<li>\n<p><strong>Server Tick Rate<\/strong>. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>Server Batching<\/strong>. \u0414\u043e\u043b\u0436\u0435\u043d \u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0435\u0442\u0435\u0432\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0435 \u0432 LateUpdate \u0440\u0430\u0437\u043e\u043c? \u041f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 CPU \u0438 \u0441\u0435\u0442\u044c, \u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>Server Batch Interval<\/strong>. \u0427\u0435\u043c \u0432\u044b\u0448\u0435 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0442\u0435\u043c \u0440\u0435\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u0435\u0444\u0430\u0431, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043f\u0430\u0432\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0433\u0440\u043e\u043a\u0430. \u041f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u0435\u0444\u0430\u0431 Player \u0432 \u043f\u043e\u043b\u0435 Player Prefab \u0438 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e \u0441\u043e \u0441\u0446\u0435\u043d\u044b (\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043c\u0435\u0440\u0443 \u0438 NetMan).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/868\/c5e\/135\/868c5e135302e8ff7a439bd6a9044ca2.png\" width=\"1038\" height=\"629\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f \u0433\u043e\u0442\u043e\u0432. \u0412\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432 \u043d\u0435\u043f\u043e\u043b\u043d\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435 (\u0447\u0442\u043e\u0431\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u043f\u043e\u043c\u0435\u0449\u0430\u043b\u043e\u0441\u044c), \u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0431\u043e\u0440\u043a\u0443, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c 2 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c. \u041e\u0434\u0438\u043d \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u043c \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0435\u0440, \u0432\u0442\u043e\u0440\u043e\u0439 \u043a\u0430\u043a \u043a\u043b\u0438\u0435\u043d\u0442. \u041d\u0430 wasd \u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430, \u043e\u043d \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c16\/fd9\/dc9\/c16fd9dc94e3aa95449b2d4903c50ba6.gif\" width=\"1600\" height=\"630\"><figcaption><\/figcaption><\/figure>\n<hr>\n<h2>2. NetworkMessage \u0438 spawn \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435<\/h2>\n<p>\u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<p>\u0412 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 NetMan \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u0433\u0430\u043b\u043e\u0447\u043a\u0443 AutoCreatePlayer, \u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0430\u0432\u043d \u0438\u0433\u0440\u043e\u043a\u0430 \u0441\u0430\u043c\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0441\u043a\u0440\u0438\u043f\u0442 NetMan.cs. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f struct \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043e \u043f\u043e\u0437\u0438\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cs\">public struct PosMessage : NetworkMessage \/\/\u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u0441\u044f \u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 NetworkMessage, \u0447\u0442\u043e\u0431\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u043d\u044f\u043b\u0430 \u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0442\u044c {   public Vector2 vector2; \/\/\u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Property }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043f\u0430\u0432\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435:<\/p>\n<pre><code class=\"cs\">public void OnCreateCharacter(NetworkConnection conn, PosMessage message) {   GameObject go = Instantiate(playerPrefab, message.vector2, Quaternion.identity); \/\/\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c gameObject   NetworkServer.AddPlayerForConnection(conn, go); \/\/\u043f\u0440\u0438\u0441\u043e\u0435\u0434\u043d\u0438\u044f\u0435\u043c gameObject \u043a \u043f\u0443\u043b\u0443 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u044d\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u0433\u0440\u043e\u043a\u0430\u043c }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0438\u043c \u043c\u0442\u043e\u0434 OnStartServer (\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435) \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cs\">public override void OnStartServer() {   base.OnStartServer();   NetworkServer.RegisterHandler&lt;PosMessage&gt;(OnCreateCharacter); \/\/\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043a\u0430\u043a\u043e\u0439 struct \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u0439\u0442\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f \u0441\u0432\u0430\u043f\u043d }<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0430\u0432\u043d (\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435):<\/p>\n<pre><code class=\"cs\">bool playerSpawned;  public void ActivatePlayerSpawn() {   Vector3 pos = Input.mousePosition;   pos.z = 10f;   pos = Camera.main.ScreenToWorldPoint(pos);    PosMessage m = new PosMessage() { vector2 = pos }; \/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c struct \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0447\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u043d\u044f\u043b \u043a \u0447\u0435\u043c\u0443 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f   connection.Send(m); \/\/\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0441\u043f\u0430\u0432\u043d\u0430   playerSpawned = true; }<\/code><\/pre>\n<p>\u0418 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0434\u043b\u044f \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0441\u043f\u0430\u0432\u043d\u0430:<\/p>\n<pre><code class=\"cs\">NetworkConnection connection; bool playerConnected;  public override void OnClientConnect(NetworkConnection conn) {   base.OnClientConnect(conn);   connection = conn;   playerConnected = true; }  private void Update() {   if (Input.GetKeyDown(KeyCode.Mouse0) &amp;&amp; !playerSpawned &amp;&amp; playerConnected)   {     ActivatePlayerSpawn();   } }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 NetMan.cs:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">using Mirror; using System.Collections; using System.Collections.Generic; using UnityEngine;  public class NetMan : NetworkManager {     bool playerSpawned;     NetworkConnection connection;     bool playerConnected;      public void OnCreateCharacter(NetworkConnection conn, PosMessage message)     {         GameObject go = Instantiate(playerPrefab, message.vector2, Quaternion.identity); \/\/\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c gameObject         NetworkServer.AddPlayerForConnection(conn, go); \/\/\u043f\u0440\u0438\u0441\u043e\u0435\u0434\u043d\u0438\u044f\u0435\u043c gameObject \u043a \u043f\u0443\u043b\u0443 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u044d\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u0433\u0440\u043e\u043a\u0430\u043c     }      public override void OnStartServer()     {         base.OnStartServer();         NetworkServer.RegisterHandler&lt;PosMessage&gt;(OnCreateCharacter); \/\/\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043a\u0430\u043a\u043e\u0439 struct \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u0439\u0442\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f \u0441\u0432\u0430\u043f\u043d     }      public void ActivatePlayerSpawn()     {         Vector3 pos = Input.mousePosition;         pos.z = 10f;         pos = Camera.main.ScreenToWorldPoint(pos);          PosMessage m = new PosMessage() { vector2 = pos }; \/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c struct \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0447\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u043d\u044f\u043b \u043a \u0447\u0435\u043c\u0443 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f         connection.Send(m); \/\/\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0441\u043f\u0430\u0432\u043d\u0430         playerSpawned = true;     }      public override void OnClientConnect(NetworkConnection conn)     {         base.OnClientConnect(conn);         connection = conn;         playerConnected = true;     }      private void Update()     {         if (Input.GetKeyDown(KeyCode.Mouse0) &amp;&amp; !playerSpawned &amp;&amp; playerConnected)         {             ActivatePlayerSpawn();         }     } }  public struct PosMessage : NetworkMessage \/\/\u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u0441\u044f \u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 NetworkMessage, \u0447\u0442\u043e\u0431\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u043d\u044f\u043b\u0430 \u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0442\u044c {     public Vector2 vector2; \/\/\u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Property }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f \u0433\u043e\u0442\u043e\u0432. \u0414\u0435\u043b\u0430\u0435\u043c \u0441\u0431\u043e\u0440\u043a\u0443, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c. \u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u043a\u043b\u0438\u043a\u043d\u0443\u0442\u044c \u043b\u0435\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043c\u044b\u0448\u0438 \u0432 \u0442\u043e\u0447\u043a\u0443, \u0433\u0434\u0435 \u0438\u0433\u0440\u043e\u043a \u0445\u043e\u0447\u0435\u0442 \u0437\u0430\u0441\u0432\u0430\u043f\u043d\u0438\u0442\u044c\u0441\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5c0\/42b\/650\/5c042b65018e2953e8a777982905e4ad.gif\" width=\"1600\" height=\"630\"><figcaption><\/figcaption><\/figure>\n<hr>\n<h2>3. \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c SyncVar<\/h2>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0444\u0438\u0447\u0435 \u2013 SyncVar. \u041e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0440\u0443\u0447\u043d\u043e\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u2013 \u043c\u0435\u043d\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0435 \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435 (\u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c).<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u0432 \u0432\u0438\u0434\u0435 \u043a\u0440\u0430\u0441\u043d\u044b\u0445 \u043a\u0440\u0443\u0436\u043a\u043e\u0432. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u0444\u0430\u0431\u0430 Player \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u043c\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u0441\u043e\u0431\u043e\u0439 \u0436\u0438\u0437\u043d\u044c (Knob + \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0446\u0432\u0435\u0442). \u0420\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c \u0438\u0445 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0432\u0438\u0434\u043d\u043e.<\/p>\n<p>\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 Player.cs, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"cs\">public int Health; public GameObject[] HealthGos;<\/code><\/pre>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c, \u0437\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u044b-\u0436\u0438\u0437\u043d\u0438 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e HealthGos \u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0430\u043a\u043e\u0435 \u0436\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 Health.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/67b\/885\/3ef\/67b8853efdffbae41cd5283e9859f788.png\" width=\"543\" height=\"212\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 Update \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432-\u0436\u0438\u0437\u043d\u0435\u0439 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0436\u0438\u0437\u043d\u0435\u0439:<\/p>\n<pre><code class=\"cs\">void Update() {   ...   for (int i = 0; i &lt; HealthGos.Length; i++)   {     HealthGos[i].SetActive(!(Health - 1 &lt; i));   } }<\/code><\/pre>\n<p>\u0418 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043c\u0435\u0442\u043e\u0434\u0443 \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c Health \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c:<\/p>\n<pre><code class=\"cs\">[SyncVar(hook = nameof(SyncHealth))] \/\/\u0437\u0430\u0434\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 int _SyncHealth;  void SyncHealth(int oldValue, int newValue) \/\/\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u043c \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f - \u0441\u0442\u0430\u0440\u043e\u0435 \u0438 \u043d\u043e\u0432\u043e\u0435.  {   Health = newValue; }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e _SyncHealth. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435.<\/p>\n<pre><code class=\"cs\">[Server] \/\/\u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 public void ChangeHealthValue(int newValue) {   _SyncHealth = newValue; }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043c\u0435\u0442\u043e\u0434\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043d\u043e \u043a\u043b\u0438\u0435\u043d\u0442 \u0441\u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"cs\">[Command] \/\/\u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 public void CmdChangeHealth(int newValue) \/\/\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u0432\u0438\u043c Cmd \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 {   ChangeHealthValue(newValue); \/\/\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e Command \u0438 Rpc<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p>Command \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443.<\/p>\n<\/li>\n<li>\n<p>Rpc \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0432\u0435\u0440 \u043c\u043e\u0433 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443.<\/p>\n<\/li>\n<li>\n<p>Command \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435+\u043a\u043b\u0438\u0435\u043d\u0442\u0435, \u043d\u043e Rpc \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 Rpc \u0438 Command \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 <a href=\"https:\/\/docs.unity3d.com\/Manual\/UNetActions.html\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u0431\u043e\u0440 \u0442\u0438\u043f\u043e\u0432<\/a>.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0437\u043e\u0432 Rpc \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0441\u0435\u0440\u0432\u0435\u0440+\u043a\u043b\u0438\u0435\u043d\u0442 \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u043c \u0441\u0430\u043c\u043e\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 Rpc:<\/p>\n<pre><code class=\"cs\">[ClientRpc] \/\/\u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 public void RpcTest() \/\/\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u0432\u0438\u043c Rpc \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 {   Debug.Log(\"\u0421\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c\"); }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412\u0441\u0435 \u0433\u043e\u0442\u043e\u0432\u043e \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0436\u0438\u0437\u043d\u0435\u0439. \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u2013 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0433\u0440\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0436\u0438\u0437\u043d\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043c Update:<\/p>\n<pre><code class=\"cs\">void Update() {   if (hasAuthority) \/\/\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u043d\u0430\u0441 \u043f\u0440\u0430\u0432\u0430 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442   {     ...     if (Input.GetKeyDown(KeyCode.H)) \/\/\u043e\u0442\u043d\u0438\u043c\u0430\u0435\u043c \u0443 \u0441\u0435\u0431\u044f \u0436\u0438\u0437\u043d\u044c \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e \u043a\u043b\u0430\u0432\u0438\u0448\u0438 H     {       if (isServer) \/\/\u0435\u0441\u043b\u0438 \u043c\u044b \u044f\u0432\u043b\u044f\u0435\u043c\u0441\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u0442\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439         ChangeHealthValue(Health - 1);       else         CmdChangeHealth(Health - 1); \/\/\u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439     }   }   ... }<\/code><\/pre>\n<p>\u042d\u0442\u0430\u043f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d. \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0436\u0438\u0437\u043d\u0435\u0439, \u0434\u0430\u0436\u0435 \u0443 \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0437\u0434\u043d\u0435\u0435 (\u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0436\u0438\u0437\u043d\u0435\u0439 \u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/595\/a0d\/58e\/595a0d58e01aec493e2d5ec1e79bc5e9.gif\" width=\"1600\" height=\"1260\"><figcaption><\/figcaption><\/figure>\n<hr>\n<h2>4. \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c SyncList<\/h2>\n<p>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u044d\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u0434\u043b\u044f \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u0441\u0435\u0440\u044c\u0435\u0437\u043d\u0435\u0435. SyncList \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0441 \u043d\u0438\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438 \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e \u043a\u043d\u043e\u043f\u043a\u0438 (\u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438). \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 Player.cs \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 SyncVar.<\/p>\n<p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435:<\/p>\n<pre><code class=\"cs\">SyncList&lt;Vector3&gt; _SyncVector3Vars = new SyncList&lt;Vector3&gt;(); \/\/\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 SyncList \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0442\u0430\u0432\u0438\u0442\u044c SyncVar \u0438 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434, \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0430\u0447\u0435  [Server] void ChangeVector3Vars(Vector3 newValue) {   _SyncVector3Vars.Add(newValue); }<\/code><\/pre>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440:<\/p>\n<pre><code class=\"cs\">[Command] public void CmdChangeVector3Vars(Vector3 newValue) {   ChangeVector3Vars(newValue); }<\/code><\/pre>\n<p>\u0418 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435:<\/p>\n<pre><code class=\"cs\">public List&lt;Vector3&gt; Vector3Vars;  void SyncVector3Vars(SyncList&lt;Vector3&gt;.Operation op, int index, Vector3 oldItem, Vector3 newItem) {   switch (op)   {     case SyncList&lt;Vector3&gt;.Operation.OP_ADD:       {         Vector3Vars.Add(newItem);         break;       }     case SyncList&lt;Vector3&gt;.Operation.OP_CLEAR:       {          break;       }     case SyncList&lt;Vector3&gt;.Operation.OP_INSERT:       {          break;       }     case SyncList&lt;Vector3&gt;.Operation.OP_REMOVEAT:       {          break;       }     case SyncList&lt;Vector3&gt;.Operation.OP_SET:       {          break;       }   } }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u0441\u0442\u0430\u0440\u0442\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430:<\/p>\n<pre><code class=\"cs\">public override void OnStartClient() {   base.OnStartClient();    _SyncVector3Vars.Callback += SyncVector3Vars; \/\/\u0432\u043c\u0435\u0441\u0442\u043e hook, \u0434\u043b\u044f SyncList \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u043d\u0430 Callback    Vector3Vars = new List&lt;Vector3&gt;(_SyncVector3Vars.Count); \/\/\u0442\u0430\u043a \u043a\u0430\u043a Callback \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430,     for (int i = 0; i &lt; _SyncVector3Vars.Count; i++) \/\/\u0430 \u0443 \u043d\u0430\u0441 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0435\u0441\u0442\u0438 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432   {     Vector3Vars.Add(_SyncVector3Vars[i]);   } }<\/code><\/pre>\n<p>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043e\u0442\u043e\u0432\u0430, \u043d\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0443\u0441\u0442\u043e\u0439 GameObject + SpriteRenderer + Knob + \u043c\u0435\u043d\u044f\u0435\u043c \u0446\u0432\u0435\u0442. \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043a\u0430\u043a \u043f\u0440\u0435\u0444\u0430\u0431 Point.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 LineRenderer \u043d\u0430 \u043f\u0440\u0435\u0444\u0430\u0431 Player, \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u043c \u0435\u043c\u0443 \u043d\u043e\u043b\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043c \u0448\u0438\u0440\u0438\u043d\u0443. \u041e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 Player.cs:<\/p>\n<pre><code class=\"cs\">public GameObject PointPrefab; \/\/\u0441\u044e\u0434\u0430 \u0432\u0435\u0448\u0430\u0435\u043c \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0444\u0430\u0431 Point public LineRenderer LineRenderer; \/\/\u0441\u044e\u0434\u0430 \u043a\u0438\u0434\u0430\u0435\u043c \u043d\u0430\u0448 \u0436\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 int pointsCount;  void Update() {   if (hasAuthority) \/\/\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u043d\u0430\u0441 \u043f\u0440\u0430\u0432\u0430 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442   {     ...     if (Input.GetKeyDown(KeyCode.P))     {       if (isServer)         ChangeVector3Vars(transform.position);       else         CmdChangeVector3Vars(transform.position);     }   }   ...   for (int i = pointsCount; i &lt; Vector3Vars.Count; i++)   {     Instantiate(PointPrefab, Vector3Vars[i], Quaternion.identity);     pointsCount++;      LineRenderer.positionCount = Vector3Vars.Count;     LineRenderer.SetPositions(Vector3Vars.ToArray());   } }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u043a \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c Player \u0438 Point<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/75e\/9b6\/217\/75e9b6217ee95f426de32a5e3034c84b.png\" width=\"519\" height=\"350\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fff\/515\/b55\/fff515b55d0454c25c9944281c51d4d1.png\" width=\"522\" height=\"866\"><figcaption><\/figcaption><\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5c6\/c71\/ff1\/5c6c71ff1b3c4984e752a1481834578b.png\" width=\"516\" height=\"522\"><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u0438\u043f\u0442 Player.cs<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">using Mirror; using System.Collections; using System.Collections.Generic; using UnityEngine;  public class Player : NetworkBehaviour \/\/\u0434\u0430\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 {     [SyncVar(hook = nameof(SyncHealth))] \/\/\u0437\u0430\u0434\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439     int _SyncHealth;     public int Health;     public GameObject[] HealthGos;       SyncList&lt;Vector3&gt; _SyncVector3Vars = new SyncList&lt;Vector3&gt;(); \/\/\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 SyncList \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0442\u0430\u0432\u0438\u0442\u044c SyncVar \u0438 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434, \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0430\u0447\u0435     public List&lt;Vector3&gt; Vector3Vars;       public GameObject PointPrefab; \/\/\u0441\u044e\u0434\u0430 \u0432\u0435\u0448\u0430\u0435\u043c \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0444\u0430\u0431 Point     public LineRenderer LineRenderer; \/\/\u0441\u044e\u0434\u0430 \u043a\u0438\u0434\u0430\u0435\u043c \u043d\u0430\u0448 \u0436\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442     int pointsCount;      void Update()     {         if (hasAuthority) \/\/\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u043d\u0430\u0441 \u043f\u0440\u0430\u0432\u0430 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442         {             float h = Input.GetAxis(\"Horizontal\");             float v = Input.GetAxis(\"Vertical\");             float speed = 5f * Time.deltaTime;             transform.Translate(new Vector2(h * speed, v * speed)); \/\/\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435              if (Input.GetKeyDown(KeyCode.H)) \/\/\u043e\u0442\u043d\u0438\u043c\u0430\u0435\u043c \u0443 \u0441\u0435\u0431\u044f \u0436\u0438\u0437\u043d\u044c \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e \u043a\u043b\u0430\u0432\u0438\u0448\u0438 H             {                 if (isServer) \/\/\u0435\u0441\u043b\u0438 \u043c\u044b \u044f\u0432\u043b\u044f\u0435\u043c\u0441\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u0442\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439                     ChangeHealthValue(Health - 1);                 else                     CmdChangeHealth(Health - 1); \/\/\u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439             }              if (Input.GetKeyDown(KeyCode.P))             {                 if (isServer)                     ChangeVector3Vars(transform.position);                 else                     CmdChangeVector3Vars(transform.position);             }         }          for (int i = 0; i &lt; HealthGos.Length; i++)         {             HealthGos[i].SetActive(!(Health - 1 &lt; i));         }          for (int i = pointsCount; i &lt; Vector3Vars.Count; i++)         {             Instantiate(PointPrefab, Vector3Vars[i], Quaternion.identity);             pointsCount++;              LineRenderer.positionCount = Vector3Vars.Count;             LineRenderer.SetPositions(Vector3Vars.ToArray());         }     }      void SyncHealth(int oldValue, int newValue) \/\/\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u043c \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f - \u0441\u0442\u0430\u0440\u043e\u0435 \u0438 \u043d\u043e\u0432\u043e\u0435.      {         Health = newValue;     }      [Server] \/\/\u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435     public void ChangeHealthValue(int newValue)     {         _SyncHealth = newValue;     }      [Command] \/\/\u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0430     public void CmdChangeHealth(int newValue) \/\/\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u0432\u0438\u043c Cmd \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430     {         ChangeHealthValue(newValue); \/\/\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439     }       [Server]     void ChangeVector3Vars(Vector3 newValue)     {         _SyncVector3Vars.Add(newValue);     }      [Command]     public void CmdChangeVector3Vars(Vector3 newValue)     {         ChangeVector3Vars(newValue);     }      void SyncVector3Vars(SyncList&lt;Vector3&gt;.Operation op, int index, Vector3 oldItem, Vector3 newItem)     {         switch (op)         {             case SyncList&lt;Vector3&gt;.Operation.OP_ADD:                 {                     Vector3Vars.Add(newItem);                     break;                 }             case SyncList&lt;Vector3&gt;.Operation.OP_CLEAR:                 {                      break;                 }             case SyncList&lt;Vector3&gt;.Operation.OP_INSERT:                 {                      break;                 }             case SyncList&lt;Vector3&gt;.Operation.OP_REMOVEAT:                 {                      break;                 }             case SyncList&lt;Vector3&gt;.Operation.OP_SET:                 {                      break;                 }         }     }      public override void OnStartClient()     {         base.OnStartClient();          _SyncVector3Vars.Callback += SyncVector3Vars; \/\/\u0432\u043c\u0435\u0441\u0442\u043e hook \u0434\u043b\u044f SyncList \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u043d\u0430 Callback          Vector3Vars = new List&lt;Vector3&gt;(_SyncVector3Vars.Count); \/\/\u0442\u0430\u043a \u043a\u0430\u043a Callback \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430,           for (int i = 0; i &lt; _SyncVector3Vars.Count; i++) \/\/\u0430 \u0443 \u043d\u0430\u0441 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0435\u0441\u0442\u0438 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432         {             Vector3Vars.Add(_SyncVector3Vars[i]);         }     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u042d\u0442\u0430\u043f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043b\u0430\u0432\u0438\u0448\u0443 P \u0438 \u0435\u0433\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430\u043c. \u0422\u0430\u043a\u0436\u0435 \u0442\u043e\u0447\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c\u0441\u044f \u043b\u0438\u043d\u0438\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0431\u044b\u043b \u0432\u0438\u0434\u0435\u043d \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6ee\/5e0\/19b\/6ee5e019bb888e3202a38b3f507cce04.gif\" width=\"1600\" height=\"1260\"><figcaption><\/figcaption><\/figure>\n<hr>\n<h2>5. Spawn \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043d\u0438\u043c<\/h2>\n<p>\u041d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a \u0441\u043f\u0430\u0432\u043d\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043d\u0438\u043c\u0438. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0430\u0448\u0435\u043c\u0443 \u0438\u0433\u0440\u043e\u043a\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u0435\u043b\u044f\u0442\u044c \u043f\u0443\u043b\u044f\u043c\u0438.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 Bullet.cs:<\/p>\n<pre><code class=\"cs\">using Mirror; using System.Collections; using System.Collections.Generic; using UnityEngine;  public class Bullet : NetworkBehaviour {     uint owner;     bool inited;     Vector3 target;      [Server]     public void Init(uint owner, Vector3 target)     {         this.owner = owner; \/\/\u043a\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b \u0432\u044b\u0441\u0442\u0440\u0435\u043b         this.target = target; \/\/\u043a\u0443\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043b\u0435\u0442\u0435\u0442\u044c \u043f\u0443\u043b\u044f         inited = true;     }      void Update()     {         if (inited &amp;&amp; isServer)         {             transform.Translate((target - transform.position).normalized * 0.04f);              foreach (var item in Physics2D.OverlapCircleAll(transform.position, 0.5f))             {                 Player player = item.GetComponent&lt;Player&gt;();                 if (player)                 {                     if (player.netId != owner)                     {                         player.ChangeHealthValue(player.Health - 1); \/\/\u043e\u0442\u043d\u0438\u043c\u0430\u0435\u043c \u043e\u0434\u043d\u0443 \u0436\u0438\u0437\u043d\u044c \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c SyncVar                         NetworkServer.Destroy(gameObject); \/\/\u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u043c \u043f\u0443\u043b\u044e                     }                 }             }              if (Vector3.Distance(transform.position, target) &lt; 0.1f) \/\/\u043f\u0443\u043b\u044f \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438             {                 NetworkServer.Destroy(gameObject); \/\/\u0437\u043d\u0430\u0447\u0438\u0442 \u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c             }         }     } } <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0443\u0441\u0442\u043e\u0439 GameObject + SpriteRenderer + Knob + \u043c\u0435\u043d\u044f\u0435\u043c \u0446\u0432\u0435\u0442. \u0412\u0435\u0448\u0430\u0435\u043c \u043d\u0430 \u043d\u0435\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442 Bullet.cs. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 NetworkTransform. \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043a\u0430\u043a \u043f\u0440\u0435\u0444\u0430\u0431 Bullet.<\/p>\n<p>\u0412 \u0441\u043a\u0440\u0438\u043f\u0442 Player.cs \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043f\u0430\u0432\u043d \u043f\u0443\u043b\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435:<\/p>\n<pre><code class=\"cs\">[Server] public void SpawnBullet(uint owner, Vector3 target) {   GameObject bulletGo = Instantiate(BulletPrefab, transform.position, Quaternion.identity); \/\/\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0443\u043b\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435   NetworkServer.Spawn(bulletGo); \/\/\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0435\u0442\u0435\u0432\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u0432\u0441\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430\u043c.   bulletGo.GetComponent&lt;Bullet&gt;().Init(owner, target); \/\/\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0443\u043b\u0438 }<\/code><\/pre>\n<p>\u0418 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u0432\u0430\u043f\u043d \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430:<\/p>\n<pre><code class=\"cs\">[Command] public&nbsp;void&nbsp;CmdSpawnBullet(uint&nbsp;owner,&nbsp;Vector3&nbsp;target) {   SpawnBullet(owner,&nbsp;target); }<\/code><\/pre>\n<p>\u0412\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0443\u043b\u0438:<\/p>\n<pre><code class=\"cs\">void Update() {   if (hasAuthority) \/\/\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u043d\u0430\u0441 \u043f\u0440\u0430\u0432\u0430 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442   {     ...       if (Input.GetKeyDown(KeyCode.Mouse1))       {         Vector3 pos = Input.mousePosition;         pos.z = 10f;         pos = Camera.main.ScreenToWorldPoint(pos);          if (isServer)           SpawnBullet(netId, pos);         else           CmdSpawnBullet(netId, pos);       }   }   ...   }<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0435 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0430, \u0435\u0441\u043b\u0438 \u0436\u0438\u0437\u043d\u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438\u0441\u044c:<\/p>\n<pre><code class=\"cs\">[Server] \/\/\u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 public void ChangeHealthValue(int newValue) {   _SyncHealth = newValue;    if (_SyncHealth &lt;= 0)   {     NetworkServer.Destroy(gameObject);   } }<\/code><\/pre>\n<p>\u0412 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 NetMan \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0440\u0435\u0444\u0430\u0431 Bullet \u043a\u0430\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0434\u043b\u044f \u0441\u043f\u0430\u0432\u043d\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2fa\/772\/277\/2fa772277ca6e2fc928ef7d6d2e0c326.png\" width=\"519\" height=\"630\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0430\u0431 Bullet \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e BulletPrefab \u043f\u0440\u0435\u0444\u0430\u0431\u0430 Player. \u041d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430 \u043f\u0440\u0435\u0444\u0430\u0431 Player \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 CircleCollider2D \u0438 \u0441\u0442\u0430\u0432\u0438\u043c \u0433\u0430\u043b\u043e\u0447\u043a\u0443 IsTrigger, \u0447\u0442\u043e\u0431\u044b \u043f\u0443\u043b\u044f \u043c\u043e\u0433\u043b\u0430 \u043e\u0442\u043b\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u0435.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u0442\u0430\u043f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c. \u041f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438 \u043c\u044b\u0448\u0438 \u0438\u0437 \u0438\u0433\u0440\u043e\u043a\u0430 \u0432\u044b\u043b\u0435\u0442\u0430\u0435\u0442 \u043f\u0443\u043b\u044f \u0438 \u043b\u0435\u0442\u0438\u0442 \u0442\u0443\u0434\u0430, \u0433\u0434\u0435 \u0441\u0442\u043e\u044f\u043b \u043a\u0443\u0440\u0441\u043e\u0440. \u0415\u0441\u043b\u0438 \u043f\u043e \u043f\u0443\u0442\u0438 \u043f\u0443\u043b\u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430 \u2013 \u043e\u043d \u0442\u0435\u0440\u044f\u0435\u0442 \u043e\u0434\u043d\u0443 \u0436\u0438\u0437\u043d\u044c. \u0412\u0441\u0435 \u043f\u0443\u043b\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0438\u0445 \u0441\u043f\u0430\u0432\u043d\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u0438\u043f\u0442 Player.cs<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">using Mirror; using System.Collections; using System.Collections.Generic; using UnityEngine;  public class Player : NetworkBehaviour \/\/\u0434\u0430\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 {     [SyncVar(hook = nameof(SyncHealth))] \/\/\u0437\u0430\u0434\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439     int _SyncHealth;     public int Health;     public GameObject[] HealthGos;       SyncList&lt;Vector3&gt; _SyncVector3Vars = new SyncList&lt;Vector3&gt;(); \/\/\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 SyncList \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0442\u0430\u0432\u0438\u0442\u044c SyncVar \u0438 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434, \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0430\u0447\u0435     public List&lt;Vector3&gt; Vector3Vars;       public GameObject PointPrefab; \/\/\u0441\u044e\u0434\u0430 \u0432\u0435\u0448\u0430\u0435\u043c \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0444\u0430\u0431 Point     public LineRenderer LineRenderer; \/\/\u0441\u044e\u0434\u0430 \u043a\u0438\u0434\u0430\u0435\u043c \u043d\u0430\u0448 \u0436\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442     int pointsCount;      public GameObject BulletPrefab; \/\/\u0441\u044e\u0434\u0430 \u0432\u0435\u0448\u0430\u0435\u043c \u043f\u0440\u0435\u0444\u0430\u0431 \u043f\u0443\u043b\u0438      void Update()     {         if (hasAuthority) \/\/\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u043d\u0430\u0441 \u043f\u0440\u0430\u0432\u0430 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442         {             float h = Input.GetAxis(\"Horizontal\");             float v = Input.GetAxis(\"Vertical\");             float speed = 5f * Time.deltaTime;             transform.Translate(new Vector2(h * speed, v * speed)); \/\/\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435              if (Input.GetKeyDown(KeyCode.H)) \/\/\u043e\u0442\u043d\u0438\u043c\u0430\u0435\u043c \u0443 \u0441\u0435\u0431\u044f \u0436\u0438\u0437\u043d\u044c \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e \u043a\u043b\u0430\u0432\u0438\u0448\u0438 H             {                 if (isServer) \/\/\u0435\u0441\u043b\u0438 \u043c\u044b \u044f\u0432\u043b\u044f\u0435\u043c\u0441\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u0442\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439                     ChangeHealthValue(Health - 1);                 else                     CmdChangeHealth(Health - 1); \/\/\u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439             }              if (Input.GetKeyDown(KeyCode.P))             {                 if (isServer)                     ChangeVector3Vars(transform.position);                 else                     CmdChangeVector3Vars(transform.position);             }              if (Input.GetKeyDown(KeyCode.Mouse1))             {                 Vector3 pos = Input.mousePosition;                 pos.z = 10f;                 pos = Camera.main.ScreenToWorldPoint(pos);                  if (isServer)                     SpawnBullet(netId, pos);                 else                     CmdSpawnBullet(netId, pos);             }         }          for (int i = 0; i &lt; HealthGos.Length; i++)         {             HealthGos[i].SetActive(!(Health - 1 &lt; i));         }          for (int i = pointsCount; i &lt; Vector3Vars.Count; i++)         {             Instantiate(PointPrefab, Vector3Vars[i], Quaternion.identity);             pointsCount++;              LineRenderer.positionCount = Vector3Vars.Count;             LineRenderer.SetPositions(Vector3Vars.ToArray());         }     }      void SyncHealth(int oldValue, int newValue) \/\/\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u043c \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f - \u0441\u0442\u0430\u0440\u043e\u0435 \u0438 \u043d\u043e\u0432\u043e\u0435.      {         Health = newValue;     }      [Server] \/\/\u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435     public void ChangeHealthValue(int newValue)     {         _SyncHealth = newValue;          if (_SyncHealth &lt;= 0)         {             NetworkServer.Destroy(gameObject);         }     }      [Command] \/\/\u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0430     public void CmdChangeHealth(int newValue) \/\/\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u0432\u0438\u043c Cmd \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430     {         ChangeHealthValue(newValue); \/\/\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439     }       [Server]     void ChangeVector3Vars(Vector3 newValue)     {         _SyncVector3Vars.Add(newValue);     }      [Command]     public void CmdChangeVector3Vars(Vector3 newValue)     {         ChangeVector3Vars(newValue);     }      void SyncVector3Vars(SyncList&lt;Vector3&gt;.Operation op, int index, Vector3 oldItem, Vector3 newItem)     {         switch (op)         {             case SyncList&lt;Vector3&gt;.Operation.OP_ADD:                 {                     Vector3Vars.Add(newItem);                     break;                 }             case SyncList&lt;Vector3&gt;.Operation.OP_CLEAR:                 {                      break;                 }             case SyncList&lt;Vector3&gt;.Operation.OP_INSERT:                 {                      break;                 }             case SyncList&lt;Vector3&gt;.Operation.OP_REMOVEAT:                 {                      break;                 }             case SyncList&lt;Vector3&gt;.Operation.OP_SET:                 {                      break;                 }         }     }      public override void OnStartClient()     {         base.OnStartClient();          _SyncVector3Vars.Callback += SyncVector3Vars; \/\/\u0432\u043c\u0435\u0441\u0442\u043e hook \u0434\u043b\u044f SyncList \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443 \u043d\u0430 Callback          Vector3Vars = new List&lt;Vector3&gt;(_SyncVector3Vars.Count); \/\/\u0442\u0430\u043a \u043a\u0430\u043a Callback \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430,           for (int i = 0; i &lt; _SyncVector3Vars.Count; i++) \/\/\u0430 \u0443 \u043d\u0430\u0441 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0435\u0441\u0442\u0438 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432         {             Vector3Vars.Add(_SyncVector3Vars[i]);         }     }      [Server]     public void SpawnBullet(uint owner, Vector3 target)     {         GameObject bulletGo = Instantiate(BulletPrefab, transform.position, Quaternion.identity); \/\/\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0443\u043b\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435         NetworkServer.Spawn(bulletGo); \/\/\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0435\u0442\u0435\u0432\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u0432\u0441\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430\u043c.         bulletGo.GetComponent&lt;Bullet&gt;().Init(owner, target); \/\/\u0438\u043d\u0438\u0444\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0443\u043b\u0438     }       [Command]     public void CmdSpawnBullet(uint owner, Vector3 target)     {         SpawnBullet(owner, target);     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2f9\/aad\/74a\/2f9aad74ada0386ca4c8d2719279d216.gif\" width=\"1600\" height=\"1260\"><figcaption><\/figcaption><\/figure>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c \u044d\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0430\u0437\u0430\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0442\u044c\u044e \u0432 Unity. \u0417\u043d\u0430\u0442\u043e\u043a\u043e\u0432 \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u044b \u043f\u0440\u0438\u0437\u044b\u0432\u0430\u044e \u043a \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044e \u043d\u0435\u0434\u043e\u0447\u0435\u0442\u043e\u0432 (\u043f\u0440\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 GC \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0435\u0447\u044c \u043d\u0435 \u0438\u0434\u0435\u0442). \u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435 \u043f\u043e <a href=\"https:\/\/github.com\/Sp1endidus\/HabrUnityMirror\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/549018\/\"> https:\/\/habr.com\/ru\/post\/549018\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0425\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0441 \u0442\u0435\u043c\u0438, \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u044f \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0438\u0433\u0440\u044b, \u043d\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u0441 \u0447\u0435\u0433\u043e \u043d\u0430\u0447\u0430\u0442\u044c. \u0422\u0430\u043a \u043a\u0430\u043a \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u043e \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043c\u043d\u043e\u0433\u043e, \u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0431\u044b\u043b\u043e \u043d\u0430\u0439\u0442\u0438 \u0442\u044f\u0436\u0435\u043b\u043e (\u0430 \u0432 \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435 \u0438 \u043f\u043e\u0434\u0430\u0432\u043d\u043e), \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0438\u0433\u0440\u044b \u043d\u0430 Unity \u0441\u0435\u0439\u0447\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>UNet. \u0423\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0430\u044f \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 deprecated \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0435 \u043f\u0430\u0440\u0443 \u043b\u0435\u0442. \u041d\u043e \u0447\u0442\u043e \u0436\u0435 Unity \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0432\u0437\u0430\u043c\u0435\u043d?<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<ul>\n<li>\n<p>NetCode. \u041f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043a\u0440\u0443\u0442\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 Entity Component System. \u041d\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0436 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u043e\u043d\u0430 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0437\u0430 \u043f\u0430\u0440\u0443 \u043b\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0448\u043b\u043e 6 \u0432\u0435\u0440\u0441\u0438\u0439 \u0440\u0430\u0437\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0431\u0430\u0433\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438, api \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0435 \u043d\u0430 \u043d\u0435\u043c \u043f\u043e\u043a\u0430 \u0440\u0430\u043d\u043e\u0432\u0430\u0442\u043e. \u041a\u043e\u0433\u0434\u0430 \u0435\u0435 \u0434\u043e\u0434\u0435\u043b\u0430\u044e\u0442 \u2013 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e. \u042f \u0441\u043b\u0435\u0436\u0443 \u0437\u0430 \u043d\u0435\u0439 \u0443\u0436\u0435 \u043e\u043a\u043e\u043b\u043e \u0433\u043e\u0434\u0430 \u0438 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430 \u043d\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b.<\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0442\u043e \u0442\u043e\u0433\u0434\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f? \u0418\u0437 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u044d\u0442\u043e:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/mlapi.network\" rel=\"noopener noreferrer nofollow\">MLAPI<\/a>. \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 UNet \u0441 \u0448\u0438\u0440\u043e\u043a\u0438\u043c \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439. \u0414\u043e\u0441\u0442\u043e\u0439\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0441\u0442\u043e\u0438\u0442 \u043a \u043d\u0435\u043c\u0443 \u043f\u0440\u0438\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/mirror-networking.com\" rel=\"noopener noreferrer nofollow\">Mirror<\/a>. \u0414\u043e\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0434\u043e \u0443\u043c\u0430 UNet, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u0436\u0435 \u0432 MMO. \u041c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u041a\u043b\u0438\u0435\u043d\u0442+\u0421\u0435\u0440\u0432\u0435\u0440, \u0442\u0430\u043a \u0438 NoGUI-\u0421\u0435\u0440\u0432\u0435\u0440.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u043f\u043b\u0430\u0442\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f (\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u0441\u044f \u0441 \u043d\u0438\u043c\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c, \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0443 \u043a\u043e\u0433\u043e \u0431\u044b\u043b \u043e\u043f\u044b\u0442 \u043a\u0430\u043a \u043e\u043d\u0438):<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/www.photonengine.com\" rel=\"noopener noreferrer nofollow\">Photon<\/a>.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.darkriftnetworking.com\/darkrift2\" rel=\"noopener noreferrer nofollow\">DarkRift2<\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u044d\u0442\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043e\u0442 Unity:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041c\u043e\u0439 \u0432\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 Mirror, \u043a\u0430\u043a \u043d\u0430 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 \u043f\u043e\u0442\u043e\u043c\u043e\u043a UNet, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u043e\u0433\u043e UNet. \u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u044b Mirror, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e:<\/p>\n<ol>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>NetworkMessage \u0438 spawn \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435<\/p>\n<\/li>\n<li>\n<p>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c SyncVar<\/p>\n<\/li>\n<li>\n<p>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c SyncList<\/p>\n<\/li>\n<li>\n<p>Spawn \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u043c<\/p>\n<\/li>\n<\/ol>\n<hr>\n<h2>1. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u043a\u0443\u0440\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0414\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Unity 2020.3.0f1 \u0438 Mirror 32.1.4. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c Mirror \u0441\u0435\u0431\u0435 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/assetstore.unity.com\/packages\/tools\/network\/mirror-129321\" rel=\"noopener noreferrer nofollow\">Asset Store<\/a>, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442, \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c Mirror (Window -&gt; Package Manager -&gt; Packages -&gt; My Assets -&gt; Mirror -&gt; Import).<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0435\u0444\u0430\u0431 \u0438\u0433\u0440\u043e\u043a\u0430. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439 GameObject (\u043d\u0430\u0437\u043e\u0432\u0435\u043c \u0435\u0433\u043e Player), \u0432\u0435\u0448\u0430\u0435\u043c \u043d\u0430 \u043d\u0435\u0433\u043e SpriteRenderer, \u0437\u0430\u0434\u0430\u0435\u043c sprite Knob \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c \u0447\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u0435\u0433\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c. \u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 Player.cs \u0438 \u0432\u0435\u0448\u0430\u0435\u043c \u0435\u0433\u043e \u043d\u0430 \u0442\u043e\u0442 \u0436\u0435 GameObject. \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"cs\">using Mirror; using System.Collections; using System.Collections.Generic; using UnityEngine;  public class Player : NetworkBehaviour \/\/\u0434\u0430\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 {     void Update()     {         if (hasAuthority) \/\/\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u043d\u0430\u0441 \u043f\u0440\u0430\u0432\u0430 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442         {             float h = Input.GetAxis(\"Horizontal\");             float v = Input.GetAxis(\"Vertical\");             float speed = 5f * Time.deltaTime;             transform.Translate(new Vector2(h * speed, v * speed)); \/\/\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435         }     } }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e NetworkBehaviour \u0438 NetworkIdentity<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 NetworkIdentity \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u043e\u0433\u043e \u043e\u0442 NetworkBehaviour.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u043e\u0434\u043d\u043e\u043c GameObject (\u0438 \u0432\u0441\u0435\u0445 \u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043c\u043a\u0430\u0445) \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d NetworkIdentity.<\/p>\n<\/li>\n<li>\n<p>NetworkIdentity \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e (\u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c netId &#8212; \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c).<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 NetworkTransform, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0436\u0434\u0443 \u0432\u0441\u0435\u043c\u0438 \u0438\u0433\u0440\u043e\u043a\u0430\u043c\u0438. \u0421\u0442\u0430\u0432\u0438\u043c \u0433\u0430\u043b\u043e\u0447\u043a\u0443 ClientAuthority, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c, \u0441\u0447\u0438\u0442\u0430\u043b\u0438\u0441\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e NetworkTransform<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 NetworkIdentity \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 NetworkTransform (\u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u0435\u0449\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e).<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u0432, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0439\u0442\u0435 NetworkTransformChild \u043d\u0430 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442, \u0433\u0434\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c NetworkIdentity, \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0439\u0442\u0435 \u0432 Target \u0442\u043e\u0442 transform, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e GameObject <a href=\"https:\/\/docs.unity3d.com\/Manual\/CreatingPrefabs.html\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0444\u0430\u0431<\/a>. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 NetMan.cs, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439 GameObject (\u043d\u0430\u0437\u043e\u0432\u0435\u043c \u0435\u0433\u043e NetMan) \u0438 \u0432\u0435\u0448\u0430\u0435\u043c \u043d\u0430 \u043d\u0435\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0448 \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u0442\u0430\u0440\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u043e\u0432.<\/p>\n<p>\u041f\u043e\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u043e\u0442 NetworkManager, \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.<\/p>\n<pre><code class=\"cs\">using Mirror; using System.Collections; using System.Collections.Generic; using UnityEngine;  public class NetMan : NetworkManager { }<\/code><\/pre>\n<p>\u0423 \u043d\u0430\u0441 \u0432 \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u043e\u0440\u0435 \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 KcpTransport. \u0414\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u043d\u0430 \u0442\u043e\u0442 \u0436\u0435 GameObject \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 NetworkManagerHUD (\u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f GUI).<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445:<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p><strong>Don\u2019t Destroy On Load<\/strong>. \u0411\u0443\u0434\u0435\u0442 \u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u0446\u0435\u043d\u0430\u043c\u0438?<\/p>\n<\/li>\n<li>\n<p><strong>Run In Background<\/strong>. \u0411\u0443\u0434\u0435\u0442 \u043b\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e?<\/p>\n<\/li>\n<li>\n<p><strong>Auto Start Server Build<\/strong>. \u0411\u0443\u0434\u0435\u0442 \u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0435\u0441\u043b\u0438 \u0431\u044b\u043b\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043e\u043f\u0446\u0438\u044f \u0431\u0438\u043b\u0434\u0430 \u00abServer Build\u00bb?<\/p>\n<\/li>\n<li>\n<p><strong>Show Debug Messages<\/strong>. \u041f\u043e \u044d\u0442\u043e\u0439 \u043e\u043f\u0446\u0438\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0438\u043b\u0438 \u043d\u0430\u0439\u0442\u0438 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e.<\/p>\n<\/li>\n<li>\n<p><strong>Server Tick Rate<\/strong>. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>Server Batching<\/strong>. \u0414\u043e\u043b\u0436\u0435\u043d \u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0435\u0442\u0435\u0432\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0435 \u0432 LateUpdate \u0440\u0430\u0437\u043e\u043c? \u041f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 CPU \u0438 \u0441\u0435\u0442\u044c, \u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>Server Batch Interval<\/strong>. \u0427\u0435\u043c \u0432\u044b\u0448\u0435 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0442\u0435\u043c \u0440\u0435\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u0435\u0444\u0430\u0431, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043f\u0430\u0432\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0433\u0440\u043e\u043a\u0430. \u041f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u0435\u0444\u0430\u0431 Player \u0432 \u043f\u043e\u043b\u0435 Player Prefab \u0438 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e \u0441\u043e \u0441\u0446\u0435\u043d\u044b (\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043c\u0435\u0440\u0443 \u0438 NetMan).<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f \u0433\u043e\u0442\u043e\u0432. \u0412\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432 \u043d\u0435\u043f\u043e\u043b\u043d\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435 (\u0447\u0442\u043e\u0431\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u043f\u043e\u043c\u0435\u0449\u0430\u043b\u043e\u0441\u044c), \u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0431\u043e\u0440\u043a\u0443, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c 2 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c. \u041e\u0434\u0438\u043d \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u043c \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0435\u0440, \u0432\u0442\u043e\u0440\u043e\u0439 \u043a\u0430\u043a \u043a\u043b\u0438\u0435\u043d\u0442. \u041d\u0430 wasd \u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430, \u043e\u043d \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<hr>\n<h2>2. NetworkMessage \u0438 spawn \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435<\/h2>\n<p>\u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<p>\u0412 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 NetMan \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u0433\u0430\u043b\u043e\u0447\u043a\u0443 AutoCreatePlayer, \u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0430\u0432\u043d \u0438\u0433\u0440\u043e\u043a\u0430 \u0441\u0430\u043c\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0441\u043a\u0440\u0438\u043f\u0442 NetMan.cs. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f struct \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043e \u043f\u043e\u0437\u0438\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cs\">public struct PosMessage : NetworkMessage \/\/\u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u0441\u044f \u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 NetworkMessage, \u0447\u0442\u043e\u0431\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u043d\u044f\u043b\u0430 \u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0442\u044c {   public Vector2 vector2; \/\/\u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Property }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043f\u0430\u0432\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435:<\/p>\n<pre><code class=\"cs\">public void OnCreateCharacter(NetworkConnection conn, PosMessage message) {   GameObject go = Instantiate(playerPrefab, message.vector2, Quaternion.identity); \/\/\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c gameObject   NetworkServer.AddPlayerForConnection(conn, go); \/\/\u043f\u0440\u0438\u0441\u043e\u0435\u0434\u043d\u0438\u044f\u0435\u043c gameObject \u043a \u043f\u0443\u043b\u0443 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u044d\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u0433\u0440\u043e\u043a\u0430\u043c }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0438\u043c \u043c\u0442\u043e\u0434 OnStartServer (\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435) \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cs\">public override void OnStartServer() {   base.OnStartServer();   NetworkServer.RegisterHandler&lt;PosMessage&gt;(OnCreateCharacter); \/\/\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043a\u0430\u043a\u043e\u0439 struct \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u0439\u0442\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f \u0441\u0432\u0430\u043f\u043d }<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0430\u0432\u043d (\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435):<\/p>\n<pre><code class=\"cs\">bool playerSpawned;  public void ActivatePlayerSpawn() {   Vector3 pos = Input.mousePosition;   pos.z = 10f;   pos = Camera.main.ScreenToWorldPoint(pos);    PosMessage m = new PosMessage() { vector2 = pos }; \/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c struct \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0447\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u043d\u044f\u043b \u043a \u0447\u0435\u043c\u0443 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f   connection.Send(m); \/\/\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0441\u043f\u0430\u0432\u043d\u0430   playerSpawned = true; }<\/code><\/pre>\n<p>\u0418 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0434\u043b\u044f \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0441\u043f\u0430\u0432\u043d\u0430:<\/p>\n<pre><code class=\"cs\">NetworkConnection connection; bool playerConnected;  public override void OnClientConnect(NetworkConnection conn) {   base.OnClientConnect(conn);   connection = conn;   playerConnected = true; }  private void Update() {   if (Input.GetKeyDown(KeyCode.Mouse0) &amp;&amp; !playerSpawned &amp;&amp; playerConnected)   {     ActivatePlayerSpawn();   } }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 NetMan.cs:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">using Mirror; using System.Collections; using System.Collections.Generic; using UnityEngine;  public class NetMan : NetworkManager {     bool playerSpawned;     NetworkConnection connection;     bool playerConnected;      public void OnCreateCharacter(NetworkConnection conn, PosMessage message)     {         GameObject go = Instantiate(playerPrefab, message.vector2, Quaternion.identity); \/\/\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c gameObject         NetworkServer.AddPlayerForConnection(conn, go); \/\/\u043f\u0440\u0438\u0441\u043e\u0435\u0434\u043d\u0438\u044f\u0435\u043c gameObject \u043a \u043f\u0443\u043b\u0443 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u044d\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u0433\u0440\u043e\u043a\u0430\u043c     }      public override void OnStartServer()     {         base.OnStartServer();         NetworkServer.RegisterHandler&lt;PosMessage&gt;(OnCreateCharacter); \/\/\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043a\u0430\u043a\u043e\u0439 struct \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u0439\u0442\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f \u0441\u0432\u0430\u043f\u043d     }      public void ActivatePlayerSpawn()     {         Vector3 pos = Input.mousePosition;         pos.z = 10f;         pos = Camera.main.ScreenToWorldPoint(pos);          PosMessage m = new PosMessage() { vector2 = pos }; \/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c struct \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0447\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u043d\u044f\u043b \u043a \u0447\u0435\u043c\u0443 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f         connection.Send(m); \/\/\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0441\u043f\u0430\u0432\u043d\u0430         playerSpawned = true;     }      public override void OnClientConnect(NetworkConnection conn)     {         base.OnClientConnect(conn);         connection = conn;         playerConnected = true;     }      private void Update()     {         if (Input.GetKeyDown(KeyCode.Mouse0) &amp;&amp; !playerSpawned &amp;&amp; playerConnected)         {             ActivatePlayerSpawn();         }     } }  public struct PosMessage : NetworkMessage \/\/\u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u0441\u044f \u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 NetworkMessage, \u0447\u0442\u043e\u0431\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u043d\u044f\u043b\u0430 \u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0442\u044c {     public Vector2 vector2; \/\/\u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Property }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f \u0433\u043e\u0442\u043e\u0432. \u0414\u0435\u043b\u0430\u0435\u043c \u0441\u0431\u043e\u0440\u043a\u0443, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c. \u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u043a\u043b\u0438\u043a\u043d\u0443\u0442\u044c \u043b\u0435\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043c\u044b\u0448\u0438 \u0432 \u0442\u043e\u0447\u043a\u0443, \u0433\u0434\u0435 \u0438\u0433\u0440\u043e\u043a \u0445\u043e\u0447\u0435\u0442 \u0437\u0430\u0441\u0432\u0430\u043f\u043d\u0438\u0442\u044c\u0441\u044f.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<hr>\n<h2>3. \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c SyncVar<\/h2>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0444\u0438\u0447\u0435 \u2013 SyncVar. \u041e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0440\u0443\u0447\u043d\u043e\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u2013 \u043c\u0435\u043d\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0435 \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435 (\u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c).<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u044b,<\/p>\n<\/hr>\n<\/hr>\n<\/hr>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-320288","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/320288","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=320288"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/320288\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=320288"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=320288"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=320288"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}