{"id":326876,"date":"2022-01-10T08:40:27","date_gmt":"2022-01-10T08:40:27","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=326876"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=326876","title":{"rendered":"<span>\u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u0435\u0440 \u0432 Unreal Engine: \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438 \u0425\u043e\u0441\u0442\u0438\u043d\u0433<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\" class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442 \u0425\u0430\u0431\u0440!<\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0441\u0442\u0430\u0442\u0435\u0439 \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u0435\u0440\u0430 \u0432 UE 4 \u0438 5. \u0425\u043e\u0447\u0443 \u043d\u0430\u0447\u0430\u0442\u044c \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0430 \u0434\u0430\u043b\u0435\u0435 \u0443\u0436\u0435 \u0431\u0443\u0434\u0443 \u043e\u0442\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0432\u0430\u0448\u0438\u0445 \u0436\u0435\u043b\u0430\u043d\u0438\u0439 \u0438 \u0432\u0430\u0448\u0435\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438.<\/p>\n<p>\u041d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u044f \u043d\u0430\u0445\u043e\u0434\u0438\u043b \u0440\u0430\u0437\u043d\u044b\u0435 \u0433\u0430\u0439\u0434\u044b \u043f\u043e \u0442\u043e\u043c\u0443, \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0438 \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u0433\u0434\u0435, \u0434\u0430\u0436\u0435 \u043d\u0430 \u0430\u043d\u0433\u043b\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0438 (\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e) \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0433\u0430\u0439\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0441\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u044f.<\/p>\n<p>\u042f \u0445\u043e\u0447\u0443 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c 2 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0444\u0438\u0433\u0443\u0440\u044b: <strong><em>IOnlineSubsystem<\/em><\/strong> &#8212; \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0431\u0443\u0434\u0443\u0449\u0435\u0439 \u0438\u0433\u0440\u044b \u0438 <strong><em>AGameSession<\/em><\/strong> &#8212; \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<hr\/>\n<h2>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/h2>\n<h4>1. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/h4>\n<p><strong>IOnlineSubsystem<\/strong> &#8212; \u044d\u0442\u043e singleton \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043a\u0430\u043a\u0438\u043c \u043b\u0438\u0431\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c (Steam,Origin,PS store \u0438 \u0442.\u0434). \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0430\u0448\u0430 \u0438\u0433\u0440\u0430 \u0443\u043c\u0435\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430 \u044d\u0442\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0441\u043e\u0432, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434 \u044d\u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441. \u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0433\u0430\u0439\u0434\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <strong>OnlineSubsystemSteam<em>.<\/em><\/strong><\/p>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u043b, <strong>IOnlineSubsytem<\/strong> &#8212; \u044d\u0442\u043e \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043f\u0440\u0438\u0447\u0435\u043c \u043e\u0447\u0435\u043d\u044c \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445. \u0427\u0442\u043e\u0431\u044b \u0432\u0430\u0448\u0443 \u0438\u0433\u0440\u0443 \u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u044d\u0442\u0438\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u044b \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043e (\u0431\u043b\u0430\u0433\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432). \u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u044b \u043f\u0440\u043e\u0448\u0443 \u0432\u0430\u0441 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0439\u0442\u0438 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 <strong>OnlineSubsystemSteam<\/strong>. <\/p>\n<blockquote>\n<p><strong><em>\u0412 \u0433\u0430\u0439\u0434\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 OnlineSubsystemSteam, \u0442.\u043a \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432 \u043f\u043e \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e.<\/em><\/strong><\/p>\n<\/blockquote>\n<figure class=\"bordered full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" alt=\"\u0420\u0438\u0441. 1. \u041c\u0435\u0441\u0442\u043e\u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 OnlineSubsystemSteam\" title=\"\u0420\u0438\u0441. 1. \u041c\u0435\u0441\u0442\u043e\u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 OnlineSubsystemSteam\" height=\"286\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/477\/fc3\/dc2\/477fc3dc2bbb6871fe64b916d31731c5.png\" data-width=\"625\"\/><figcaption>\u0420\u0438\u0441. 1. \u041c\u0435\u0441\u0442\u043e\u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 OnlineSubsystemSteam<\/figcaption><\/figure>\n<p><strong>AGameSession<\/strong> &#8212; \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u041e\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u043a \u0441\u0435\u0441\u0441\u0438\u0438 \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0430\u043a \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c.<\/p>\n<p>\u041e\u0447\u0435\u043d\u044c \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0445\u0435\u0434\u0434\u0435\u0440\u043e\u043c <strong>GameSession<em>.h<\/em><\/strong> \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <em>GameFramework\/GameSession.h<\/em>  \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" alt=\"\u0420\u0438\u0441. 2. \u041c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u0430 AGameSession \u0434\u043b\u044f \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430.\" title=\"\u0420\u0438\u0441. 2. \u041c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u0430 AGameSession \u0434\u043b\u044f \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430.\" height=\"757\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/74e\/ab3\/bb2\/74eab3bb2ec5507e2bfabae481d9385e.png\" data-width=\"834\"\/><figcaption>\u0420\u0438\u0441. 2. \u041c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u0430 AGameSession \u0434\u043b\u044f \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430.<\/figcaption><\/figure>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u044d\u0442\u0438 \u0434\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0441\u0438\u043d\u0435\u0440\u0433\u0438\u0438 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442.<\/p>\n<h4>2. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a\u043e\u0432 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443. \u041f\u043e\u0434 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043b\u0438\u0435\u043d\u0442, \u0442\u0430\u043a \u0438 dedicated-\u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u0438\u0441\u043a \u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0443\u043d\u043a\u0442\u0435:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u0438\u0441\u043a. \u0412\u0441\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u0433\u0434\u0435-\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u043a\u0430\u043a-\u0442\u043e \u0438\u0441\u043a\u0430\u0442\u044c. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u043e\u043b\u0435 \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0438\u0441\u043a\u0430:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"cpp\">#pragma once #include \"CPP_GameSession.generated.h\"  UCLASS(config = Game) class ACPP_GameSession : public AGameSession { GENERATED_BODY() public: \/**  * @param UserId \u042e\u0437\u0435\u0440, \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0438\u0441\u043a.  * @param bIsLAN \u0415\u0441\u043b\u0438 \u0438\u0449\u0435\u043c \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438  * @param bIsPresence \u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u0438\u0441\u043a \u0441\u0435\u0441\u0441\u0438\u0439 \u0441 \u0442\u0435\u043c \u0436\u0435 \u0444\u043b\u0430\u0433\u043e\u043c.                                                     * \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0432\u0440\u043e\u0434\u0435 \u0441\u0442\u0438\u043c'\u0430,  * \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433 \u043a \u0434\u0440\u0443\u0433\u0443 \u0447\u0435\u0440\u0435\u0437 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0440\u0443\u0437\u0435\u0439, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443.    *\/ void FindSessions(TSharedPtr&lt;const FUniqueNetId> UserId, bool bIsLAN, bool bIsPresence); private: \/**\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u0445\u0440\u0430\u043d\u044f\u0449\u0430\u044f \u043d\u0430\u0439\u0434\u0435\u043d\u044b\u0435 \u0441\u0435\u0441\u0441\u0438\u0438. *\/ TSharedPtr&lt;FOnlineSessionSearch> SearchSettings;  };<\/code><\/pre>\n<p>\u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0432 \u0444\u0430\u0439\u043b \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 .Build.cs) \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438:<\/p>\n<pre><code class=\"cs\">PublicDependencyModuleNames.AddRange(new string[] {  \"OnlineSubsystem\", \"OnlineSubsystemUtils\" });<\/code><\/pre>\n<p>\u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0430\u043c \u043f\u043e\u0438\u0441\u043a:<\/p>\n<pre><code class=\"cpp\">void ACPP_GameSession::FindSessions(TSharedPtr&lt;const FUniqueNetId> UserId, bool bIsLAN, bool bIsPresence) {   \/\/\u0411\u0435\u0440\u0435\u043c singleton \u043e\u0431\u044a\u0435\u043a\u0442 IOnlineSubsystem* OnlineSub = Online::GetSubsystem(GetWorld()); if (OnlineSub) {   \/\/\u041c\u044b \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443     \/\/\u0412 \u043a\u0430\u0436\u0434\u043e\u0439 OnlineSubsystem \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443     \/\/\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u041d\u0430\u0448\u0435\u0439 \u0441\u0435\u0441\u0441\u0438\u0438     \/\/\u041f\u043e\u043a\u0430 \u0438\u0433\u0440\u043e\u043a \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443, \u043e\u043d \u0441\u0430\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c     \/\/\u0418 \u043f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0430\u0448\u0430 \"\u0441\u0435\u0441\u0441\u0438\u044f\",     \/\/\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0441\u0435\u0441\u0441\u0438\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430. IOnlineSessionPtr Sessions = OnlineSub->GetSessionInterface();  if (Sessions.IsValid() &amp;&amp; UserId.IsValid()) {       \/\/\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0435\u0441\u0441\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 SearchSettings = MakeShareable(new FOnlineSessionSearch()); SearchSettings->bIsLanQuery = bIsLAN; SearchSettings->MaxSearchResults = 100;        \/\/\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 QuerySettings if (bIsPresence) {         \/\/\u0412\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u044d\u0442\u043e SEARCH_PRESENCE \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043d\u0430\u0448 \u0444\u043b\u0430\u0433 \u0441 \u0442\u0438\u043f\u043e\u043c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f EOnlineComparisonOp::Equals SearchSettings->QuerySettings.Set(SEARCH_PRESENCE, bIsPresence, EOnlineComparisonOp::Equals); }  \/\/\u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0438\u0441\u043a \u0441\u0435\u0441\u0441\u0438\u0439 \u043e\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f - \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f       \/\/\u041f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u043a \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0443 OnFindSessionsCompleteDelegate (\u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0438\u0436\u0435)       \/\/\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043b\u0435\u0433\u0430\u0442 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043e\u0442\u0432\u044f\u0437\u0430\u0442\u044c,       \/\/\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0435\u043b\u0435\u0433\u0430\u0442 Handler \u0438 \u043f\u0440\u0438\u0432\u044f\u0436\u0435\u043c \u0435\u0433\u043e:       OnFindSessionsCompleteDelegateHandle = Sessions->AddOnFindSessionsCompleteDelegate_Handle(OnFindSessionsCompleteDelegate);  \/\/\u0418\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0438\u0441\u043a, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f ID \u0438\u0441\u043a\u0430\u0442\u0435\u043b\u044f (\u0438\u0433\u0440\u043e\u043a\u0430) \u0438 \u043d\u0430\u0448\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438. Sessions->FindSessions(*UserId, SearchSettings.ToSharedRef()); } } }<\/code><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0438\u0441\u043a \u0441\u0435\u0441\u0441\u0438\u0439 \u043e\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0443\u0437\u043d\u0430\u0442\u044c.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u043e\u0432 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e:<\/p>\n<pre><code class=\"cpp\">UCLASS(config = Game) class ACPP_GameSession : public AGameSession { GENERATED_BODY() ... protected: virtual void BeginPlay() override; private: \/** \u0414\u0435\u043b\u0435\u0433\u0430\u0442 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 *\/ FOnCreateSessionCompleteDelegate OnCreateSessionCompleteDelegate; \/** \u0414\u0435\u043b\u0435\u0433\u0430\u0442 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442 \u0441\u0435\u0441\u0441\u0438\u0438 *\/ FOnStartSessionCompleteDelegate OnStartSessionCompleteDelegate; \/** \u0414\u0435\u043b\u0435\u0433\u0430\u0442 \u043d\u0430 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 (\u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c) *\/ FOnDestroySessionCompleteDelegate OnDestroySessionCompleteDelegate; \/** \u0414\u0435\u043b\u0435\u0433\u0430\u0442 \u043d\u0430 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0435\u0441\u0441\u0438\u0438 *\/ FOnFindSessionsCompleteDelegate OnFindSessionsCompleteDelegate; \/** \u0414\u0435\u043b\u0435\u0433\u0430\u0442 \u043d\u0430 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0441\u0441\u0438\u0438*\/ FOnJoinSessionCompleteDelegate OnJoinSessionCompleteDelegate;      \/\/\u041d\u0438\u0436\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0430.     \/**  * @param SessionName \u0418\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f callback  * @param bWasSuccessful true, \u0435\u0441\u043b\u0438 \u0430\u0441\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a  *\/ virtual void OnCreateSessionComplete(FName SessionName, bool bWasSuccessful);  \/**  * @param SessionName \u0418\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f callback   * @param bWasSuccessful true, \u0435\u0441\u043b\u0438 \u0430\u0441\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a  *\/ void OnStartOnlineGameComplete(FName SessionName, bool bWasSuccessful); \/**  * @param bWasSuccessful true, \u0435\u0441\u043b\u0438 \u0430\u0441\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a  *\/ void OnFindSessionsComplete(bool bWasSuccessful);  \/**  * @param SessionName \u0418\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f callback   * @param bWasSuccessful true, \u0435\u0441\u043b\u0438 \u0430\u0441\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a  *\/ void OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result);  \/**  * @param SessionName \u0418\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f callback  * @param bWasSuccessful true, \u0435\u0441\u043b\u0438 \u0430\u0441\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a  *\/ virtual void OnDestroySessionComplete(FName SessionName, bool bWasSuccessful);    \/** Handler'\u044b \u043d\u0430\u0448\u0438\u0445 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u043e\u0432 *\/ FDelegateHandle OnStartSessionCompleteDelegateHandle; FDelegateHandle OnCreateSessionCompleteDelegateHandle; FDelegateHandle OnDestroySessionCompleteDelegateHandle; FDelegateHandle OnFindSessionsCompleteDelegateHandle; FDelegateHandle OnJoinSessionCompleteDelegateHandle;   };<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0432\u044f\u0436\u0435\u043c \u0438\u0445 \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c:<\/p>\n<pre><code class=\"cpp\">... void ACPP_GameSession::BeginPlay() { Super::BeginPlay();  OnCreateSessionCompleteDelegate = FOnCreateSessionCompleteDelegate::CreateUObject(this, &amp;ACPP_GameSession::OnCreateSessionComplete); OnStartSessionCompleteDelegate = FOnStartSessionCompleteDelegate::CreateUObject(this, &amp;ACPP_GameSession::OnStartOnlineGameComplete); OnFindSessionsCompleteDelegate = FOnFindSessionsCompleteDelegate::CreateUObject(this, &amp;ACPP_GameSession::OnFindSessionsComplete); OnJoinSessionCompleteDelegate = FOnJoinSessionCompleteDelegate::CreateUObject(this, &amp;ACPP_GameSession::OnJoinSessionComplete); OnDestroySessionCompleteDelegate = FOnDestroySessionCompleteDelegate::CreateUObject(this, &amp;ACPP_GameSession::OnDestroySessionComplete); } ...<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0438\u0441\u043a \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f &#8212; \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u043d\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>OnFindSessionsComplete()<\/code>. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0435\u0435:<\/p>\n<pre><code class=\"cpp\">void ACPP_GameSession::OnFindSessionsComplete(bool bWasSuccessful) { \/\/ \u041e\u043f\u044f\u0442\u044c \u0431\u0435\u0440\u0435\u043c \u043d\u0430\u0448 Subsystem IOnlineSubsystem* const OnlineSub = IOnlineSubsystem::Get(); if (OnlineSub) { \/\/ \u0421\u043d\u043e\u0432\u0430 \u043f\u0440\u043e\u0441\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0435\u0441\u0441\u0438\u0438. IOnlineSessionPtr Sessions = OnlineSub->GetSessionInterface(); if (Sessions.IsValid()) {       \/\/\u0427\u0438\u0441\u0442\u0438\u043c \u0434\u0435\u043b\u0435\u0433\u0430\u0442 Sessions->ClearOnFindSessionsCompleteDelegate_Handle(OnFindSessionsCompleteDelegateHandle); \/\/ \u0415\u0441\u043b\u0438 \u043a\u043e\u043b-\u0432\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u0439 \u043d\u0435 \u043d\u0443\u043b\u044c if (SearchSettings->SearchResults.Num() > 0) {         \/\/\u0412 \u0446\u0435\u043b\u044f\u0445 \u0434\u0435\u0431\u0430\u0433\u0430 \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u0430\u0439\u0434\u0435\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438. for (int32 SearchIdx = 0; SearchIdx &lt; SearchSettings->SearchResults.Num(); SearchIdx++) { \/\/\u041a\u0430\u043a \u0443\u0436\u0435 \u043e\u0442\u043c\u0435\u0447\u0430\u043b\u043e\u0441\u044c, SearchSettings \u0445\u0440\u0430\u043d\u0438\u0442 \u0438\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0430\u0439\u0434\u0435\u043d\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u044f\u0445           \/\/\u041f\u0440\u043e\u0441\u0438\u043c \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u0430\u043c \u0438\u043c\u044f \u0432\u0441\u0435\u0445 \u043d\u0430\u0439\u0434\u0435\u043d\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u0439: GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Red, FString::Printf(TEXT(\"Session Number: %d | Sessionname: %s \"), SearchIdx + 1, *(SearchSettings->SearchResults[SearchIdx].Session.OwningUserName))); } } } } }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0438\u0441\u043a \u043e\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f, \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u043e\u0432\u0435\u0441\u0442\u0438\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430 \u043e\u0431 \u044d\u0442\u043e\u043c, \u0443\u0431\u0440\u0430\u0432 \u044d\u043a\u0440\u0430\u043d \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u043b\u043e\u0433\u043e\u0442\u0438\u043f, \u0437\u0430\u0441\u043f\u0430\u0432\u043d\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u0432\u043e\u0434 \u0434\u0435\u0431\u0430\u0433\u0430 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0441\u043a\u0430\u0436\u0443\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c.<\/p>\n<ol start=\"2\">\n<li>\n<p>\u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"cpp\">bool ACPP_GameSession::JoinSession(TSharedPtr&lt;const FUniqueNetId> UserId, FName InSessionName, const FOnlineSessionSearchResult&amp; SearchResult) { bool bSuccessful = false;  IOnlineSubsystem* OnlineSub = IOnlineSubsystem::Get();      if (OnlineSub) { \/\/\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043d\u0430\u0448\u0435\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0441\u0435\u0441\u0441\u0438\u0438 IOnlineSessionPtr Sessions = OnlineSub->GetSessionInterface();      if (Sessions.IsValid() &amp;&amp; UserId.IsValid()) { \/\/\u0412\u0441\u0435 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 - \u043f\u0440\u043e\u0441\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0441\u044f \u043a \u0441\u0435\u0441\u0441\u0438\u0438 \u0438 \u0436\u0434\u0435\u043c, \/\/\u043f\u043e\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u043a \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0443 OnJoinSessionCompleteDelegate OnJoinSessionCompleteDelegateHandle = Sessions->AddOnJoinSessionCompleteDelegate_Handle(OnJoinSessionCompleteDelegate); bSuccessful = Sessions->JoinSession(*UserId, InSessionName, SearchResult); } } return bSuccessful; }<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0432\u044b\u0437\u043e\u0432 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0430:<\/p>\n<pre><code class=\"cpp\">void ACPP_GameSession::OnJoinSessionComplete(FName InSessionName, EOnJoinSessionCompleteResult::Type Result) {     IOnlineSubsystem* OnlineSub = IOnlineSubsystem::Get();     if (OnlineSub)     {     IOnlineSessionPtr Sessions = OnlineSub->GetSessionInterface();     if (Sessions.IsValid())     {     \/\/\u0422.\u043a \u044d\u0442\u043e\u0442 \u0432\u044b\u0437\u043e\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d - \u0447\u0438\u0441\u0442\u0438\u043c \u0434\u0435\u043b\u0435\u0433\u0430\u0442     Sessions->ClearOnJoinSessionCompleteDelegate_Handle(OnJoinSessionCompleteDelegateHandle);          \/\/PlayerController \u0432\u0445\u043e\u0434\u0430 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e     APlayerController* const PlayerController = GetGameInstance()->GetFirstLocalPlayerController();          \/\/ \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u0432\u0441\u0435\u0445 Online subsystem \u0440\u0430\u0437\u043d\u044b\u0435 URL \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f         \/\/\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043f\u043e\u0440\u043e\u0441\u0438\u0442\u044c \u043d\u0430\u0448 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0441 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0430\u0441 \u044d\u0442\u043e\u0442 URL \u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u044d\u0442\u0443 \u0441\u0442\u0440\u0438\u043d\u0433\u0443     FString TravelURL;     if (PlayerController &amp;&amp; Sessions->GetResolvedConnectString(InSessionName, TravelURL))     {     \/\/ \u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043f\u0435\u0440\u0435\u043d\u043e\u0441:     PlayerController->ClientTravel(TravelURL, TRAVEL_Absolute);     }     }     } }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438 \u0441\u0430\u043c travel.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043b\u0435\u0437\u0435\u0442\u0435 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e ClientTravel, \u0442\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u0435, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e OpenLevel \u0441 \u043d\u0443\u0436\u043d\u044b\u043c URL \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438.<\/p>\n<ol start=\"3\">\n<li>\n<p>\u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a GameSession \u0438 \u0432\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0443\u0433\u0443\u0431\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0438 subsystem.<\/p>\n<p>\u0413\u0434\u0435 \u043d\u0438\u0431\u0443\u0434\u044c \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 \u0438\u043b\u0438, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u043b \u044f, \u0432<\/p>\n<p> <code>UCPP_ClientTravelSubsystem<\/code> : <code>public UGameInstanceSubsystem<\/code><\/p>\n<pre><code class=\"cpp\">class UCPP_ClientTravelSubsystem  : public UGameInstanceSubsystem { GENERATED_BODY()      public:  \/\/\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 void DestroySession();      private:   \/\/\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0434\u0435\u043b\u0435\u0433\u0430\u0442 Handle \u043d\u0430 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438   FDelegateHandle OnDestroySessionCompleteDelegateHandle;      \/\/\u0412\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0441\u0435\u0441\u0441\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0430   void DestroySessionComplete(FName InSessionName, bool bWasSuccessful); }<\/code><\/pre>\n<blockquote>\n<p><strong><em>*\u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0447\u0442\u043e \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 Subsystem, \u0442.\u043a \u044d\u0442\u043e \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0434\u0430\u043b\u0435\u043a\u043e \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u0433\u0430\u0439\u0434\u0430. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442 (GameInstance \u0438\u043b\u0438 PlayerController)<\/em><\/strong><\/p>\n<\/blockquote>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>DestroyClientSession()<\/code><\/p>\n<pre><code class=\"cpp\">void UCPP_ClientTravelSubsystem :: DestroyClientSession() { IOnlineSubsystem* Subsystem = Online::GetSubsystem(GetWorld()); if(Subsystem) { IOnlineSessionPtr Session = Subsystem->GetSessionInterface(); if(Session.IsValid()) {       \/\/\u041f\u043e\u0434\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 Destroy'\u044f OnDestroySessionCompleteDelegateHandle = Session->AddOnDestroySessionCompleteDelegate_Handle(OnDestroySessionComplete); \/\/\u0411\u0430\u043d\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0438\u043c \u043d\u0430\u0448 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0435\u0441\u0441\u0438\u044e.       Session->DestroySession(NAME_GameSession); } }                                                                                              }<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0448 Destroy:<\/p>\n<pre><code class=\"cpp\">void UCPP_ClientTravelSubsystem::DestroySessionComplete(FName InSessionName, bool bWasSuccessful) { if(bWasSuccessful) {   \/\/\u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0448\u043b\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u043e\u0442\u043a\u0440\u043e\u0435\u043c \u043a\u0430\u043a\u0443\u044e \u043d\u0438\u0431\u0443\u0434\u044c \u043a\u0430\u0440\u0442\u0443 UGameplayStatics::OpenLevel(MapName) } }<\/code><\/pre>\n<p><strong><em>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c: \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0435\u0441\u0441\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0438 \u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0438 \u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043a\u043e\u0433\u0434\u0430 \u0442\u043e\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0438\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u0435\u0441\u0441\u0438\u0438.<\/em><\/strong><\/p>\n<p><strong><em>\u0415\u0441\u043b\u0438 Destroy \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 &#8212; \u043e\u043d \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u0441\u0435\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u0435\u0441\u043b\u0438 Destroy \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442 (\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0443 \u0441\u0435\u0431\u044f \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435), \u0442\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0443\u0436\u0435 \u043e\u043d, \u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u044d\u0442\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442.<\/em><\/strong><\/p>\n<h4>3. \u0425\u043e\u0441\u0442\u0438\u043d\u0433<\/h4>\n<p>\u0423 \u0445\u043e\u0441\u0442\u0438\u043d\u0433\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0430\u0440\u0442 \u0441\u0435\u0441\u0441\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>Destroy \u0441\u0435\u0441\u0441\u0438\u0438<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440, \u0435\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c \u0438\u0433\u0440\u043e\u043a\u0430\u043c \u043a \u0441\u0435\u0431\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f.<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"cpp\">class ACPP_GameSession : public AGameSession { GENERATED_BODY() public: ... \/** * \u0425\u043e\u0441\u0442\u0438\u043c \u043d\u043e\u0432\u0443\u044e \u0441\u0435\u0441\u0441\u0438\u044e * * @param UserId ID \u0438\u0433\u0440\u043e\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 * @param SessionName \u0418\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438 * @param bIsLAN \u0415\u0441\u043b\u0438 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 * @param bIsPresence \u0415\u0441\u043b\u0438 \u0441\u0435\u0441\u0441\u0438\u044f \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u0430 \u043a\u0430\u043a Presence * @param MaxNumPlayers \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0438\u0433\u0440\u043e\u043a\u043e\u0432 * * @return bool \u0444\u043b\u0430\u0433 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f *\/ bool HostSession(TSharedPtr&lt;const FUniqueNetId> UserId, FName SessionName, const FString&amp; GameType, const FString&amp; MapName, bool bIsLAN, bool bIsPresence, int32 MaxNumPlayers); private:  \/**  * \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u043e\u043c, \u043a\u043e\u0433\u0434\u0430 \u0441\u0435\u0441\u0441\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0430  *  * @param SessionName \u0418\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e\u0442 callback  * @param bWasSuccessful true \u0435\u0441\u043b\u0438 \u0430\u0441\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0443\u0441\u043f\u0435\u0448\u043d\u043e  *\/ virtual void OnCreateSessionComplete(FName SessionName, bool bWasSuccessful);  \/**  * \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u043e\u043c \u043a\u043e\u0433\u0434\u0430 \u0441\u0435\u0441\u0441\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043d\u0430\u0447\u0430\u0442\u0430  *  * @param SessionName \u0418\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e\u0442 callback  * @param bWasSuccessful true \u0435\u0441\u043b\u0438 \u0430\u0441\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0443\u0441\u043f\u0435\u0448\u043d\u043e  *\/ void OnStartOnlineGameComplete(FName SessionName, bool bWasSuccessful);      \/** \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c *\/ TSharedPtr&lt;FOnlineSessionSettings> HostSettings;   ... };<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">bool ACPP_GameSession::HostSession(TSharedPtr&lt;const FUniqueNetId> UserId, FName InSessionName, const FString&amp; GameType, const FString&amp; MapName, bool bIsLAN, bool bIsPresence, int32 MaxNumPlayers) { IOnlineSubsystem* const OnlineSub = Online::GetSubsystem(GetWorld()); if (OnlineSub) { IOnlineSessionPtr Sessions = OnlineSub->GetSessionInterface(); if (Sessions.IsValid()) {       \/\/\u0417\u0430\u043f\u043e\u043d\u044f\u0435\u043c HostSettings \u043d\u0430\u0448\u0438\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438.       \/\/\u0418\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u043a\u043e\u043b-\u0432\u043e \u043d\u0430 \u0432\u0430\u0448\u0435 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435.       \/\/\u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435: HostSettings = MakeShareable(new FOnlineSessionSettings()); HostSettings->bIsLANMatch = bIsLAN; HostSettings->bUsesPresence = bIsPresence; HostSettings->NumPublicConnections = MaxNumPlayers;        \/\/\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044e \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0432\u0438\u0434 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438       \/\/\u0415\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432 HostSettings \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u0444\u043b\u0430\u0433\u0443 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435       \/\/\u041a\u0430\u043a \u0437\u0434\u0435\u0441\u044c: SETTING_MAPNAME \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043c\u044f \u043d\u0430\u0448\u0435\u0439 \u043a\u0430\u0440\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c       \/\/\u0418\u0433\u0440\u043e\u043a\u0443 \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u044d\u0442\u0443 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0438\u0437 \u043d\u0430\u0439\u0434\u0435\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440 \u043f\u043e \u043a\u0430\u0440\u0442\u0430\u043c HostSettings->Set(SETTING_MAPNAME, MapName, EOnlineDataAdvertisementType::ViaOnlineService);  OnCreateSessionCompleteDelegateHandle = Sessions->AddOnCreateSessionCompleteDelegate_Handle(OnCreateSessionCompleteDelegate); \/\/\u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043d\u0430\u0448\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.       return Sessions->CreateSession(*UserId, InSessionName, *HostSettings); } } return false; }<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0434\u0435\u043b\u0435\u0433\u0430\u0442:<\/p>\n<pre><code class=\"cpp\">void ACPP_GameSession::OnCreateSessionComplete(FName InSessionName, bool bWasSuccessful) { IOnlineSubsystem* OnlineSub = IOnlineSubsystem::Get(); if (OnlineSub) { IOnlineSessionPtr Sessions = OnlineSub->GetSessionInterface(); if (Sessions.IsValid()) {       \/\/\u0427\u0438\u0441\u0442\u0438\u043c \u0434\u0435\u043b\u0435\u0433\u0430\u0442 Sessions->ClearOnCreateSessionCompleteDelegate_Handle(OnCreateSessionCompleteDelegateHandle); if (bWasSuccessful) {         \/\/\u041f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u0435\u043b\u0435\u0433\u0430\u0442 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442 \u0441\u0435\u0441\u0441\u0438\u0438 OnStartSessionCompleteDelegateHandle = Sessions->AddOnStartSessionCompleteDelegate_Handle(OnStartSessionCompleteDelegate); Sessions->StartSession(SessionName); } } } }<\/code><\/pre>\n<ol start=\"2\">\n<li>\n<p>\u0421\u0442\u0430\u0440\u0442 \u0441\u0435\u0441\u0441\u0438\u0438<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0443\u0442 \u0443\u0436\u0435 \u043f\u043e\u043f\u0440\u043e\u0449\u0435. \u041f\u0440\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f <code>OnStartOnlineGameComplete();<\/code><\/p>\n<pre><code class=\"cpp\">void ACPP_GameSession::OnStartOnlineGameComplete(FName _SessionName, bool bWasSuccessful) { IOnlineSubsystem* OnlineSub = IOnlineSubsystem::Get(); if (OnlineSub) { IOnlineSessionPtr Sessions = OnlineSub->GetSessionInterface(); if (Sessions.IsValid()) { \/\/\u0427\u0438\u0441\u0442\u0438\u043c \u0434\u0435\u043b\u0435\u0433\u0430\u0442       Sessions->ClearOnStartSessionCompleteDelegate_Handle(OnStartSessionCompleteDelegateHandle); }      \/\/\u0415\u0441\u043b\u0438 \u0441\u0435\u0441\u0441\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0430 - \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u0440\u0442\u0443 if (bWasSuccessful) {       \/\/MapName - \u0438\u043c\u044f \u043a\u0430\u043a\u043e\u0439 \u043d\u0438\u0431\u0443\u0434\u044c \u043a\u0430\u0440\u0442\u044b       \/\/\u0418 \u0432\u0430\u0436\u043d\u043e (!), \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \"listen\"       \/\/\u041c\u0430\u0440\u043a\u0438\u0440\u0443\u044f \u044d\u0442\u0443 \u043a\u0430\u0440\u0442\u0443 \u043a\u0430\u043a \u043e\u043d\u043b\u0430\u0439\u043d-\u043e\u0442\u043a\u0440\u044b\u0442\u0443\u044e UGameplayStatics::OpenLevel(GetWorld(),MapName , true, \"listen\"); } } } <\/code><\/pre>\n<ol start=\"3\">\n<li>\n<p>Destroy \u0441\u0435\u0441\u0441\u0438\u0438<\/p>\n<\/li>\n<\/ol>\n<p>\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u0432\u044b\u0448\u0435 \u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432 <code>UGameSession<\/code>, \u0442\u0443\u0442 \u0443\u0436\u0435 \u043d\u0430 \u0432\u0430\u0448\u0435 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435.<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412\u043e\u0442 \u043f\u043e\u0436\u0430\u043b\u0443\u0439 \u0438 \u0432\u0441\u0435. \u0413\u0430\u0439\u0434 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u043c \u0438, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0442\u044f\u0436\u0435\u043b\u044b\u043c \u0434\u043b\u044f \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432.<\/p>\n<p>\u042f \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u0433 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u043b\u0438\u0431\u043e \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0438 \u0438\u043b\u0438 \u043d\u0435\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0438\u0448\u0438\u0442\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0436\u0435\u043b\u0430\u043d\u0438\u044f, \u0441 \u0440\u0430\u0434\u043e\u0441\u0442\u044c\u044e \u043d\u0430 \u043d\u0438\u0445 \u043e\u0442\u0432\u0435\u0447\u0443.<\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u043b\u0438!<\/p>\n<\/div>\n<\/div>\n<p> <!----> <!----><br \/> \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\/599581\/\"> https:\/\/habr.com\/ru\/post\/599581\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\" class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442 \u0425\u0430\u0431\u0440!<\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0441\u0442\u0430\u0442\u0435\u0439 \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u0435\u0440\u0430 \u0432 UE 4 \u0438 5. \u0425\u043e\u0447\u0443 \u043d\u0430\u0447\u0430\u0442\u044c \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0430 \u0434\u0430\u043b\u0435\u0435 \u0443\u0436\u0435 \u0431\u0443\u0434\u0443 \u043e\u0442\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0432\u0430\u0448\u0438\u0445 \u0436\u0435\u043b\u0430\u043d\u0438\u0439 \u0438 \u0432\u0430\u0448\u0435\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438.<\/p>\n<p>\u041d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u044f \u043d\u0430\u0445\u043e\u0434\u0438\u043b \u0440\u0430\u0437\u043d\u044b\u0435 \u0433\u0430\u0439\u0434\u044b \u043f\u043e \u0442\u043e\u043c\u0443, \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0438 \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u0433\u0434\u0435, \u0434\u0430\u0436\u0435 \u043d\u0430 \u0430\u043d\u0433\u043b\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0438 (\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e) \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0433\u0430\u0439\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0441\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u044f.<\/p>\n<p>\u042f \u0445\u043e\u0447\u0443 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c 2 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0444\u0438\u0433\u0443\u0440\u044b: <strong><em>IOnlineSubsystem<\/em><\/strong> &#8212; \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0431\u0443\u0434\u0443\u0449\u0435\u0439 \u0438\u0433\u0440\u044b \u0438 <strong><em>AGameSession<\/em><\/strong> &#8212; \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<hr\/>\n<h2>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/h2>\n<h4>1. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/h4>\n<p><strong>IOnlineSubsystem<\/strong> &#8212; \u044d\u0442\u043e singleton \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043a\u0430\u043a\u0438\u043c \u043b\u0438\u0431\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c (Steam,Origin,PS store \u0438 \u0442.\u0434). \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0430\u0448\u0430 \u0438\u0433\u0440\u0430 \u0443\u043c\u0435\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430 \u044d\u0442\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0441\u043e\u0432, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434 \u044d\u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441. \u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0433\u0430\u0439\u0434\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <strong>OnlineSubsystemSteam<em>.<\/em><\/strong><\/p>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u043b, <strong>IOnlineSubsytem<\/strong> &#8212; \u044d\u0442\u043e \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043f\u0440\u0438\u0447\u0435\u043c \u043e\u0447\u0435\u043d\u044c \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445. \u0427\u0442\u043e\u0431\u044b \u0432\u0430\u0448\u0443 \u0438\u0433\u0440\u0443 \u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u044d\u0442\u0438\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u044b \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043e (\u0431\u043b\u0430\u0433\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432). \u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u044b \u043f\u0440\u043e\u0448\u0443 \u0432\u0430\u0441 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0439\u0442\u0438 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 <strong>OnlineSubsystemSteam<\/strong>. <\/p>\n<blockquote>\n<p><strong><em>\u0412 \u0433\u0430\u0439\u0434\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 OnlineSubsystemSteam, \u0442.\u043a \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432 \u043f\u043e \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e.<\/em><\/strong><\/p>\n<\/blockquote>\n<figure class=\"bordered full-width\"><figcaption>\u0420\u0438\u0441. 1. \u041c\u0435\u0441\u0442\u043e\u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 OnlineSubsystemSteam<\/figcaption><\/figure>\n<p><strong>AGameSession<\/strong> &#8212; \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u041e\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u043a \u0441\u0435\u0441\u0441\u0438\u0438 \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0430\u043a \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c.<\/p>\n<p>\u041e\u0447\u0435\u043d\u044c \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0445\u0435\u0434\u0434\u0435\u0440\u043e\u043c <strong>GameSession<em>.h<\/em><\/strong> \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <em>GameFramework\/GameSession.h<\/em>  \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441. 2. \u041c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u0430 AGameSession \u0434\u043b\u044f \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430.<\/figcaption><\/figure>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u044d\u0442\u0438 \u0434\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0441\u0438\u043d\u0435\u0440\u0433\u0438\u0438 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442.<\/p>\n<h4>2. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a\u043e\u0432 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u043a\u0430 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443. \u041f\u043e\u0434 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043b\u0438\u0435\u043d\u0442, \u0442\u0430\u043a \u0438 dedicated-\u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u0438\u0441\u043a \u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0443\u043d\u043a\u0442\u0435:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u0438\u0441\u043a. \u0412\u0441\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u0433\u0434\u0435-\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u043a\u0430\u043a-\u0442\u043e \u0438\u0441\u043a\u0430\u0442\u044c. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u043e\u043b\u0435 \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0438\u0441\u043a\u0430:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"cpp\">#pragma once #include \"CPP_GameSession.generated.h\"  UCLASS(config = Game) class ACPP_GameSession : public AGameSession { GENERATED_BODY() public: \/**  * @param UserId \u042e\u0437\u0435\u0440, \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0438\u0441\u043a.  * @param bIsLAN \u0415\u0441\u043b\u0438 \u0438\u0449\u0435\u043c \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438  * @param bIsPresence \u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u0438\u0441\u043a \u0441\u0435\u0441\u0441\u0438\u0439 \u0441 \u0442\u0435\u043c \u0436\u0435 \u0444\u043b\u0430\u0433\u043e\u043c.                                                     * \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0432\u0440\u043e\u0434\u0435 \u0441\u0442\u0438\u043c'\u0430,  * \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433 \u043a \u0434\u0440\u0443\u0433\u0443 \u0447\u0435\u0440\u0435\u0437 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0440\u0443\u0437\u0435\u0439, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443.    *\/ void FindSessions(TSharedPtr&lt;const FUniqueNetId> UserId, bool bIsLAN, bool bIsPresence); private: \/**\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u0445\u0440\u0430\u043d\u044f\u0449\u0430\u044f \u043d\u0430\u0439\u0434\u0435\u043d\u044b\u0435 \u0441\u0435\u0441\u0441\u0438\u0438. *\/ TSharedPtr&lt;FOnlineSessionSearch> SearchSettings;  };<\/code><\/pre>\n<p>\u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0432 \u0444\u0430\u0439\u043b \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 .Build.cs) \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438:<\/p>\n<pre><code class=\"cs\">PublicDependencyModuleNames.AddRange(new string[] {  \"OnlineSubsystem\", \"OnlineSubsystemUtils\" });<\/code><\/pre>\n<p>\u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0430\u043c \u043f\u043e\u0438\u0441\u043a:<\/p>\n<pre><code class=\"cpp\">void ACPP_GameSession::FindSessions(TSharedPtr&lt;const FUniqueNetId> UserId, bool bIsLAN, bool bIsPresence) {   \/\/\u0411\u0435\u0440\u0435\u043c singleton \u043e\u0431\u044a\u0435\u043a\u0442 IOnlineSubsystem* OnlineSub = Online::GetSubsystem(GetWorld()); if (OnlineSub) {   \/\/\u041c\u044b \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443     \/\/\u0412 \u043a\u0430\u0436\u0434\u043e\u0439 OnlineSubsystem \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443     \/\/\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u041d\u0430\u0448\u0435\u0439 \u0441\u0435\u0441\u0441\u0438\u0438     \/\/\u041f\u043e\u043a\u0430 \u0438\u0433\u0440\u043e\u043a \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443, \u043e\u043d \u0441\u0430\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c     \/\/\u0418 \u043f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0430\u0448\u0430 \"\u0441\u0435\u0441\u0441\u0438\u044f\",     \/\/\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0441\u0435\u0441\u0441\u0438\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430. IOnlineSessionPtr Sessions = OnlineSub->GetSessionInterface();  if (Sessions.IsValid() &amp;&amp; UserId.IsValid()) {       \/\/\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0435\u0441\u0441\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 SearchSettings = MakeShareable(new FOnlineSessionSearch()); SearchSettings->bIsLanQuery = bIsLAN; SearchSettings->MaxSearchResults = 100;        \/\/\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 QuerySettings if (bIsPresence) {         \/\/\u0412\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u044d\u0442\u043e SEARCH_PRESENCE \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043d\u0430\u0448 \u0444\u043b\u0430\u0433 \u0441 \u0442\u0438\u043f\u043e\u043c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f EOnlineComparisonOp::Equals SearchSettings->QuerySettings.Set(SEARCH_PRESENCE, bIsPresence, EOnlineComparisonOp::Equals); }  \/\/\u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0438\u0441\u043a \u0441\u0435\u0441\u0441\u0438\u0439 \u043e\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f - \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f       \/\/\u041f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u043a \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0443 OnFindSessionsCompleteDelegate (\u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0438\u0436\u0435)       \/\/\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043b\u0435\u0433\u0430\u0442 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043e\u0442\u0432\u044f\u0437\u0430\u0442\u044c,       \/\/\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0435\u043b\u0435\u0433\u0430\u0442 Handler \u0438 \u043f\u0440\u0438\u0432\u044f\u0436\u0435\u043c \u0435\u0433\u043e:       OnFindSessionsCompleteDelegateHandle = Sessions->AddOnFindSessionsCompleteDelegate_Handle(OnFindSessionsCompleteDelegate);  \/\/\u0418\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0438\u0441\u043a, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f ID \u0438\u0441\u043a\u0430\u0442\u0435\u043b\u044f (\u0438\u0433\u0440\u043e\u043a\u0430) \u0438 \u043d\u0430\u0448\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438. Sessions->FindSessions(*UserId, SearchSettings.ToSharedRef()); } } }<\/code><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0438\u0441\u043a \u0441\u0435\u0441\u0441\u0438\u0439 \u043e\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0443\u0437\u043d\u0430\u0442\u044c.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u043e\u0432 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e:<\/p>\n<pre><code class=\"cpp\">UCLASS(config = Game) class ACPP_GameSession : public AGameSession { GENERATED_BODY() ... protected: virtual void BeginPlay() override; private: \/** \u0414\u0435\u043b\u0435\u0433\u0430\u0442 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 *\/ FOnCreateSessionCompleteDelegate OnCreateSessionCompleteDelegate; \/** \u0414\u0435\u043b\u0435\u0433\u0430\u0442 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442 \u0441\u0435\u0441\u0441\u0438\u0438 *\/ FOnStartSessionCompleteDelegate OnStartSessionCompleteDelegate; \/** \u0414\u0435\u043b\u0435\u0433\u0430\u0442 \u043d\u0430 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 (\u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c) *\/ FOnDestroySessionCompleteDelegate OnDestroySessionCompleteDelegate; \/** \u0414\u0435\u043b\u0435\u0433\u0430\u0442 \u043d\u0430 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0435\u0441\u0441\u0438\u0438 *\/ FOnFindSessionsCompleteDelegate OnFindSessionsCompleteDelegate; \/** \u0414\u0435\u043b\u0435\u0433\u0430\u0442 \u043d\u0430 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0441\u0441\u0438\u0438*\/ FOnJoinSessionCompleteDelegate OnJoinSessionCompleteDelegate;      \/\/\u041d\u0438\u0436\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0430.     \/**  * @param SessionName \u0418\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f callback  * @param bWasSuccessful true, \u0435\u0441\u043b\u0438 \u0430\u0441\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a  *\/ virtual void OnCreateSessionComplete(FName SessionName, bool bWasSuccessful);  \/**  * @param SessionName \u0418\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f callback   * @param bWasSuccessful true, \u0435\u0441\u043b\u0438 \u0430\u0441\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a  *\/ void OnStartOnlineGameComplete(FName SessionName, bool bWasSuccessful); \/**  * @param bWasSuccessful true, \u0435\u0441\u043b\u0438 \u0430\u0441\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a  *\/ void OnFindSessionsComplete(bool bWasSuccessful);  \/**  * @param SessionName \u0418\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f callback   * @param bWasSuccessful true, \u0435\u0441\u043b\u0438 \u0430\u0441\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a  *\/ void OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result);  \/**  * @param SessionName \u0418\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f callback  * @param bWasSuccessful true, \u0435\u0441\u043b\u0438 \u0430\u0441\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a  *\/ virtual void OnDestroySessionComplete(FName SessionName, bool bWasSuccessful);    \/** Handler'\u044b \u043d\u0430\u0448\u0438\u0445 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u043e\u0432 *\/ FDelegateHandle OnStartSessionCompleteDelegateHandle; FDelegateHandle OnCreateSessionCompleteDelegateHandle; FDelegateHandle OnDestroySessionCompleteDelegateHandle; FDelegateHandle OnFindSessionsCompleteDelegateHandle; FDelegateHandle OnJoinSessionCompleteDelegateHandle;   };<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0432\u044f\u0436\u0435\u043c \u0438\u0445 \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c:<\/p>\n<pre><code class=\"cpp\">... void ACPP_GameSession::BeginPlay() { Super::BeginPlay();  OnCreateSessionCompleteDelegate = FOnCreateSessionCompleteDelegate::CreateUObject(this, &amp;ACPP_GameSession::OnCreateSessionComplete); OnStartSessionCompleteDelegate = FOnStartSessionCompleteDelegate::CreateUObject(this, &amp;ACPP_GameSession::OnStartOnlineGameComplete); OnFindSessionsCompleteDelegate = FOnFindSessionsCompleteDelegate::CreateUObject(this, &amp;ACPP_GameSession::OnFindSessionsComplete); OnJoinSessionCompleteDelegate = FOnJoinSessionCompleteDelegate::CreateUObject(this, &amp;ACPP_GameSession::OnJoinSessionComplete); OnDestroySessionCompleteDelegate = FOnDestroySessionCompleteDelegate::CreateUObject(this, &amp;ACPP_GameSession::OnDestroySessionComplete); } ...<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0438\u0441\u043a \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f &#8212; \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u043d\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>OnFindSessionsComplete()<\/code>. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0435\u0435:<\/p>\n<pre><code class=\"cpp\">void ACPP_GameSession::OnFindSessionsComplete(bool bWasSuccessful) { \/\/ \u041e\u043f\u044f\u0442\u044c \u0431\u0435\u0440\u0435\u043c \u043d\u0430\u0448 Subsystem IOnlineSubsystem* const OnlineSub = IOnlineSubsystem::Get(); if (OnlineSub) { \/\/ \u0421\u043d\u043e\u0432\u0430 \u043f\u0440\u043e\u0441\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0435\u0441\u0441\u0438\u0438. IOnlineSessionPtr Sessions = OnlineSub->GetSessionInterface(); if (Sessions.IsValid()) {       \/\/\u0427\u0438\u0441\u0442\u0438\u043c \u0434\u0435\u043b\u0435\u0433\u0430\u0442 Sessions->ClearOnFindSessionsCompleteDelegate_Handle(OnFindSessionsCompleteDelegateHandle); \/\/ \u0415\u0441\u043b\u0438 \u043a\u043e\u043b-\u0432\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u0439 \u043d\u0435 \u043d\u0443\u043b\u044c if (SearchSettings->SearchResults.Num() > 0) {         \/\/\u0412 \u0446\u0435\u043b\u044f\u0445 \u0434\u0435\u0431\u0430\u0433\u0430 \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u0430\u0439\u0434\u0435\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438. for (int32 SearchIdx = 0; SearchIdx &lt; SearchSettings->SearchResults.Num(); SearchIdx++) { \/\/\u041a\u0430\u043a \u0443\u0436\u0435 \u043e\u0442\u043c\u0435\u0447\u0430\u043b\u043e\u0441\u044c, SearchSettings \u0445\u0440\u0430\u043d\u0438\u0442 \u0438\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0430\u0439\u0434\u0435\u043d\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u044f\u0445           \/\/\u041f\u0440\u043e\u0441\u0438\u043c \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u0430\u043c \u0438\u043c\u044f \u0432\u0441\u0435\u0445 \u043d\u0430\u0439\u0434\u0435\u043d\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u0439: GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Red, FString::Printf(TEXT(\"Session Number: %d | Sessionname: %s \"), SearchIdx + 1, *(SearchSettings->SearchResults[SearchIdx].Session.OwningUserName))); } } } } }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0438\u0441\u043a \u043e\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f, \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u043e\u0432\u0435\u0441\u0442\u0438\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430 \u043e\u0431 \u044d\u0442\u043e\u043c, \u0443\u0431\u0440\u0430\u0432 \u044d\u043a\u0440\u0430\u043d \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u043b\u043e\u0433\u043e\u0442\u0438\u043f, \u0437\u0430\u0441\u043f\u0430\u0432\u043d\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u0432\u043e\u0434 \u0434\u0435\u0431\u0430\u0433\u0430 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0441\u043a\u0430\u0436\u0443\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c.<\/p>\n<ol start=\"2\">\n<li>\n<p>\u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"cpp\">bool ACPP_GameSession::JoinSession(TSharedPtr&lt;const FUniqueNetId> UserId, FName InSessionName, const FOnlineSessionSearchResult&amp; SearchResult) { bool bSuccessful = false;  IOnlineSubsystem* OnlineSub = IOnlineSubsystem::Get();      if (OnlineSub) { \/\/\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043d\u0430\u0448\u0435\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0441\u0435\u0441\u0441\u0438\u0438 IOnlineSessionPtr Sessions = OnlineSub->GetSessionInterface();      if (Sessions.IsValid() &amp;&amp; UserId.IsValid()) { \/\/\u0412\u0441\u0435 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 - \u043f\u0440\u043e\u0441\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0441\u044f \u043a \u0441\u0435\u0441\u0441\u0438\u0438 \u0438 \u0436\u0434\u0435\u043c, \/\/\u043f\u043e\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u043a \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0443 OnJoinSessionCompleteDelegate OnJoinSessionCompleteDelegateHandle = Sessions->AddOnJoinSessionCompleteDelegate_Handle(OnJoinSessionCompleteDelegate); bSuccessful = Sessions->JoinSession(*UserId, InSessionName, SearchResult); } } return bSuccessful; }<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0432\u044b\u0437\u043e\u0432 \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u0430:<\/p>\n<pre><code class=\"cpp\">void<\/code><\/pre>\n<\/div>\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-326876","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/326876","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=326876"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/326876\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=326876"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=326876"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=326876"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}