{"id":339055,"date":"2022-09-29T21:00:16","date_gmt":"2022-09-29T21:00:16","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=339055"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=339055","title":{"rendered":"<span>Unreal Engine: Unreal header tool \u0438 \u0420\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044f \u0432 \u0434\u0435\u0442\u0430\u043b\u044f\u0445<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435  <\/h2>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442 \u0425\u0430\u0431\u0440!<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 UHT \u0438 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044f \u0432 Unreal Engine.<\/p>\n<p>\u0422\u043e\u0447\u043d\u0435\u0435:<\/p>\n<ul>\n<li>\n<p>\u041a\u0430\u043a \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f .generated.h \u0438 .gen.cpp.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u043a\u043e\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043e\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0420\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a UHT \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b, \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u0438, \u043f\u0430\u043a\u0435\u0442\u044b, \u0444\u0430\u0439\u043b\u044b \u0432 \u043d\u0438\u0445.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043b\u0430\u0441\u0441\u044b \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0437\u0430\u0442\u0440\u043e\u043d\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e\u0432\u0438\u0447\u043a\u0430\u043c, \u043f\u043e\u043b\u0430\u0433\u0430\u044e, \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043c\u0430\u043b\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430, \u0442.\u043a \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u0438 \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445. <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0447\u044c \u0432\u0441\u0435\u043c \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0448\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0432\u0438\u0436\u043a\u0435 \u0438 \u0441\u043c\u043e\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u043c \u043b\u0438\u0447\u043d\u043e. <strong>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0441\u0430\u043c\u0438\u043c, \u043e\u0431\u0440\u0430\u0449\u0430\u044f \u043e\u0441\u043e\u0431\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u0435 \u0432\u0435\u0449\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0431\u0443\u0434\u0443 \u0437\u0434\u0435\u0441\u044c \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c.<\/strong><\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u044f \u043b\u0438\u0448\u044c \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043d\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0439 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u0432 \u0434\u0432\u0438\u0436\u043a\u0435, \u0435\u0433\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440. \u042f \u043b\u0438\u0448\u044c \u043f\u044b\u0442\u0430\u044e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438. \u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u0431\u044b \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0438\u0441\u044c \u0432\u044b. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043a\u0430\u043a \u0431\u044b \u044f \u043d\u0435 \u043f\u044b\u0442\u0430\u043b\u0441\u044f, \u043c\u043e\u0433 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430.<\/p>\n<p>\u041f\u043e\u0441\u0435\u043c\u0443, \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u0439\u0434\u0435\u0442\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043a\u0430\u043a\u0438\u0435 \u0431\u044b \u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e \u043d\u0435\u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u043a\u0438, \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0438, \u043f\u0440\u043e\u0431\u0435\u043b\u044b \u0438\u043b\u0438 \u043e\u0442\u043a\u0440\u043e\u0432\u0435\u043d\u043d\u044b\u0439 \u0431\u0440\u0435\u0434: \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0438\u0448\u0438\u0442\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445. \u042f \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0442\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043c\u043e\u0433\u0443.  <\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043f\u0430\u0441\u0438\u0431\u043e:<\/p>\n<div class=\"persona\" persona=\"true\"><img persona=\"true\" class=\"image persona__image\"\/><\/p>\n<h5 class=\"persona__heading\" persona=\"true\">\u0422\u0438\u043c\u043e\u0444\u0435\u0439 \u0411\u0435\u043b\u043e\u0432<\/h5>\n<p>\u0417\u0430 \u043d\u0435\u043e\u0446\u0435\u043d\u0438\u043c\u0443\u044e \u043f\u043e\u043c\u043e\u0449\u044c \u0432 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u0446\u0438\u0438.<a href=\"https:\/\/habr.com\/en\/users\/Signer\/\" rel=\"noopener noreferrer nofollow\"><br \/>habr.com\/en\/users\/Signer\/<\/a> <\/p>\n<\/div>\n<div class=\"persona\" persona=\"true\"><img persona=\"true\" class=\"image persona__image\"\/><\/p>\n<h5 class=\"persona__heading\" persona=\"true\">\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0428\u0443\u043c\u0435\u0439\u043a\u043e<\/h5>\n<p>\u0417\u0430 \u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u0446\u0438\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f.<br \/><a href=\"https:\/\/www.linkedin.com\/in\/forrgit\/\" rel=\"noopener noreferrer nofollow\">www.linkedin.com\/in\/forrgit\/<\/a><\/p>\n<\/div>\n<p>\u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f!<\/p>\n<hr\/>\n<h2>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c.<\/h2>\n<p>\u0427\u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0430\u043c UHT?<\/p>\n<p>Unreal Headder Tool &#8212; \u043f\u0430\u0440\u0441\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 UObject \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0432\u0435\u0449\u0438, \u043a\u0430\u043a \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044f \u0432 Unreal Engine.<\/p>\n<p>\u0421\u0443\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0430: \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0435\u0439 \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f UHT, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u0432\u0430\u0448\u0438\u043c \u0444\u0430\u0439\u043b\u0430\u043c \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u043e\u0432\u044b\u0435: <code>.generated.h<\/code> \u0438 .<code>gen.cpp<\/code> . <\/p>\n<p>\u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441, \u0442\u043e \u0442\u0430\u043c \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438. \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441 move-\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u043e\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 private \u043f\u043e\u043b\u044f. \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <code>DECLARE_CLASS<\/code>  \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 static \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0440. <\/p>\n<p>\u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u0442\u043e \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043d\u0435\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435; <code>StaticStruct<\/code>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u043f\u0440.<\/p>\n<p>\u0418 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u043e <code>GENERATED_BODY<\/code> \u0432 \u0432\u0430\u0448\u0438\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u0445.<\/p>\n<h2>\u0413\u043b\u0430\u0432\u0430 1. \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438.<\/h2>\n<p>\u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430 \u0442\u0435 \u0444\u0430\u0439\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043a \u043d\u0430\u0448\u0438\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u0430\u043c. <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">#pragma once #include \"TestStruct.generated.h\"  USTRUCT() struct FMyStruct { GENERATED_BODY() };<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0430 \u0444\u0430\u0439\u043b\u0430 .generated.h \u0438 .gen.cpp<\/p>\n<pre><code class=\"cpp\">\/\/TestStruct.generated.h  \/\/ Copyright Epic Games, Inc. All Rights Reserved. \/*=========================================================================== Generated c\/Teode exported from UnrealHeaderTool. DO NOT modify this manually! Edit the corresponding .h files instead! ===========================================================================*\/  #include \"UObject\/ObjectMacros.h\" #include \"UObject\/ScriptMacros.h\"  PRAGMA_DISABLE_DEPRECATION_WARNINGS #ifdef MYPROJECT_TestStruct_generated_h #error \"TestStruct.generated.h already included, missing '#pragma once' in TestStruct.h\" #endif #define MYPROJECT_TestStruct_generated_h  #define FID_MyProject_Source_MyProject_TestStruct_h_7_GENERATED_BODY \\ friend struct Z_Construct_UScriptStruct_FMyStruct_Statics; \\ MYPROJECT_API static class UScriptStruct* StaticStruct();   template&lt;> MYPROJECT_API UScriptStruct* StaticStruct&lt;struct FMyStruct>();  #undef CURRENT_FILE_ID #define CURRENT_FILE_ID FID_MyProject_Source_MyProject_TestStruct_h   PRAGMA_ENABLE_DEPRECATION_WARNINGS <\/code><\/pre>\n<p>\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0435 \u0445\u0435\u0434\u0434\u0435\u0440\u044b \u044d\u0442\u043e <code>\"UObject\/ObjectMacros.h\"<\/code> \u0438 <code>\"UObject\/ScriptMacros.h\"<\/code>  <\/p>\n<h2>1.1 ObjectMacros.h<\/h2>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u043d UF, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043c\u0430\u043a\u0440\u043e\u0441 <code>UFUNCTION()<\/code>  <\/p>\n<pre><code class=\"cpp\">namespace UF {   \/\/ valid keywords for the UFUNCTION and UDELEGATE macros   enum   {      \/\/\/ This function is designed to be overridden by a blueprint.  Do not provide a body for this function;      \/\/\/ the autogenerated code will include a thunk that calls ProcessEvent to execute the overridden body.      BlueprintImplementableEvent,       \/\/\/ This function is designed to be overridden by a blueprint, but also has a native implementation.      \/\/\/ Provide a body named [FunctionName]_Implementation instead of [FunctionName]; the autogenerated      \/\/\/ code will include a thunk that calls the implementation method when necessary.      BlueprintNativeEvent,       \/\/\/ This function is sealed and cannot be overridden in subclasses.      \/\/\/ It is only a valid keyword for events; declare other methods as static or final to indicate that they are sealed.      SealedEvent,       \/\/\/ This function is executable from the command line.      Exec,       \/\/\/ This function is replicated, and executed on servers.  Provide a body named [FunctionName]_Implementation instead of [FunctionName];      \/\/\/ the autogenerated code will include a thunk that calls the implementation method when necessary.      Server,       \/\/\/ This function is replicated, and executed on clients.  Provide a body named [FunctionName]_Implementation instead of [FunctionName];      \/\/\/ the autogenerated code will include a thunk that calls the implementation method when necessary.      Client,       \/\/\/ This function is both executed locally on the server and replicated to all clients, regardless of the Actor's NetOwner      NetMulticast,       \/\/\/ Replication of calls to this function should be done on a reliable channel.      \/\/\/ Only valid when used in conjunction with Client or Server      Reliable,       \/\/\/ Replication of calls to this function can be done on an unreliable channel.      \/\/\/ Only valid when used in conjunction with Client or Server      Unreliable,     ...   } <\/code><\/pre>\n<p>\u041a\u0440\u043e\u043c\u0435 \u043d\u0435\u0433\u043e \u0442\u0430\u043a \u0436\u0435 \u0435\u0441\u0442\u044c UP, \u0433\u0434\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f <code>UPROPERTY():<\/code><\/p>\n<pre><code class=\"cpp\">namespace UP {   \/\/ valid keywords for the UPROPERTY macro   enum   {      \/\/\/ This property is const and should be exported as const.      Const,       \/\/\/ Property should be loaded\/saved to ini file as permanent profile.      Config,       \/\/\/ Same as above but load config from base class, not subclass.      GlobalConfig,       \/\/\/ Property should be loaded as localizable text. Implies ReadOnly.      Localized,       \/\/\/ Property is transient: shouldn't be saved, zero-filled at load time.      Transient,       \/\/\/ Property should always be reset to the default value during any type of duplication (copy\/paste, binary duplication, etc.)      DuplicateTransient,       \/\/\/ Property should always be reset to the default value unless it's being duplicated for a PIE session - deprecated, use NonPIEDuplicateTransient instead      NonPIETransient,       \/\/\/ Property should always be reset to the default value unless it's being duplicated for a PIE session      NonPIEDuplicateTransient,       \/\/\/ Value is copied out after function call. Only valid on function param declaration.      Ref,       \/\/\/ Object property can be exported with it's owner.      Export,       \/\/\/ Hide clear (and browse) button in the editor.      NoClear,   ...  };<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u044f \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443, \u043e\u0434\u043d\u0430\u043a\u043e \u043e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043a\u0440\u043e\u043c\u0435 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u0435\u0449\u0435:<\/p>\n<pre><code class=\"cpp\">namespace US \/\/ USTRUCT() namespace UM \/\/ Metadata \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 USTRUCT,UPROPERTY \u0438 \u043f\u0440 namespace UI \/\/ UINTERFACE() namespace UC \/\/ UCLASS()<\/code><\/pre>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0442\u0430\u043c \u0435\u0441\u0442\u044c ENUM&#8217;\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0444\u043b\u0430\u0433\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0444\u043b\u0430\u0433\u0438 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 <code>Details<\/code> \u043f\u043e\u0434 \u043f\u043e\u043b\u0435\u043c <code>Defined Property Flags:<\/code><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b05\/550\/f49\/b05550f491be61db27ac6bbe3e93b1ae.png\" width=\"1574\" height=\"1447\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b05\/550\/f49\/b05550f491be61db27ac6bbe3e93b1ae.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043b\u0438 \u0432 \u043a\u043e\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0444\u043b\u0430\u0433\u043e\u0432.  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5d6\/033\/6b0\/5d60336b0ea5a59091be53abd2f9631e.png\" width=\"1579\" height=\"1595\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5d6\/033\/6b0\/5d60336b0ea5a59091be53abd2f9631e.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0430\u043c\u0438 \u0444\u043b\u0430\u0433\u0438 \u0443\u0447\u0430\u0432\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u0434\u0432\u0438\u0436\u043a\u0430 . \u0422\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u043b\u0430\u0433 CPF_SaveGame \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 \u0434\u043b\u044f \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445:\u200b  <\/p>\n<pre><code class=\"cpp\">bool FProperty::ShouldSerializeValue( FArchive&amp; Ar ) const { if (Ar.ShouldSkipProperty(this)) { return false; }     \/\/\u0427\u0435\u0440\u0435\u0437 \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 PropertyFlags. if (!(PropertyFlags &amp; CPF_SaveGame) &amp;&amp; Ar.IsSaveGame()) { return false; }  const uint64 SkipFlags = CPF_Transient | CPF_DuplicateTransient | CPF_NonPIEDuplicateTransient | CPF_NonTransactional | CPF_Deprecated | CPF_DevelopmentAssets | CPF_SkipSerialization; if (!(PropertyFlags &amp; SkipFlags)) { return true; }  bool Skip = ((PropertyFlags &amp; CPF_Transient) &amp;&amp; Ar.IsPersistent() &amp;&amp; !Ar.IsSerializingDefaults()) ||((PropertyFlags &amp; CPF_DuplicateTransient) &amp;&amp; (Ar.GetPortFlags() &amp; PPF_Duplicate)) ||((PropertyFlags &amp; CPF_NonPIEDuplicateTransient) &amp;&amp; !(Ar.GetPortFlags() &amp; PPF_DuplicateForPIE) &amp;&amp; (Ar.GetPortFlags() &amp; PPF_Duplicate)) ||((PropertyFlags &amp; CPF_NonTransactional) &amp;&amp; Ar.IsTransacting()) ||((PropertyFlags &amp; CPF_Deprecated) &amp;&amp; !Ar.HasAllPortFlags(PPF_UseDeprecatedProperties) &amp;&amp; (Ar.IsSaving() || Ar.IsTransacting() || Ar.WantBinaryPropertySerialization())) ||  ((PropertyFlags &amp; CPF_SkipSerialization) &amp;&amp; (Ar.WantBinaryPropertySerialization() || !Ar.HasAllPortFlags(PPF_ForceTaggedSerialization))) ||  (IsEditorOnlyProperty() &amp;&amp; Ar.IsFilterEditorOnly());  return !Skip; }<\/code><\/pre>\n<p>\u041d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>FProperty<\/code>. \u041c\u044b \u043a \u043d\u0435\u0439 \u0435\u0449\u0435 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f.<\/p>\n<p>\u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u043f\u0430\u0440\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u0442\u0438\u043c\u0438 \u0444\u043b\u0430\u0433\u0430\u043c\u0438:<\/p>\n<p>\u0412 UHT \u043f\u0430\u0440\u0441\u0435\u0440\u0435 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0430\u044f \u0442\u0438\u043f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 out-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440.<\/p>\n<pre><code class=\"cpp\">void FHeaderParser::GetVarType(   FScope*                         Scope,   EGetVarTypeOptions          Options,   FPropertyBase&amp;                  VarProperty,   EPropertyFlags                  Disallow,   EUHTPropertyType            OuterPropertyType,   EPropertyFlags             OuterPropertyFlags,   EPropertyDeclarationStyle::Type PropertyDeclarationStyle,   EVariableCategory               VariableCategory,   FIndexRange*                    ParsedVarIndexRange,   ELayoutMacroType*               OutLayoutMacroType )<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0430\u043c\u043e\u0439 \u0441\u0435\u0431\u044f, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e, \u0438 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0441\u0430\u043c\u043e \u0437\u0430 \u0441\u0435\u0431\u044f:   <\/p>\n<pre><code class=\"cpp\">FUnrealFunctionDefinitionInfo&amp; FHeaderParser::CompileDelegateDeclaration(const FStringView&amp; DelegateIdentifier, EDelegateSpecifierAction::Type SpecifierAction)  void FHeaderParser::ParseParameterList(FUnrealFunctionDefinitionInfo&amp; FunctionDef, bool bExpectCommaBeforeName, TMap&lt;FName, FString>* MetaData, EGetVarTypeOptions Options)  FUnrealFunctionDefinitionInfo&amp; FHeaderParser::CompileFunctionDeclaration()  void FHeaderParser::CompileVariableDeclaration(FUnrealStructDefinitionInfo&amp; StructDef)<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0441\u0430\u043c\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>GetVarType<\/code>, \u0442\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0434\u043b\u044f \u043d\u0430\u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0442\u0438\u043f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 TMap, \u0442\u043e \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0438\u043f \u0435\u0435 \u043a\u043b\u044e\u0447\u0430, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u044f <code>GetVarType()<\/code>, \u0435\u0441\u043b\u0438 \u0442\u0438\u043f &#8212; \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0442\u043e \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443, \u0442.\u043a \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0438\u0436\u043a\u043e\u043c, \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0438 \u0434\u043b\u044f <code>UINTERFACE<\/code>, <code>TEXT<\/code>, \u0438 \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0440\u0435\u043f\u043b\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0412\u0430\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0432\u0435\u0437\u0434\u0435 \u0442\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0444\u043b\u0430\u0433\u0438 \u0438\u0437 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435 <code>ENUM'a<\/code>: <code>CPT_Text,CPF_Net,CPT_Interface<\/code>    <\/p>\n<pre><code class=\"cpp\">...   \/\/\u0415\u0441\u043b\u0438 TMap else if ( VarType.IsValue(TEXT(\"TMap\"), ESearchCase::CaseSensitive) ) {   RequireSymbol( TEXT('&lt;'), TEXT(\"'tmap'\") );   FPropertyBase MapKeyType(CPT_None);   \/\/\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0444\u043b\u0430\u0433\u0438 \u0443\u0436\u0435 TMap   GetVarType(Scope, Options, MapKeyType, Disallow, EUHTPropertyType::Map, Flags, EPropertyDeclarationStyle::None, VariableCategory);   if (MapKeyType.IsContainer()) \/\/ \u0435\u0441\u043b\u0438 \u043a\u043b\u044e\u0447 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c, \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c Error.   {      Throwf(TEXT(\"Nested containers are not supported.\") );   }   \/\/ TODO: Prevent sparse delegate types from being used in a container      \/\/\u0415\u0441\u043b\u0438 \u0442\u0438\u043f \u043a\u043b\u044e\u0447\u0430 \u043d\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 - \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c Error   if (MapKeyType.Type == CPT_Interface)   {      Throwf(TEXT(\"UINTERFACEs are not currently supported as key types.\"));   }      if (MapKeyType.Type == CPT_Text)   {      Throwf(TEXT(\"FText is not currently supported as a key type.\"));   }    \/\/\u0418 \u0435\u0441\u043b\u0438 TMap \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0440\u0435\u043f\u043b\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c Error.   if (EnumHasAnyFlags(Flags, CPF_Net))   {      LogError(TEXT(\"Replicated maps are not supported.\"));   } ...<\/code><\/pre>\n<p>\u0421\u0430\u043c\u0438 \u0444\u043b\u0430\u0433\u0438 \u0441\u0442\u0430\u0432\u044f\u0442\u0441\u044f \u043f\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0435.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043f\u0430\u0440\u0441\u0435\u0440 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e const \u0443 \u043f\u043e\u043b\u044f, \u0442\u043e \u0432\u043e \u0444\u043b\u0430\u0433 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u043e\u0435 \u0418\u041b\u0418:<\/p>\n<pre><code class=\"cpp\">... \/\/ const before the variable type support (only for params) if (MatchIdentifier(TEXT(\"const\"), ESearchCase::CaseSensitive)) {   Flags |= CPF_ConstParm;   bNativeConst = true; } ...<\/code><\/pre>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043a\u0441\u0442\u0430\u0442\u0438, \u0447\u0442\u043e \u0441\u0430\u043c \u0442\u0438\u043f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>Flags<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u0447\u0435\u0440\u0435\u0437 \u043c\u0430\u043a\u0440\u043e\u0441 <code>ENUM_CLASS_FLAGS(EPropertyFlags)<\/code> \u0433\u0434\u0435 \u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>|=<\/code> , \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438 <code>Flags |= CPF_ConstParm;<\/code>  <\/p>\n<pre><code class=\"cpp\">\/\/ Defines all bitwise operators for enum classes so it can be (mostly) used as a regular flags enum #define ENUM_CLASS_FLAGS(Enum) \\   inline           Enum&amp; operator|=(Enum&amp; Lhs, Enum Rhs) { return Lhs = (Enum)((__underlying_type(Enum))Lhs | (__underlying_type(Enum))Rhs); } \\   inline           Enum&amp; operator&amp;=(Enum&amp; Lhs, Enum Rhs) { return Lhs = (Enum)((__underlying_type(Enum))Lhs &amp; (__underlying_type(Enum))Rhs); } \\   inline           Enum&amp; operator^=(Enum&amp; Lhs, Enum Rhs) { return Lhs = (Enum)((__underlying_type(Enum))Lhs ^ (__underlying_type(Enum))Rhs); } \\   inline constexpr Enum  operator| (Enum  Lhs, Enum Rhs) { return (Enum)((__underlying_type(Enum))Lhs | (__underlying_type(Enum))Rhs); } \\   inline constexpr Enum  operator&amp; (Enum  Lhs, Enum Rhs) { return (Enum)((__underlying_type(Enum))Lhs &amp; (__underlying_type(Enum))Rhs); } \\   inline constexpr Enum  operator^ (Enum  Lhs, Enum Rhs) { return (Enum)((__underlying_type(Enum))Lhs ^ (__underlying_type(Enum))Rhs); } \\   inline constexpr bool  operator! (Enum  E)             { return !(__underlying_type(Enum))E; } \\   inline constexpr Enum  operator~ (Enum  E)             { return (Enum)~(__underlying_type(Enum))E; }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e Flags \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043c\u043e\u0433 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u043f\u0430\u0440\u0441\u0435\u0440. \u0412\u0435\u0441\u044c \u043f\u043e\u0438\u0441\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e.  <\/p>\n<p>\u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0442\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u0442\u0430\u043c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 <code>UFUNCTION<\/code>,<code>UPROPERTY<\/code> \u0438 \u043f.\u0440.<\/p>\n<pre><code class=\"cpp\">\/\/ These macros wrap metadata parsed by the Unreal Header Tool, and are otherwise \/\/ ignored when code containing them is compiled by the C++ compiler #define UPROPERTY(...) #define UFUNCTION(...) #define USTRUCT(...) #define UMETA(...) #define UPARAM(...) #define UENUM(...) #define UDELEGATE(...) #define RIGVM_METHOD(...)<\/code><\/pre>\n<h2>1.2 ScriptMacros.h  <\/h2>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0445\u0435\u0434\u0434\u0435\u0440 \u044d\u0442\u043e <code>\"UObject\/ScriptMacros.h\"<\/code>.<\/p>\n<p>\u0412\u0432\u0435\u0440\u0445\u0443 \u0445\u0435\u0434\u0434\u0435\u0440\u0430 \u0441\u0440\u0430\u0437\u0443 \u0434\u0430\u044e\u0442 \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code>\/*=============================================================================   ScriptMacros.h: Kismet VM execution engine. =============================================================================*\/ ...<\/code><\/pre>\n<p>\u041f\u043e \u0444\u0430\u043a\u0442\u0443, \u0432 \u044d\u0442\u043e\u043c \u0445\u0435\u0434\u0434\u0435\u0440\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u044b \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b.<\/p>\n<pre><code class=\"cpp\">... #define P_GET_PROPERTY_REF(PropertyType, ParamName)                                     \\   PropertyType::TCppType ParamName##Temp = PropertyType::GetDefaultPropertyValue();        \\   PropertyType::TCppType&amp; ParamName = Stack.StepCompiledInRef&lt;PropertyType, PropertyType::TCppType>(&amp;ParamName##Temp);    #define P_GET_UBOOL(ParamName)                uint32 ParamName##32 = 0; bool ParamName=false;    Stack.StepCompiledIn&lt;FBoolProperty>(&amp;ParamName##32); ParamName = !!ParamName##32; \/\/ translate the bitfield into a bool type for non-intel platforms #define P_GET_UBOOL8(ParamName)                   uint32 ParamName##32 = 0; uint8 ParamName=0;    Stack.StepCompiledIn&lt;FBoolProperty>(&amp;ParamName##32); ParamName = ParamName##32 ? 1 : 0; \/\/ translate the bitfield into a bool type for non-intel platforms #define P_GET_UBOOL16(ParamName)               uint32 ParamName##32 = 0; uint16 ParamName=0;   Stack.StepCompiledIn&lt;FBoolProperty>(&amp;ParamName##32); ParamName = ParamName##32 ? 1 : 0; \/\/ translate the bitfield into a bool type for non-intel platforms #define P_GET_UBOOL32(ParamName)               uint32 ParamName=0;                             Stack.StepCompiledIn&lt;FBoolProperty>(&amp;ParamName); ParamName = ParamName ? 1 : 0; \/\/ translate the bitfield into a bool type for non-intel platforms #define P_GET_UBOOL64(ParamName)               uint64 ParamName=0;                             Stack.StepCompiledIn&lt;FBoolProperty>(&amp;ParamName); ParamName = ParamName ? 1 : 0; \/\/ translate the bitfield into a bool type for non-intel platforms #define P_GET_UBOOL_REF(ParamName)             PARAM_PASSED_BY_REF_ZEROED(ParamName, FBoolProperty, bool)  #define P_GET_STRUCT(StructType,ParamName)       PARAM_PASSED_BY_VAL(ParamName, FStructProperty, PREPROCESSOR_COMMA_SEPARATED(StructType)) #define P_GET_STRUCT_REF(StructType,ParamName)    PARAM_PASSED_BY_REF(ParamName, FStructProperty, PREPROCESSOR_COMMA_SEPARATED(StructType))  #define P_GET_OBJECT(ObjectType,ParamName)       PARAM_PASSED_BY_VAL_ZEROED(ParamName, FObjectPropertyBase, ObjectType*) #define P_GET_OBJECT_REF(ObjectType,ParamName)    PARAM_PASSED_BY_REF_ZEROED(ParamName, FObjectPropertyBase, ObjectType*) ...<\/code><\/pre>\n<p>\u0412\u0430\u0436\u043d\u043e\u0439 \u0434\u043b\u044f \u043d\u0430\u0441 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0430\u044f \u0432\u0435\u0449\u044c, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043b\u0443\u0447\u0448\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0443 VM, \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f Stack, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0430\u0436\u0435 \u0432 \u0441\u0430\u043c\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u0445 \u0432\u0440\u043e\u0434\u0435:  <\/p>\n<pre><code class=\"cpp\">#define P_GET_UBOOL(ParamName)  uint32 ParamName##32 = 0; bool ParamName=false;    Stack.StepCompiledIn&lt;FBoolProperty>(&amp;ParamName##32); ParamName = !!ParamName##32; \/\/ translate the bitfield into a bool type for non-intel platforms<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0442\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u0430\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u0430\u043a \u00a0<\/p>\n<p><code>struct FFrame : public FOutputDevice<\/code>  \u0432 <code>Stack.h<\/code><\/p>\n<pre><code class=\"cpp\">struct FFrame : public FOutputDevice {  public:   \/\/ Variables.   UFunction* Node;   UObject* Object;   uint8* Code;   uint8* Locals;    FProperty* MostRecentProperty;   uint8* MostRecentPropertyAddress;    \/** The execution flow stack for compiled Kismet code *\/   FlowStackType FlowStack;    \/** Previous frame on the stack *\/   FFrame* PreviousFrame;    \/** contains information on any out parameters *\/   FOutParmRec* OutParms;    \/** If a class is compiled in then this is set to the property chain for compiled-in functions. In that case, we follow the links to setup the args instead of executing by code. *\/   FField* PropertyChainForCompiledIn;    \/** Currently executed native function *\/   UFunction* CurrentNativeFunction;    bool bArrayContextFailed;  #if PER_FUNCTION_SCRIPT_STATS   \/** Increment for each PreviousFrame on the stack (Max 255) *\/   uint8 DepthCounter; #endif public: ...<\/code><\/pre>\n<p>\u041a\u0430\u043a \u044f\u0441\u043d\u043e \u0438\u0437 \u043f\u043e\u043b\u0435\u0439, \u0438 \u043a\u0430\u043a \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0434\u0430\u043b\u0435\u0435, \u044d\u0442\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a execution-frame:<\/p>\n<p>\u0421\u0442\u044d\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0445 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0434, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0442.\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0438\u0437 \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u0442.\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u0443\u043a\u043d\u0446\u0438\u0438 \u0438 \u043f\u0440.<\/p>\n<p>\u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043e\u0434\u0438\u043d \u0438\u0437 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u0442\u044d\u043a\u0430 \u043a\u0430\u0434\u0440\u043e\u0432:<\/p>\n<pre><code class=\"cpp\"> #define P_GET_PROPERTY(PropertyType, ParamName)\\ PropertyType::TCppType ParamName = PropertyType::GetDefaultPropertyValue();\\ Stack.StepCompiledIn&lt;PropertyType>(&amp;ParamName);<\/code><\/pre>\n<h2>1.3 \u0421\u0443\u0449\u043d\u043e\u0441\u0442\u0438.<\/h2>\n<h4>1.3.1. UFunction.<\/h4>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 <code>UFunction<\/code>:<\/p>\n<pre><code class=\"cpp\">\/\/ \/\/ Reflection data for a replicated or Kismet callable function. \/\/ class COREUOBJECT_API UFunction : public UStruct {   DECLARE_CASTED_CLASS_INTRINSIC(UFunction, UStruct, 0, TEXT(\"\/Script\/CoreUObject\"), CASTCLASS_UFunction)   DECLARE_WITHIN(UClass) public:   \/\/ Persistent variables.    \/** EFunctionFlags set defined for this function *\/   EFunctionFlags FunctionFlags;    \/\/ Variables in memory only.     \/** Number of parameters total *\/   uint8 NumParms;   \/** Total size of parameters in memory *\/   uint16 ParmsSize;   \/** Memory offset of return value property *\/   uint16 ReturnValueOffset;   \/** Id of this RPC function call (must be FUNC_Net &amp; (FUNC_NetService|FUNC_NetResponse)) *\/   uint16 RPCId;   \/** Id of the corresponding response call (must be FUNC_Net &amp; FUNC_NetService) *\/   uint16 RPCResponseId;    \/** pointer to first local struct property in this UFunction that contains defaults *\/   FProperty* FirstPropertyToInit;  #if UE_BLUEPRINT_EVENTGRAPH_FASTCALLS   \/** The event graph this function calls in to (persistent) *\/   UFunction* EventGraphFunction;    \/** The state offset inside of the event graph (persistent) *\/   int32 EventGraphCallOffset; #endif  #if WITH_LIVE_CODING \/** Pointer to the cached singleton pointer to this instance *\/ UFunction** SingletonPtr; #endif  private: \/** C++ function this is bound to *\/ FNativeFuncPtr Func; ... <\/code><\/pre>\n<p>\u0412 \u043d\u0435\u043c \u0432\u0438\u0434\u0438\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430: \u043a\u043e\u043b-\u0432\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 <code>NumParms,<\/code> \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0441\u0435\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 <code>ParmsSize.<\/code><\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0443 \u043d\u0435\u0435 \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c <code>SetNativeFunc<\/code>;<\/p>\n<pre><code class=\"cpp\">\/** * Sets the native func pointer. * * @param InFunc - The new function pointer. *\/ FORCEINLINE void SetNativeFunc(FNativeFuncPtr InFunc)  {   Func = InFunc; }<\/code><\/pre>\n<p>\u041a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f\u0432\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e UFunction \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u043b\u0438 \u0432\u044b\u0437\u043e\u0432\u0430 \u0438\u0437 Blueprint, \u0438 \u043e\u043d \u0432\u0441\u0435\u0433\u043e \u043d\u0430\u0432\u0441\u0435\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043d\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432\u044b\u0437\u0432\u0430\u043d\u0430. \u0415\u0441\u0442\u044c \u0442\u0430\u043a \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0413\u0440\u0430\u0444\u0435 \u0441\u0430\u043c\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430.<\/p>\n<p>\u0418 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0447\u0442\u043e \u043d\u0430\u0441 \u0442\u0443\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442, \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>Invoke<\/code> , \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0432\u044b\u0448\u0435 \u043e\u0437\u0432\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u044d\u043a \u0438 out \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 \u043c\u0430\u043a\u0440\u043e\u0441 <code>RESULT_DECL.<\/code><\/p>\n<pre><code class=\"cpp\">    \/**  * Invokes the UFunction on a UObject.  *  * @param Obj    - The object to invoke the function on.  * @param Stack  - The parameter stack for the function call.  * @param Result - The result of the function.  *\/ void Invoke(UObject* Obj, FFrame&amp; Stack, RESULT_DECL);<\/code><\/pre>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438\u0438 \u043d\u0435\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u0446\u0438\u044e, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0430\u043c \u0432\u044b\u0437\u043e\u0432 \u0441 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435\u043c \u043a \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435, \u043a \u0435\u0435 wraper&#8217;\u0443:<\/p>\n<pre><code class=\"cpp\">void UFunction::Invoke(UObject* Obj, FFrame&amp; Stack, RESULT_DECL) { checkSlow(Func);  UClass* OuterClass = (UClass*)GetOuter(); if (OuterClass->IsChildOf(UInterface::StaticClass())) { Obj = (UObject*)Obj->GetInterfaceAddress(OuterClass); }  TGuardValue&lt;UFunction*> NativeFuncGuard(Stack.CurrentNativeFunction, this); return (*Func)(Obj, Stack, RESULT_PARAM); }<\/code><\/pre>\n<pre><code class=\"cpp\">\/** The type of a native function callable by script *\/ typedef void (*FNativeFuncPtr)(UObject* Context, FFrame&amp; TheStack, RESULT_DECL);<\/code><\/pre>\n<h3>1.3.2. UField.<\/h3>\n<pre><code class=\"cpp\"> \/\/ \/\/ Base class of reflection data objects. \/\/ class COREUOBJECT_API UField : public UObject { DECLARE_CASTED_CLASS_INTRINSIC(UField, UObject, CLASS_Abstract, TEXT(\"\/Script\/CoreUObject\"), CASTCLASS_UField)  typedef UField BaseFieldClass; typedef UClass FieldTypeClass;  \/** Next Field in the linked list *\/ UField*Next;  \/\/ Constructors. UField(EStaticConstructor, EObjectFlags InFlags);  \/\/ UObject interface. virtual void Serialize( FArchive&amp; Ar ) override; virtual void PostLoad() override; virtual bool NeedsLoadForClient() const override; virtual bool NeedsLoadForServer() const override; ... }; <\/code><\/pre>\n<p>\u0420\u0435\u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u041f\u043e\u043b\u044f \u0442\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u043e\u0433\u043e \u0432 \u0434\u0432\u0438\u0436\u043a\u0435. \u0421\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435, \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 forward list, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043f\u043e\u043b\u0435:  <\/p>\n<pre><code class=\"cpp\">\/** Next Field in the linked list *\/ UField*          Next;<\/code><\/pre>\n<p><code>UField<\/code>, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0443\u043c\u0435\u0435\u0442 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0438 \u0438\u043c\u0435\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">... FText UField::GetDisplayNameText() const {   FText LocalizedDisplayName;    static const FString Namespace = TEXT(\"UObjectDisplayNames\");   static const FName NAME_DisplayName(TEXT(\"DisplayName\"));    const FString Key = GetFullGroupName(false);    FString NativeDisplayName = GetMetaData(NAME_DisplayName);   if (NativeDisplayName.IsEmpty())   {      NativeDisplayName = FName::NameToDisplayString(FDisplayNameHelper::Get(*this), false);   }    if ( !( FText::FindText( Namespace, Key, \/*OUT*\/LocalizedDisplayName, &amp;NativeDisplayName ) ) )   {      LocalizedDisplayName = FText::FromString(NativeDisplayName );   }    return LocalizedDisplayName; }  ...  \/\/ UField interface. virtual void AddCppProperty(FProperty* Property); virtual void Bind(); ...  \/\/\u0423 \u043f\u043e\u043b\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043d\u0435\u0442. void UField::AddCppProperty(FProperty* Property) { UE_LOG(LogClass, Fatal,TEXT(\"UField::AddCppProperty\")); } <\/code><\/pre>\n<h4>1.3.3 UStruct<\/h4>\n<p>\u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u044d\u0442\u043e <code>UField<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 <code>(X)Field<\/code>.<\/p>\n<p>\u041f\u043e\u043b\u0435\u0439 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0430\u0440\u0430:<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <code>UFiled<\/code> \u0438 \u0432\u0442\u043e\u0440\u043e\u0439 &#8212; \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <code>FField<\/code>.<\/p>\n<p><code>UField<\/code> \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435, \u044d\u0442\u043e \u043b\u0435\u0433\u0430\u0441\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0435\u0449\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0442\u0430\u0440\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0443\u043a\u0430\u0437\u0430\u043b \u0432\u044b\u0448\u0435.<\/p>\n<pre><code class=\"cpp\">\/** Pointer to start of linked list of child fields *\/ UField* Children;  \/** Pointer to start of linked list of child fields *\/ FField* ChildProperties;<\/code><\/pre>\n<p>\u0421\u0430\u043c <code>FField<\/code> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e <code>UField<\/code>:<\/p>\n<pre><code class=\"cpp\">\/\/ Constructors. FField(EInternal InInernal, FFieldClass* InClass); FField(FFieldVariant InOwner, const FName&amp; InName, EObjectFlags InObjectFlags); \/** Creates a new FField from existing UField *\/ static FField* CreateFromUField(UField* InField);<\/code><\/pre>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0443 <code>UStruct<\/code> \u0435\u0441\u0442\u044c \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 (<code>FProperty)<\/code><\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0447\u0435\u0442\u044b\u0440\u044c\u043c\u044f \u043f\u043e\u043b\u044f\u043c\u0438: <\/p>\n<pre><code class=\"cpp\">\/** In memory only: Linked list of properties from most-derived to base *\/ FProperty* PropertyLink; \/** In memory only: Linked list of object reference properties from most-derived to base *\/ FProperty* RefLink; \/** In memory only: Linked list of properties requiring destruction. Note this does not include things that will be destroyed byt he native destructor *\/ FProperty* DestructorLink; \/** In memory only: Linked list of properties requiring post constructor initialization *\/ FProperty* PostConstructLink;<\/code><\/pre>\n<p>\u041a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u043b\u0435 \u043d\u0435\u0441\u0435\u0442 \u0441\u0432\u043e\u044e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043a\u0430\u043a \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0434\u043d\u043e \u0438\u0437 \u043d\u0438\u0445, \u044d\u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430:<\/p>\n<pre><code class=\"cpp\">\/** In memory only: Linked list of properties requiring post constructor initialization *\/ FProperty* PostConstructLink;<\/code><\/pre>\n<p>\u0418\u043b\u0438, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430:<\/p>\n<pre><code class=\"cpp\">\/** In memory only: Linked list of properties requiring destruction. Note this does not include things that will be destroyed byt he native destructor *\/ FProperty* DestructorLink;<\/code><\/pre>\n<p>\u0418\u043b\u0438 \u0432\u043e\u0432\u0441\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0432\u0441\u0435\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432:<\/p>\n<pre><code class=\"cpp\">\/** In memory only: Linked list of properties from most-derived to base *\/ FProperty* PropertyLink;<\/code><\/pre>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430:<\/p>\n<pre><code class=\"cpp\">\/\/ UField interface. virtual void AddCppProperty(FProperty* Property) override;<\/code><\/pre>\n<p>\u0413\u0434\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 <code>FProperty<\/code> \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a <code>PropertyLink.<\/code><\/p>\n<pre><code class=\"cpp\">void UStruct::AddCppProperty(FProperty* Property) {   Property->Next = ChildProperties;   ChildProperties = Property; } <\/code><\/pre>\n<p>\u0418, \u043a\u0430\u043a \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0443 \u0432\u0441\u0435\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0444\u043b\u0430\u0433\u0438:&#8217;\/\/<\/p>\n<pre><code class=\"cpp\">enum EStructFlags {   \/\/ State flags.   STRUCT_NoFlags          = 0x00000000,    STRUCT_Native           = 0x00000001,    \/** If set, this struct will be compared using native code *\/   STRUCT_IdenticalNative    = 0x00000002,     STRUCT_HasInstancedReference= 0x00000004,    STRUCT_NoExport             = 0x00000008,    \/** Indicates that this struct should always be serialized as a single unit *\/   STRUCT_Atomic           = 0x00000010,    \/** Indicates that this struct uses binary serialization; it is unsafe to add\/remove members from this struct without incrementing the package version *\/   STRUCT_Immutable         = 0x00000020,    \/** If set, native code needs to be run to find referenced objects *\/   STRUCT_AddStructReferencedObjects = 0x00000040, ... };' <\/code><\/pre>\n<h4>1.3.4 UClass<\/h4>\n<pre><code class=\"cpp\">\/** * Reflection data for a standalone structure declared in a header or as a user defined struct *\/ class UScriptStruct : public UStruct { public:   \/** Interface to template to manage dynamic access to C++ struct construction and destruction **\/   struct COREUOBJECT_API ICppStructOps   {      \/**       * Constructor       * @param InSize: sizeof() of the structure       *\/      ICppStructOps(int32 InSize, int32 InAlignment)         : Size(InSize)         , Alignment(InAlignment)      {      }      virtual ~ICppStructOps() {}      \/** return true if this class has a no-op constructor and takes EForceInit to init **\/      virtual bool HasNoopConstructor() = 0;      \/** return true if memset can be used instead of the constructor **\/      virtual bool HasZeroConstructor() = 0;      \/** Call the C++ constructor **\/      virtual void Construct(void *Dest) = 0;      \/** Call the C++ constructor without value-init (new T instead of new T()) **\/      virtual void ConstructForTests(void* Dest) = 0;      \/** return false if this destructor can be skipped **\/      virtual bool HasDestructor() = 0;      \/** Call the C++ destructor **\/      virtual void Destruct(void *Dest) = 0;      \/** return the sizeof() of this structure **\/      FORCEINLINE int32 GetSize()      {         return Size;      }      \/** return the alignof() of this structure **\/      FORCEINLINE int32 GetAlignment()      {         return Alignment;      } ... }; <\/code><\/pre>\n<p>\u0412\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0442\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043a\u0430\u043a \u043f\u043e\u043b\u0435 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u0438\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u0435. \u041e\u0434\u043d\u0430\u043a\u043e, \u0430 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u0434\u0432\u0438\u0436\u043a\u0435?  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d59\/a07\/5de\/d59a075de3714373d4d5d3eb232701b2.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Structure.\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Structure.\" width=\"834\" height=\"1240\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d59\/a07\/5de\/d59a075de3714373d4d5d3eb232701b2.png\"\/><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Structure.<\/figcaption><\/figure>\n<p>\u0418 \u0443 \u044d\u0442\u0438\u0445 \u201c<code>\u0421\u0442\u0443\u043a\u0442\u0443\u0440<\/code>\u201d \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u201c<code>\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u0438<\/code>\u201d.<\/p>\n<p>\u042d\u0442\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u0434\u043b\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u0448\u0438 Blueprint \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 <code>UUserDefinedStruct<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u043c \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <code>UScriptStruct<\/code> \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0443.<\/p>\n<pre><code class=\"cpp\">UCLASS() class ENGINE_API UUserDefinedStruct : public UScriptStruct {   GENERATED_UCLASS_BODY()  public: #if WITH_EDITORONLY_DATA   \/** The original struct, when current struct isn't a temporary duplicate, the field should be null *\/   UPROPERTY(Transient)   TWeakObjectPtr&lt;UUserDefinedStruct> PrimaryStruct;    UPROPERTY()   FString ErrorMessage;    UPROPERTY()   TObjectPtr&lt;UObject> EditorData; #endif \/\/ WITH_EDITORONLY_DATA    \/** Status of this struct, outside of the editor it is assumed to always be UpToDate *\/   UPROPERTY()   TEnumAsByte&lt;enum EUserDefinedStructureStatus> Status;    \/** Uniquely identifies this specific user struct *\/   UPROPERTY()   FGuid Guid;  protected:   \/** Default instance of this struct with default values filled in, used to initialize structure *\/   FUserStructOnScopeIgnoreDefaults DefaultStructInstance;    \/** Bool to indicate we want to initialize a version of this struct without defaults, this is set while allocating the DefaultStructInstance itself *\/   bool bIgnoreStructDefaults; \u2026 <\/code><\/pre>\n<h2>2. \u0420\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044f.<\/h2>\n<h4>2.1 UStruct<\/h4>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0433\u043b\u0430\u0432\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435.<\/p>\n<pre><code class=\"cpp\">#pragma once #include \"TestStruct.generated.h\"  USTRUCT() struct FMyStruct {   GENERATED_BODY()      }; <\/code><\/pre>\n<p>UHT \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u043b\u044f \u043d\u0430\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0444\u0430\u0439\u043b:<\/p>\n<pre><code class=\"cpp\">#include \"UObject\/ObjectMacros.h\" #include \"UObject\/ScriptMacros.h\"  PRAGMA_DISABLE_DEPRECATION_WARNINGS #ifdef MYPROJECT_TestStruct_generated_h #error \"TestStruct.generated.h already included, missing '#pragma once' in TestStruct.h\" #endif #define MYPROJECT_TestStruct_generated_h  \/\/\u0412\u0430\u0436\u043d\u043e\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u0430. #define FID_MyProject_Source_MyProject_TestStruct_h_7_GENERATED_BODY \\   friend struct Z_Construct_UScriptStruct_FMyStruct_Statics; \\   MYPROJECT_API static class UScriptStruct* StaticStruct();   template&lt;> MYPROJECT_API UScriptStruct* StaticStruct&lt;struct FMyStruct>();  #undef CURRENT_FILE_ID #define CURRENT_FILE_ID FID_MyProject_Source_MyProject_TestStruct_h  PRAGMA_ENABLE_DEPRECATION_WARNINGS<\/code><\/pre>\n<p>\u0424\u0430\u0439\u043b \u044d\u0442\u043e\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0435\u0433\u043e \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u0441 UCLASS(). \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435:<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 include\u2019\u043e\u0432 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043c\u0430\u043a\u0440\u043e\u0441, \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0445 \u043f\u043e\u043b\u044f\u0445\/\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445, \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043c\u0430\u043a\u0440\u043e\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u0438\u0445 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u0444\u0430\u0439\u043b\u0443 GenericPlatformCompilerPreSetup.h \u0433\u0434\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u044b \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0434\u043b\u044f deprecation warning\u2019\u043e\u0432\u00a0\u00a0<\/p>\n<pre><code class=\"cpp\">... #ifndef DISABLE_DEPRECATION   #define DEPRECATED(VERSION, MESSAGE) DEPRECATED_MACRO(4.22, \"The DEPRECATED macro has been deprecated in favor of UE_DEPRECATED().\") __declspec(deprecated(MESSAGE \" Please update your code to the new API before upgrading to the next release, otherwise your project will no longer compile.\"))    #define PRAGMA_DISABLE_DEPRECATION_WARNINGS \\      __pragma (warning(push)) \\      __pragma (warning(disable: 4995)) \/* 'function': name was marked as #pragma deprecated *\/ \\      __pragma (warning(disable: 4996)) \/* The compiler encountered a deprecated declaration. *\/    #define PRAGMA_ENABLE_DEPRECATION_WARNINGS \\      __pragma (warning(pop)) #endif \/\/ DISABLE_DEPRECATION ...<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0438\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 #pragma once<\/p>\n<pre><code class=\"cpp\">#ifdef MYPROJECT_TestStruct_generated_h #error \"TestStruct.generated.h already included, missing '#pragma once' in TestStruct.h\" #endif <\/code><\/pre>\n<p>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u00a0<code>FID_Fighting_Source_Fighting_TestStruct_h_7_GENERATED_BODY<\/code><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0438\u0434\u0435\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 friend \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>Z_Construct_UScriptStruct_FMyStruct_Statics<\/code><\/p>\n<p>\u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 <code>static<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0435\u0439 <code>UScriptStruct* StaticStruct()<\/code><\/p>\n<p>\u042d\u0442\u043e \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 CDO (Class default Object).<\/p>\n<p>\u0412\u044b \u0447\u0430\u0441\u0442\u043e \u043c\u043e\u0433\u043b\u0438 \u0435\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0445\u043e\u0442\u0435\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u201c\u0422\u0438\u043f\u201d \u0432\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u0438\u043b\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 <code>IsA()<\/code>, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443: <code>FMyStruct::StaticStruct();<\/code><\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0441\u043e\u0437\u0434\u0430\u043d \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u0441\u0442\u0440\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0438\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e,\u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u043d\u043e\u0432\u0443\u044e, \u0434\u043b\u044f \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439.<\/p>\n<p>\u0425\u043e\u0442\u044f \u043f\u043e \u0441\u0443\u0442\u0438, \u044d\u0442\u043e \u043b\u0438\u0448\u044c \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 <code>ReflectedTypeAccessors.h :<\/code><\/p>\n<pre><code class=\"cpp\">\/\/ Copyright Epic Games, Inc. All Rights Reserved.  #pragma once  class UClass; class UScriptStruct; class UEnum;  \/*----------------------------------------------------------------------------- C++ templated Static(Class\/Struct\/Enum) retrieval function prototypes. -----------------------------------------------------------------------------*\/  template&lt;typename ClassType>   UClass*          StaticClass(); template&lt;typename StructType>  UScriptStruct* StaticStruct(); template&lt;typename EnumType>       UEnum*       StaticEnum();<\/code><\/pre>\n<p>\u0413\u0434\u0435 \u043c\u044b \u043b\u0438\u0448\u044c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0432\u043e\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0438\u043f.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043b\u0438\u0448\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e ID \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043d\u0435\u043c\u0443.<\/p>\n<pre><code class=\"cpp\">#undef CURRENT_FILE_ID #define CURRENT_FILE_ID FID_MyProject_Source_MyProject_TestStruct_h<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a const <code>FString&amp; FUnrealSourceFile::GetFileId() const<\/code>\u0424\u0430\u0439\u043b\u0430 <code>UnrealSourceFile.cpp<\/code><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u044d\u0442\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0435\u0439 CDO, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u0438\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043a\u0443\u0434\u0430 \u0442\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c, \u0432\u0435\u0440\u043d\u043e?<\/p>\n<p>\u042d\u0442\u0438\u043c \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0440\u043e\u0441 <code>GENERATED_BODY().<\/code> \u0420\u0430\u0431\u043e\u0442\u0430 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u0435\u0449\u0435 \u043b\u0443\u0447\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043e\u0431\u0437\u043e\u0440\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0436\u0435 \u0441\u043b\u0443\u0447\u0430\u0435, \u0432\u0441\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0442\u0430\u043c \u0436\u0435, \u0433\u0434\u0435 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0440\u043e\u0441 <code>FID_MyProject_Source_MyProject_TestStruct_h_7_GENERATED_BODY.<\/code><\/p>\n<p>\u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043c\u0430\u043a\u0440\u043e\u0441 <code>GENERATED_BODY().<\/code><\/p>\n<p>\u0421\u0430\u043c \u043e\u043d, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"css\">#define GENERATED_BODY(...) BODY_MACRO_COMBINE(CURRENT_FILE_ID,_,__LINE__,_GENERATED_BODY);<\/code><\/pre>\n<p>\u0421\u0430\u043c\u0430 \u0436\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 <code>BODY_MACRO_<\/code> \u0432\u0435\u0441\u044c\u043c\u0430 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0442\u043e\u043a\u0435\u043d\u0430 <code>##<\/code>.<\/p>\n<pre><code class=\"cpp\">\/\/ This pair of macros is used to help implement GENERATED_BODY() and GENERATED_USTRUCT_BODY() #define BODY_MACRO_COMBINE_INNER(A,B,C,D) A##B##C##D #define BODY_MACRO_COMBINE(A,B,C,D) BODY_MACRO_COMBINE_INNER(A,B,C,D)<\/code><\/pre>\n<p>\u0418 \u0432\u043c\u0435\u0441\u0442\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <code>GENERATED_BODY<\/code>, \u0441\u043d\u0430\u0447\u0430\u043b\u0430, \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0440\u043e\u0441, \u0433\u0434\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u044b <code>CURRENT_FILE_ID<\/code> + <code>_<\/code> +<code>__LINE__<\/code> + <code>_GENERATED BODY<\/code>;<\/p>\n<p>\u0418 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e <code>.generated.h<\/code> \u0444\u0430\u0439\u043b\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0447\u0442\u043e-\u0442\u043e \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0438:<\/p>\n<p><code>FID_MyProject_Source_MyProject_TestStruct_h_7_GENERATED_BODY\u00a0<\/code><\/p>\n<p>\u0413\u0434\u0435:<\/p>\n<p><code>FID_MyProject_Source_MyProject_TestStruct_h<\/code>&#8212; \u0424\u0430\u0439\u043b ID<\/p>\n<p><code>_7<\/code> &#8212; \u0441\u0442\u0440\u043e\u043a\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u043c\u0430\u043a\u0440\u043e\u0441 <code>GENERATED_BODY()<\/code><\/p>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0412 \u0444\u0430\u0439\u043b <code>.gen.cpp<\/code> \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.<\/p>\n<p>\u041a\u043e\u0434\u0430 \u0442\u0430\u043c \u044f\u0432\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u043e\u0442\u0440\u044b\u0432\u043a\u0430\u043c\u0438. <\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0432\u0438\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 .h \u0444\u0430\u0439\u043b: <code>#include \"UObject\/GeneratedCppIncludes.h\"<\/code><\/p>\n<p>\u0425\u0440\u0430\u043d\u044f\u0449\u0438\u0439 \u0434\u0440\u0443\u0433\u0438\u0435 .h \u0444\u0430\u0439\u043b\u044b:<\/p>\n<pre><code class=\"cpp\">#include \"CoreMinimal.h\" #include \"UObject\/Object.h\" #include \"UObject\/UObjectGlobals.h\" #include \"UObject\/CoreNative.h\" #include \"UObject\/Class.h\" #include \"UObject\/Package.h\" #include \"UObject\/MetaData.h\" #include \"UObject\/UnrealType.h\" #include \"UObject\/EnumProperty.h\" #include \"UObject\/TextProperty.h\" #include \"UObject\/FieldPathProperty.h\"<\/code><\/pre>\n<p>\u0417\u0430\u043e\u0441\u0442\u0440\u044f\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043d\u0438\u0445 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c. \u041e\u0442\u043c\u0435\u0447\u0443 \u043b\u0438\u0448\u044c, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u0445\u0435\u0434\u0434\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u0440\u0430\u043d\u0435\u0435.  <\/p>\n<p>e.g <code>#include \"UObject\/Class.h\"<\/code>  <\/p>\n<p>\u041d\u0438\u044d\u0435 \u0443\u0436\u0435 \u0438\u0434\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 ::StaticStruct \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b:<\/p>\n<pre><code class=\"cpp\">class UScriptStruct* FMyStruct::StaticStruct() {   if (!Z_Registration_Info_UScriptStruct_MyStruct.OuterSingleton)   {      Z_Registration_Info_UScriptStruct_MyStruct.OuterSingleton = GetStaticStruct(Z_Construct_UScriptStruct_FMyStruct, Z_Construct_UPackage__Script_MyProject(), TEXT(\"MyStruct\"));   }   return Z_Registration_Info_UScriptStruct_MyStruct.OuterSingleton; } <\/code><\/pre>\n<p>\u0418 \u0432\u044b\u0437\u043e\u0432 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>StaticStruct&lt;><\/code><\/p>\n<pre><code class=\"cpp\">template&lt;> MYPROJECT_API UScriptStruct* StaticStruct&lt;FMyStruct>() {   return FMyStruct::StaticStruct(); }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0442\u0435\u043b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u043e\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0441\u0432\u043e\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0443\u0441\u0442\u043e\u0439 <code>USTRUCT()<\/code> UHT \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:<\/p>\n<pre><code class=\"cpp\">struct Z_Construct_UScriptStruct_FMyStruct_Statics   { #if WITH_METADATA      static const UECodeGen_Private::FMetaDataPairParam Struct_MetaDataParams[]; #endif      static void* NewStructOps();      static const UECodeGen_Private::FStructParams ReturnStructParams;   };<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>NewStructOps()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <code>void<\/code>, \u043e\u0434\u043d\u0430\u043a\u043e \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u0438\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043a\u043b\u0430\u0441\u0441\u0443 <code>UScriptStruct<\/code> \u0447\u0442\u043e \u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u043b \u0440\u0430\u043d\u0435\u0435, \u0438 \u0435\u0433\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 <code>TCppStructOps<\/code> \u0447\u0442\u043e \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0443 \u0438 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0443 \u0438\u0437 c++.<\/p>\n<pre><code class=\"cpp\">\/** Template to manage dynamic access to C++ struct construction and destruction **\/ template&lt;class CPPSTRUCT> struct TCppStructOps : public ICppStructOps {   typedef TStructOpsTypeTraits&lt;CPPSTRUCT> TTraits;   TCppStructOps()      : ICppStructOps(sizeof(CPPSTRUCT), alignof(CPPSTRUCT))   {   } ... <\/code><\/pre>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b UScriptStruct::TCppStructOps, \u0433\u0434\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0448\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430.<\/p>\n<pre><code class=\"cpp\">void* Z_Construct_UScriptStruct_FMyStruct_Statics::NewStructOps() { \u00a0\u00a0return (UScriptStruct::ICppStructOps*)new UScriptStruct::TCppStructOps&lt;FMyStruct>(); }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0438\u0434\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 <code>static<\/code> \u043f\u043e\u043b\u044f <code>UECodeGen_Private::FStructParams.<\/code><\/p>\n<pre><code class=\"cpp\">const UECodeGen_Private::FStructParams Z_Construct_UScriptStruct_FMyStruct_Statics::ReturnStructParams = {   (UObject* (*)())Z_Construct_UPackage__Script_MyProject,   nullptr,   &amp;NewStructOps,   \"MyStruct\",   sizeof(FMyStruct),   alignof(FMyStruct),   nullptr,   0,   RF_Public|RF_Transient|RF_MarkAsNative,   EStructFlags(0x00000001),   METADATA_PARAMS(Z_Construct_UScriptStruct_FMyStruct_Statics::Struct_MetaDataParams, UE_ARRAY_COUNT(Z_Construct_UScriptStruct_FMyStruct_Statics::Struct_MetaDataParams)) }; <\/code><\/pre>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438, \u0442\u0443\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u043d\u0430\u0448\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443.<\/p>\n<p>\u0421\u0430\u043c\u0430 <code>FStructParams<\/code> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code class=\"cpp\">struct FStructParams   {      UObject*                          (*OuterFunc)();      UScriptStruct*                    (*SuperFunc)();      void*                             (*StructOpsFunc)(); \/\/ really returns UScriptStruct::ICppStructOps*      const char*                         NameUTF8;      SIZE_T                              SizeOf;      SIZE_T                              AlignOf;      const FPropertyParamsBase* const*   PropertyArray;      int32                               NumProperties;      EObjectFlags                        ObjectFlags;      uint32                              StructFlags; \/\/ EStructFlags #if WITH_METADATA      const FMetaDataPairParam*           MetaDataArray;      int32                               NumMetaData; #endif   };<\/code><\/pre>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0449\u0438 \u043d\u0430\u043c \u0443\u0436\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438\u0441\u044c.<\/p>\n<p>\u041a\u0430\u043a \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u00a0<code>void* (*StructOpsFunc)();<\/code>\u00a0<\/p>\n<p>\u0418\u043b\u0438 \u00a0<code>uint32 StructFlags;<\/code><\/p>\n<p>\u0422\u0443\u0442 \u0435\u0449\u0435 \u0432\u0430\u0436\u043d\u043e \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c <code>enum EObjectFlags<\/code>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043f\u043e\u043b\u044f, \u043c\u0430\u0440\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0448\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u0418\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0438\u043b\u0438 \u0441\u043e\u0431\u0440\u0430\u043d\u044b \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 GC.<\/p>\n<pre><code class=\"cpp\"> \/** * Flags describing an object instance *\/ enum EObjectFlags {   \/\/ Do not add new flags unless they truly belong here. There are alternatives.   \/\/ if you change any the bit of any of the RF_Load flags, then you will need legacy serialization   RF_NoFlags             = 0x00000000,  \/\/\/&lt; No flags, used to avoid a cast    \/\/ This first group of flags mostly has to do with what kind of object it is. Other than transient, these are the persistent object flags.   \/\/ The garbage collector also tends to look at these.   RF_Public              =0x00000001,   \/\/\/&lt; Object is visible outside its package.   RF_Standalone           =0x00000002,   \/\/\/&lt; Keep object around for editing even if unreferenced.   RF_MarkAsNative             =0x00000004,   \/\/\/&lt; Object (UField) will be marked as native on construction (DO NOT USE THIS FLAG in HasAnyFlags() etc)   RF_Transactional         =0x00000008,   \/\/\/&lt; Object is transactional.   RF_ClassDefaultObject     =0x00000010,   \/\/\/&lt; This object is its class's default object   RF_ArchetypeObject       =0x00000020,   \/\/\/&lt; This object is a template for another object - treat like a class default object   RF_Transient            =0x00000040,   \/\/\/&lt; Don't save object. ...   RF_FinishDestroyed       =0x00010000,   \/\/\/&lt; FinishDestroy has been called on the object.    \/\/ Misc. Flags   RF_BeingRegenerated          =0x00020000,   \/\/\/&lt; Flagged on UObjects that are used to create UClasses (e.g. Blueprints) while they are regenerating their UClass on load (See FLinkerLoad::CreateExport()), as well as UClass objects in the midst of being created   RF_DefaultSubObject          =0x00040000,   \/\/\/&lt; Flagged on subobjects that are defaults   RF_WasLoaded            =0x00080000,   \/\/\/&lt; Flagged on UObjects that were loaded  ...    RF_PendingKill UE_DEPRECATED(5.0, \"RF_PendingKill should not be used directly. Make sure references to objects are released using one of the existing engine callbacks or use weak object pointers.\") = 0x20000000,    \/\/\/&lt; Objects that are pending destruction (invalid for gameplay but valid objects). This flag is mirrored in EInternalObjectFlags as PendingKill for performance   RF_Garbage UE_DEPRECATED(5.0, \"RF_Garbage should not be used directly. Use MarkAsGarbage and ClearGarbage instead.\") =0x40000000,  \/\/\/&lt; Garbage from logical point of view and should not be referenced. This flag is mirrored in EInternalObjectFlags as Garbage for performance   RF_AllocatedInSharedPage   =0x80000000,   \/\/\/&lt; Allocated from a ref-counted page shared with other UObjects }; <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0436\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043a\u0430\u043a 2 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u043e\u0433\u043e \u0418\u041b\u0418: <code>RF_Public|RF_Transient|RF_MarkAsNative<\/code>  <\/p>\n<p>\u0423 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u043f\u043e\u043b\u0435: <code>static const UECodeGen_Private::FMetaDataPairParam Struct_MetaDataParams[];<\/code><\/p>\n<p>\u0422.\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <code>[\"BlueprintType\", \"true\"]<\/code>; \u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c <code>[\"ModuleRelativePath\", \"TestStruct.h\"]<\/code> &#8212; \u0442.\u043a \u044f \u043d\u0435 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b \u0438\u0445 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u043f\u0430\u043f\u043a\u0443.<\/p>\n<pre><code class=\"cpp\">#if WITH_METADATA   const UECodeGen_Private::FMetaDataPairParam Z_Construct_UScriptStruct_FMyStruct_Statics::Struct_MetaDataParams[] = {      { \"BlueprintType\", \"true\" },      { \"ModuleRelativePath\", \"TestStruct.h\" },   }; #endif<\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0430\u0440\u0443 \u043f\u043e\u043b\u0435\u0439:<\/p>\n<pre><code class=\"cpp\">struct FMyStruct {   GENERATED_BODY()    UPROPERTY(BlueprintReadWrite,Category=\"TestCategory\")   float TestFloat;  private:   UPROPERTY(BlueprintReadOnly,Category=\"TestCategory\",meta = (AllowPrivateAccess = \"true\"))   FString TestString; }; <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u043b\u0430\u0441\u044c:<\/p>\n<pre><code class=\"cpp\">   struct Z_Construct_UScriptStruct_FMyStruct_Statics   { #if WITH_METADATA      static const UECodeGen_Private::FMetaDataPairParam Struct_MetaDataParams[]; #endif      static void* NewStructOps(); #if WITH_METADATA      static const UECodeGen_Private::FMetaDataPairParam NewProp_TestFloat_MetaData[]; #endif      static const UECodeGen_Private::FFloatPropertyParams NewProp_TestFloat; #if WITH_METADATA      static const UECodeGen_Private::FMetaDataPairParam NewProp_TestString_MetaData[]; #endif      static const UECodeGen_Private::FStrPropertyParams NewProp_TestString;      static const UECodeGen_Private::FPropertyParamsBase* const PropPointers[];      static const UECodeGen_Private::FStructParams ReturnStructParams;   };<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435:<\/p>\n<p>\u0414\u043b\u044f TestFloat:<\/p>\n<pre><code class=\"cpp\">#if WITH_METADATA      static const UECodeGen_Private::FMetaDataPairParam NewProp_TestFloat_MetaData[]; #endif      static const UECodeGen_Private::FFloatPropertyParams NewProp_TestFloat;<\/code><\/pre>\n<p>\u0414\u043b\u044f TestString:<\/p>\n<pre><code class=\"cpp\">#if WITH_METADATA      static const UECodeGen_Private::FMetaDataPairParam NewProp_TestString_MetaData[]; #endif      static const UECodeGen_Private::FStrPropertyParams NewProp_TestString;<\/code><\/pre>\n<p>\u0418 \u0434\u043b\u044f \u043e\u0431\u043e\u0438\u0445:<\/p>\n<pre><code class=\"cpp\">static const UECodeGen_Private::FPropertyParamsBase* const PropPointers[];<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043c\u0435\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u0441\u043b\u0443\u0436\u0430\u0449\u0430\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0442\u0435\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0437\u0430\u0434\u0430\u043b\u0438 \u0432 \u043c\u0430\u043a\u0440\u043e\u0441\u0435 <code>UPROPERTY().<\/code><\/p>\n<p>\u0412\u0430\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u043c\u0430\u043a\u0440\u043e\u0441 <code>WITH_METADATA<\/code>, \u0438 \u0447\u0442\u043e <code>FMetaDataPairParam<\/code>\u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0441 \u044d\u0442\u0438\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c.\u0415\u0441\u043b\u0438 \u043f\u043e\u0440\u044b\u0442\u044c\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c:\u0434\u0430\u043d\u043d\u044b\u0435, \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435 \u0432 \u044d\u0442\u043e\u0442 \u043c\u0430\u043a\u0440\u043e\u0441, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0432\u0438\u0436\u043a\u043e\u043c. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 <code>static<\/code> \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u044d\u0442\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0434\u0432\u0438\u0436\u043a\u0435, \u0438 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0431\u044b\u0442\u044c \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0438\u0433\u0440\u0435.<\/p>\n<p>\u0412\u0435\u0434\u044c \u0437\u0430\u0447\u0435\u043c \u043d\u0430\u043c \u0437\u043d\u0430\u0442\u044c \u0432 \u0431\u0438\u043b\u0434\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0433\u0440\u044b, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 Health \u0432 Blueprint \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e ReadOnly?<\/p>\n<p>\u0422\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043b\u0435 <code>TestString<\/code> \u0434\u043b\u044f \u0440\u0435\u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0432 \u0434\u0432\u0438\u0436\u043a\u0435 \u043f\u043e\u0441\u043b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e:<\/p>\n<pre><code class=\"cpp\">const UECodeGen_Private::FMetaDataPairParam Z_Construct_UScriptStruct_FMyStruct_Statics::NewProp_TestString_MetaData[] = {   { \"AllowPrivateAccess\", \"true\" },   { \"Category\", \"TestCategory\" },   { \"ModuleRelativePath\", \"TestStruct.h\" }, };<\/code><\/pre>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0436\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435:<\/p>\n<pre><code class=\"cpp\">const UECodeGen_Private::FStrPropertyParams Z_Construct_UScriptStruct_FMyStruct_Statics::NewProp_TestString = { \"TestString\", nullptr, (EPropertyFlags)0x0040000000000014, UECodeGen_Private::EPropertyGenFlags::Str, RF_Public|RF_Transient|RF_MarkAsNative, 1, STRUCT_OFFSET(FMyStruct, TestString), METADATA_PARAMS(Z_Construct_UScriptStruct_FMyStruct_Statics::NewProp_TestString_MetaData, UE_ARRAY_COUNT(Z_Construct_UScriptStruct_FMyStruct_Statics::NewProp_TestString_MetaData)) };<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0439 \u0437\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u043f\u043e\u043b\u044f\u0445, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>FStrPropertyParams<\/code>.<\/p>\n<p>\u0425\u043e\u0442\u044f \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0430\u044f:<\/p>\n<pre><code class=\"cpp\">\/\/ These property types don't add new any construction parameters to their base property typedef FGenericPropertyParams FInt8PropertyParams; typedef FGenericPropertyParams FInt16PropertyParams; typedef FGenericPropertyParams FIntPropertyParams; typedef FGenericPropertyParams FInt64PropertyParams; typedef FGenericPropertyParams FFInt16PropertyParams; typedef FGenericPropertyParams FUInt32PropertyParams; typedef FGenericPropertyParams FFInt64PropertyParams; typedef FGenericPropertyParams FUnsizedIntPropertyParams; typedef FGenericPropertyParams FUnsizedFIntPropertyParams; typedef FGenericPropertyParams FFloatPropertyParams; typedef FGenericPropertyParams FDoublePropertyParams; typedef FGenericPropertyParams FLargeWorldCoordinatesRealPropertyParams; typedef FGenericPropertyParams FNamePropertyParams; typedef FGenericPropertyParams FStrPropertyParams; typedef FGenericPropertyParams FSetPropertyParams; typedef FGenericPropertyParams FTextPropertyParams; typedef FObjectPropertyParams  FWeakObjectPropertyParams; typedef FObjectPropertyParams  FLazyObjectPropertyParams; typedef FObjectPropertyParams  FObjectPtrPropertyParams; typedef FClassPropertyParams   FClassPtrPropertyParams; typedef FObjectPropertyParams  FSoftObjectPropertyParams;<\/code><\/pre>\n<p>\u0412 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 <code>FGenericPropertyParams<\/code> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f <em>\u0418\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439<\/em>, \u0435\u0435 <em>RepNotify \u0444\u0443\u043d\u043a\u0446\u0438\u044f<\/em>, <code>EPropertyFlags<\/code> \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043b\u0438, <code>EPropertyGenFlags<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 enum:<\/p>\n<pre><code class=\"cpp\">enum class EPropertyGenFlags : uint32 {   None              = 0x00,    \/\/ First 6 bits are the property type   Byte              = 0x00,   Int8              = 0x01,   Int16             = 0x02,   Int               = 0x03,   Int64             = 0x04,   UInt16            = 0x05,   UInt32            = 0x06,   UInt64            = 0x07,   UnsizedInt        = 0x08, ... };<\/code><\/pre>\n<p>\u041d\u0443 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0435\u0435 \u043d\u0430\u0441: <code>EObjectFlags <\/code>\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0442\u0430\u043a \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043b\u0438.<\/p>\n<p>\u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u044d\u0442\u043e \u0434\u0435\u0442\u0430\u043b\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u044b\u0435 Meta \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0434\u0432\u0438\u0436\u043a\u0430.<\/p>\n<h4>2.2 UClass<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u043e\u0434 <code>UCLASS()<\/code>.<\/p>\n<p>\u0418\u0441\u043f\u044b\u0442\u0443\u0435\u043c\u044b\u0439:<\/p>\n<pre><code class=\"cpp\">#pragma once  #include \"TestClass.generated.h\"  UCLASS() class UTestClass : public UObject {   GENERATED_BODY() }; <\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>.generated.h<\/code> \u0444\u0430\u0439\u043b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0441\u0438\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 (93 \u0441\u0442\u0440\u043e\u043a\u0438).<\/p>\n<pre><code class=\"cpp\">\/\/ Copyright Epic Games, Inc. All Rights Reserved. \/*===========================================================================   Generated code exported from UnrealHeaderTool.   DO NOT modify this manually! Edit the corresponding .h files instead! ===========================================================================*\/  #include \"UObject\/ObjectMacros.h\" #include \"UObject\/ScriptMacros.h\"  ...    #define FID_MyProject_Source_MyProject_TestClass_h_8_SPARSE_DATA #define FID_MyProject_Source_MyProject_TestClass_h_8_RPC_WRAPPERS #define FID_MyProject_Source_MyProject_TestClass_h_8_RPC_WRAPPERS_NO_PURE_DECLS #define FID_MyProject_Source_MyProject_TestClass_h_8_INCLASS_NO_PURE_DECLS \\ private: \\   static void StaticRegisterNativesUTestClass(); \\   friend struct Z_Construct_UClass_UTestClass_Statics; \\ public: \\   DECLARE_CLASS(UTestClass, UObject, COMPILED_IN_FLAGS(0), CASTCLASS_None, TEXT(\"\/Script\/MyProject\"), NO_API) \\   DECLARE_SERIALIZER(UTestClass) ...  #define FID_MyProject_Source_MyProject_TestClass_h_7_STANDARD_CONSTRUCTORS \\ \/** Standard constructor, called after all reflected properties have been initialized *\/ \\ NO_API UTestClass(const FObjectInitializer&amp; ObjectInitializer = FObjectInitializer::Get()); \\ DEFINE_DEFAULT_OBJECT_INITIALIZER_CONSTRUCTOR_CALL(UTestClass) \\ DECLARE_VTABLE_PTR_HELPER_CTOR(NO_API, UTestClass); \\ DEFINE_VTABLE_PTR_HELPER_CTOR_CALLER(UTestClass); \\   ...  #define FID_MyProject_Source_MyProject_TestClass_h_7_ENHANCED_CONSTRUCTORS \\   \/** Standard constructor, called after all reflected properties have been initialized *\/ \\   NO_API UTestClass(const FObjectInitializer&amp; ObjectInitializer = FObjectInitializer::Get()) : Super(ObjectInitializer) { }; \\ private: \\ \/** Private move- and copy-constructors, should never be used *\/ \\ NO_API UTestClass(UTestClass&amp;&amp;); \\ NO_API UTestClass(const UTestClass&amp;); \\ public: \\ DECLARE_VTABLE_PTR_HELPER_CTOR(NO_API, UTestClass); \\ DEFINE_VTABLE_PTR_HELPER_CTOR_CALLER(UTestClass); \\ DEFINE_DEFAULT_OBJECT_INITIALIZER_CONSTRUCTOR_CALL(UTestClass)  ...    #define FID_MyProject_Source_MyProject_TestClass_h_7_GENERATED_BODY \\ PRAGMA_DISABLE_DEPRECATION_WARNINGS \\ public: \\ FID_MyProject_Source_MyProject_TestClass_h_7_SPARSE_DATA \\ FID_MyProject_Source_MyProject_TestClass_h_7_RPC_WRAPPERS_NO_PURE_DECLS \\ FID_MyProject_Source_MyProject_TestClass_h_7_INCLASS_NO_PURE_DECLS \\ FID_MyProject_Source_MyProject_TestClass_h_7_ENHANCED_CONSTRUCTORS \\ private: \\ PRAGMA_ENABLE_DEPRECATION_WARNINGS  ...<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 UHT \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u043f\u0443\u0441\u0442\u044b\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0435 \u043d\u0435\u0441\u0443\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0446\u0435\u043b\u0438.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u043d\u0438\u0445, \u0431\u044b\u043b\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0435<code>FObjectInitializer<\/code> \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c. \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u044b \u0432 private \u043f\u043e\u043b\u0435.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043c\u0430\u043a\u0440\u043e\u0441 <code>DECLARE CLASS()<\/code> \u043a\u0443\u0434\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438, \u043d\u0435\u043c\u0430\u043b\u043e\u0432\u0430\u0436\u043d\u043e \u043f\u0443\u0442\u044c\u00a0<code>\/Script\/MyProject<\/code> &#8212; \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 Package, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0433\u043b\u0430\u0432\u0435 \u043c\u044b \u0435\u0449\u0435 \u0443\u0432\u0438\u0434\u0438\u043c.<\/p>\n<pre><code class=\"cpp\">#define DECLARE_CLASS( TClass, TSuperClass, TStaticFlags, TStaticCastFlags, TPackage, TRequiredAPI  ) \\ private: \\    TClass&amp; operator=(TClass&amp;&amp;);   \\    TClass&amp; operator=(const TClass&amp;);   \\   TRequiredAPI static UClass* GetPrivateStaticClass(); \\ public: \\   \/** Bitwise union of #EClassFlags pertaining to this class.*\/ \\   enum {StaticClassFlags=TStaticFlags}; \\   \/** Typedef for the base class ({{ typedef-type }}) *\/ \\   typedef TSuperClass Super;\\   \/** Typedef for {{ typedef-type }}. *\/ \\   typedef TClass ThisClass;\\   \/** Returns a UClass object representing this class at runtime *\/ \\   inline static UClass* StaticClass() \\   { \\      return GetPrivateStaticClass(); \\   } \\   \/** Returns the package this class belongs in *\/ \\   inline static const TCHAR* StaticPackage() \\   { \\      return TPackage; \\   } \\   \/** Returns the static cast flags for this class *\/ \\   inline static EClassCastFlags StaticClassCastFlags() \\   { \\      return TStaticCastFlags; \\   } \\   \/** For internal use only; use StaticConstructObject() to create new objects. *\/ \\   inline void* operator new(const size_t InSize, EInternal InInternalOnly, UObject* InOuter = (UObject*)GetTransientPackage(), FName InName = NAME_None, EObjectFlags InSetFlags = RF_NoFlags) \\   { \\      return StaticAllocateObject(StaticClass(), InOuter, InName, InSetFlags); \\   } \\   \/** For internal use only; use StaticConstructObject() to create new objects. *\/ \\   inline void* operator new( const size_t InSize, EInternal* InMem ) \\   { \\      return (void*)InMem; \\   } \\   \/* Eliminate V1062 warning from PVS-Studio while keeping MSVC and Clang happy. *\/ \\   inline void operator delete(void* InMem) \\   { \\      ::operator delete(InMem); \\   }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u044d\u0442\u043e\u0442 \u043c\u0430\u043a\u0440\u043e\u0441 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0435\u0439, type alias&#8217;\u043e\u0432, \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 CDO helper&#8217;\u043e\u0432, \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c. <\/p>\n<p>\u0418 \u0432\u0441\u0435 \u044d\u0442\u043e \u0432 \u043a\u043e\u043d\u0446\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432 \u043c\u0430\u043a\u0440\u043e\u0441 <code>FID_MyProject_Source_MyProject_TestClass_h_7_GENERATED_BODY,<\/code> \u0430 \u043f\u043e\u0441\u043b\u0435 \u0438 \u043e\u043d \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u043c\u0435\u0441\u0442\u043e \u043d\u0430\u0448\u0435\u0433\u043e <code>GENERATED_BODY().<\/code><\/p>\n<pre><code class=\"cpp\">#define FID_MyProject_Source_MyProject_TestClass_h_7_GENERATED_BODY \\ PRAGMA_DISABLE_DEPRECATION_WARNINGS \\ public: \\ FID_MyProject_Source_MyProject_TestClass_h_7_SPARSE_DATA \\ FID_MyProject_Source_MyProject_TestClass_h_7_RPC_WRAPPERS_NO_PURE_DECLS \\ FID_MyProject_Source_MyProject_TestClass_h_7_INCLASS_NO_PURE_DECLS \\ FID_MyProject_Source_MyProject_TestClass_h_7_ENHANCED_CONSTRUCTORS \\ private: \\ PRAGMA_ENABLE_DEPRECATION_WARNINGS<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<pre><code class=\"cpp\">...   UFUNCTION()   void SimpleFun();    UFUNCTION(BlueprintCallable)   void BPCallableFun(int32 Param);    UFUNCTION(BlueprintCallable,BlueprintPure)   FString BPCallablePure(const FString&amp; Param);   protected:   UFUNCTION(BlueprintImplementableEvent,BlueprintCallable)   int32 BPImplFun(); ...<\/code><\/pre>\n<p>\u0418 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u043c\u0435\u0442\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. UHT \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0434\u043b\u044f \u043d\u0430\u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u0432 \u0440\u0430\u043d\u0435\u0435 \u043f\u0443\u0441\u0442\u044b\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: <code>FID_MyProject_Source_MyProject_TestClass_h_10_RPC_WRAPPERS<\/code>.<\/p>\n<p>\u0421\u0430\u043c \u043c\u0430\u043a\u0440\u043e\u0441 <code>DECLARE_FUNCTION<\/code> &#8212; \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0448\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c exec:<\/p>\n<pre><code class=\"cpp\">#define FID_MyProject_Source_MyProject_TestClass_h_10_RPC_WRAPPERS \\ \\   DECLARE_FUNCTION(execBPCallablePure); \\   DECLARE_FUNCTION(execBPCallableFun); \\   DECLARE_FUNCTION(execSimpleFun);<\/code><\/pre>\n<p>\u0421\u0430\u043c \u043c\u0430\u043a\u0440\u043e\u0441 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442:<\/p>\n<pre><code class=\"cpp\">\/\/ This macro is used to declare a thunk function in autogenerated boilerplate code #define DECLARE_FUNCTION(func) static void func( UObject* Context, FFrame&amp; Stack, RESULT_DECL )<\/code><\/pre>\n<p>\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>static<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0441\u0442\u044d\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u0442.\u0435, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u043d\u0430\u0448\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"cpp\">#define RESULT_DECL void*const RESULT_PARAM #define RESULT_PARAM Z_Param__Result<\/code><\/pre>\n<p>\u0418 \u043c\u044b \u0432\u0441\u0435 \u044d\u0442\u043e \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043b\u0438, \u043a\u043e\u0433\u0434\u0430 \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>UFunction::Invoke(); <\/code>\u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <strong>\u041d\u0430\u0442\u0438\u0432\u043d\u0430\u044f<\/strong> <strong>\u0444\u0443\u043d\u043a\u0446\u0438\u044f<\/strong>,\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u043c <code>UFunction<\/code>.<\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 UHT \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u043b\u044f \u043d\u0430\u0441 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0438 \u043c\u0430\u043a\u0440\u043e\u0441 <code>FID_MyProject_Source_MyProject_TestClass_h_10_EVENT_PARMS<\/code> \u0434\u043b\u044f \u043d\u0438\u0445.<\/p>\n<pre><code class=\"cpp\">#define FID_MyProject_Source_MyProject_TestClass_h_10_EVENT_PARMS \\   struct TestClass_eventBPImplFun_Parms \\   { \\      int32 ReturnValue; \\ \\      \/** Constructor, initializes return property only **\/ \\      TestClass_eventBPImplFun_Parms() \\         : ReturnValue(0) \\      { \\      } \\   };<\/code><\/pre>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0442\u0430\u043a \u0436\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e <code>ReturnValue(0)<\/code>. \u0412 Blueprint \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0432\u044b \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0443\u0432\u0438\u0434\u0438\u0442\u0435.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c\u00a0 \u0442\u0435\u043f\u0435\u0440\u044c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e. \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0433\u043e \u0441 <code>DECLARE_FUNCTION<\/code> <code>DEFINE_FUNCTION<\/code>.<\/p>\n<pre><code class=\"cpp\">\/\/ This macro is used to define a thunk function in autogenerated boilerplate code #define DEFINE_FUNCTION(func) void func( UObject* Context, FFrame&amp; Stack, RESULT_DECL )<\/code><\/pre>\n<pre><code class=\"cpp\">DEFINE_FUNCTION(UTestClass::execBPCallablePure) {   P_GET_PROPERTY(FStrProperty,Z_Param_Param);   P_FINISH;   P_NATIVE_BEGIN;   *(FString*)Z_Param__Result=P_THIS->BPCallablePure(Z_Param_Param);   P_NATIVE_END; }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0439\u0442\u0438 \u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c, \u0442.\u0435\u00a0<code>const FString&amp; Param<\/code><\/p>\n<p>UHT \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043d\u044f\u043b \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0438 \u0434\u043b\u044f \u0435\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>FStrProperty<\/code>, \u0430 \u0438\u043c\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>Z_Param_Param<\/code>.<\/p>\n<p>\u0421\u0430\u043c \u043f\u043e\u0438\u0441\u043a \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 &#8212; \u0441\u0442\u044d\u043a\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0442\u043e\u043c\u0443 \u0441\u0430\u043c\u043e\u043c\u0443 FFrame. \u0412\u044b\u0448\u0435 \u043c\u044b \u0443\u0436\u0435 \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u043b\u0438 \u0435\u0433\u043e, \u043a\u0430\u043a \u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u043a\u0440\u043e\u0441:<\/p>\n<p><code>P_GET_PROPERTY(FStrProperty,Z_Param_Param);<\/code><\/p>\n<pre><code class=\"cpp\">#define P_GET_PROPERTY(PropertyType, ParamName)                                     \\   PropertyType::TCppType ParamName = PropertyType::GetDefaultPropertyValue();                \\   Stack.StepCompiledIn&lt;PropertyType>(&amp;ParamName);<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0434\u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0438 out \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 Stack, \u0433\u0434\u0435 \u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0438\u043b\u0438 \u0443\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f, \u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f:  <\/p>\n<pre><code class=\"cpp\">FORCEINLINE_DEBUGGABLE void FFrame::StepCompiledIn(void* Result, const FFieldClass* ExpectedPropertyType) { if (Code) { Step(Object, Result); } else { checkSlow(ExpectedPropertyType &amp;&amp; ExpectedPropertyType->IsChildOf(FProperty::StaticClass())); checkSlow(PropertyChainForCompiledIn &amp;&amp; PropertyChainForCompiledIn->IsA(ExpectedPropertyType)); FProperty* Property = (FProperty*)PropertyChainForCompiledIn; PropertyChainForCompiledIn = Property->Next; StepExplicitProperty(Result, Property); } } <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043e\u0431\u0440\u0430\u0449\u0443 \u0432\u0430\u0448\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u0438\u043f <code>FProperty<\/code>,\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0432\u044b\u0448\u0435, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b \u0432 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u043b\u0430\u0433\u0430 <code>CPF_SaveGame<\/code>,\u00a0 \u0442.\u0435 \u043d\u0430 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u201c\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\u201d \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0432\u0438\u0436\u043a\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0443\u044e \u0444\u043b\u0430\u0433\u0438, <code>RepNotify<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u043f\u0440.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043d\u0430\u0439\u0434\u0435\u043d, \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <code>Code<\/code> \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 Stack \u0441\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 <code>nullptr<\/code>:<\/p>\n<pre><code>#define P_FINISH Stack.Code += !!Stack.Code; \/* increment the code ptr unless it is null *\/<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0438\u0434\u0435\u0442 \u0432\u044b\u0437\u043e\u0432 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">#define P_NATIVE_BEGIN { SCOPED_SCRIPT_NATIVE_TIMER(ScopedNativeCallTimer); #define P_NATIVE_END   }<\/code><\/pre>\n<p>\u041c\u0435\u0436 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d \u0432\u044b\u0437\u043e\u0432 \u043a \u043d\u0430\u0448\u0435\u0439 \u0440\u043e\u0434\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0449\u0443 \u0435\u0449\u0435 \u0440\u0430\u0437 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 <code>RESULT_DECL<\/code>, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0439 \u0432 <code>DEFINE_FUNCTION<\/code>, <\/p>\n<p>\u0422.\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u00a0<code>Z_Param__Result<\/code>, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u044d\u0442\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <code>void<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043a\u0430\u0441\u0442\u0438\u0442\u044c \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u0442\u0438\u043f\u0443 <code>FString<\/code>.<\/p>\n<p>\u041f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0432\u044b\u0437\u043e\u0432 \u043a \u043d\u0430\u0448\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043c\u0435\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441:<\/p>\n<p><code>*(FString*)Z_Param__Result=P_THIS->BPCallablePure(Z_Param_Param);<\/code><\/p>\n<p>\u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e <code>UClass\u2019\u0430<\/code> \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0438\u043c\u0435\u043d \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 cpp \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f\u00a0 <code>NativeFunctionLookupTable<\/code>. \u0412\u0441\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0442\u0443\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442:<\/p>\n<pre><code class=\"cpp\">void UTestClass::StaticRegisterNativesUTestClass() {   UClass* Class = UTestClass::StaticClass();   static const FNameNativePtrPair Funcs[] = {      { \"BPCallableFun\", &amp;UTestClass::execBPCallableFun },      { \"BPCallablePure\", &amp;UTestClass::execBPCallablePure },      { \"SimpleFun\", &amp;UTestClass::execSimpleFun },   };   FNativeFunctionRegistrar::RegisterFunctions(Class, Funcs, UE_ARRAY_COUNT(Funcs)); }<\/code><\/pre>\n<p>\u0422\u0443\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u0440\u043e\u043c\u0435 <code>BPImplFun<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f <code>cpp<\/code> \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442.<\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e UHT \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0434\u043b\u044f \u043d\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u043e\u043b\u0435\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0438\u043c\u044f \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">static FName NAME_UTestClass_BPImplFun = FName(TEXT(\"BPImplFun\")); int32 UTestClass::BPImplFun() {   TestClass_eventBPImplFun_Parms Parms;   ProcessEvent(FindFunctionChecked(NAME_UTestClass_BPImplFun),&amp;Parms);   return Parms.ReturnValue; } <\/code><\/pre>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0430, \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043d\u0430\u043c\u0438 \ud83d\ude42<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>TestClass_eventBPImplFun_Parms<\/code>, \u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u0435\u0449\u0435 \u0432 <code>.generated.h<\/code> \u0444\u0430\u0439\u043b\u0435.<\/p>\n<p>\u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f <code>ProcessEvent<\/code>.<\/p>\n<p>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 UObject, \u0433\u0434\u0435 \u044f\u0432\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u0447\u0442\u043e \u043e\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 UFunction\u2019\u044b.<\/p>\n<pre><code class=\"cpp\">\/*-----------------------------      Virtual Machine -----------------------------*\/  \/** Called by VM to execute a UFunction with a filled in UStruct of parameters *\/ virtual void ProcessEvent( UFunction* Function, void* Parms );<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u0435\u0440\u0435\u0434 \u043d\u0435\u0439 \u044d\u0442\u043e\u0442 <code>UFunction<\/code> \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438. \u042d\u0442\u0438\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0432 <code>UObject\u2019\u0435<\/code>.<\/p>\n<pre><code class=\"cpp\">\/** Returns a UFunction with the specified name, wrapper for UClass::FindFunctionByName() *\/ UFunction* FindFunction( FName InName ) const;  \/** Version of FindFunction() that will assert if the function was not found *\/ UFunction* FindFunctionChecked( FName InName ) const;<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443 <code>UClass<\/code>\u2019, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u043c\u0441\u044f \u0434\u043b\u044f <code>UObject\u2019\u0430<\/code> \u0440\u0435\u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 \u0432\u0441\u0435\u0445 \u0442\u0435\u0445 \u043f\u043e\u043b\u0435\u0439, \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0436\u0435\u043b\u0430\u0435\u043c\u0430\u044f \u043d\u0430\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">UFunction* UObject::FindFunction( FName InName ) const {   return GetClass()->FindFunctionByName(InName); } ... \/** Class the object belongs to. *\/ UClass*                      ClassPrivate;<\/code><\/pre>\n<p>\u0421\u0430\u043c \u043f\u043e\u0438\u0441\u043a \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043d\u0430\u0439\u0442\u0438 \u0444\u0443\u043a\u043d\u0446\u0438\u044e \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 <em>\u201c\u041c\u0435\u0441\u0442\u0430\u0445\u201d<\/em>.\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0449\u0435\u043c \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 <code>UClass\u2019\u0435<\/code>, \u0442.\u0435 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 <code>UObject\u2019\u0430<\/code>. \u0415\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0430\u043c \u043d\u0435\u0442, \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044e \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u0415\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0432\u0430\u043b\u0438\u0434\u0435\u043d, \u0438\u0449\u0435\u043c \u0432 \u0435\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438\u043c\u0435\u043d \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0432\u0430\u043b\u0438\u0434\u0435\u043d, \u0442\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u0445,\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442.<\/p>\n<pre><code class=\"cpp\">UFunction* UClass::FindFunctionByName(FName InName, EIncludeSuperFlag::Type IncludeSuper) const {   LLM_SCOPE(ELLMTag::UObject);   UFunction* Result = FuncMap.FindRef(InName);   if (Result == nullptr &amp;&amp; IncludeSuper == EIncludeSuperFlag::IncludeSuper)   {      UClass* SuperClass = GetSuperClass();      if (SuperClass || Interfaces.Num() > 0)      { ... }; <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 <code>UObject::ProcessEvent.<\/code><\/p>\n<p>\u0412\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043f\u0443\u043d\u043a\u0442\u043e\u0432:<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u0442\u0430, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0438\u043c\u0435\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0444\u043b\u0430\u0433\u0438.<\/p>\n<pre><code class=\"cpp\">... if ((Function->FunctionFlags &amp; FUNC_Native) != 0) {   int32 FunctionCallspace = GetFunctionCallspace(Function, NULL);   if (FunctionCallspace &amp; FunctionCallspace::Remote)   {      CallRemoteFunction(Function, Parms, NULL, NULL);   }    if ((FunctionCallspace &amp; FunctionCallspace::Local) == 0)   {      return;   } } else if (Function->Script.Num() == 0) {   return; } ...<\/code><\/pre>\n<p>\u0422.\u043a <code>UObject\u2019\u044b<\/code> \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, <code>GetFunctionCallspace()<\/code> \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u0435\u0440\u043d\u0435\u0442 <code>FunctionCallspace::Local<\/code><\/p>\n<p>\u0410 <code>CallRemoteFunction()<\/code> \u0442\u0430\u043a \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 false.<\/p>\n<pre><code class=\"cpp\">\/** * Call the actor's function remotely * * @param Function function to call * @param Parameters arguments to the function call * @param Stack stack frame for the function call *\/ virtual bool CallRemoteFunction( UFunction* Function, void* Parms, struct FOutParmRec* OutParms, FFrame* Stack ) {   return false; } <\/code><\/pre>\n<p>\u0423 \u0442\u043e\u0433\u043e \u0436\u0435 AActor\u2019\u0430 \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u044b, \u0438 \u0442\u0430\u043c \u043e\u043f\u044f\u0442\u044c \u0436\u0435, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0444\u043b\u0430\u0433\u0438 \u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0439 <code>UFunction.<\/code><\/p>\n<pre><code class=\"cpp\">\/\/ \/\/ Return whether a function should be executed remotely. \/\/ int32 AActor::GetFunctionCallspace( UFunction* Function, FFrame* Stack ) {   if (GAllowActorScriptExecutionInEditor)   {      \/\/ Call local, this global is only true when we know it's being called on an editor-placed object      DEBUG_CALLSPACE(TEXT(\"GetFunctionCallspace ScriptExecutionInEditor: %s\"), *Function->GetName());      return FunctionCallspace::Local;   }    if ((Function->FunctionFlags &amp; FUNC_Static) || (GetWorld() == nullptr))   {      \/\/ Use the same logic as function libraries for static\/CDO called functions, will try to use the global context to check authority only\/cosmetic      DEBUG_CALLSPACE(TEXT(\"GetFunctionCallspace Static: %s\"), *Function->GetName());       return GEngine->GetGlobalFunctionCallspace(Function, this, Stack);   } ... } <\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u0438 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e.<br \/>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 Blueprint, \u0442\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0435\u0435 \u0444\u0440\u0435\u0439\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438:<\/p>\n<pre><code class=\"cpp\">... if (Function->HasAnyFunctionFlags(FUNC_UbergraphFunction))      {         Frame = Function->GetOuterUClassUnchecked()->GetPersistentUberGraphFrame(this, Function);      } #endif      const bool bUsePersistentFrame = (NULL != Frame);      if (!bUsePersistentFrame)      {         Frame = (uint8*)FMemory_Alloca_Aligned(Function->PropertiesSize, Function->GetMinAlignment());         \/\/ zero the local property memory         FMemory::Memzero(Frame + Function->ParmsSize, Function->PropertiesSize - Function->ParmsSize);      }       \/\/ initialize the parameter properties      FMemory::Memcpy(Frame, Parms, Function->ParmsSize); ... <\/code><\/pre>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0444\u043b\u0430\u0433\u0430 <code>FUNC_HasOutParms<\/code>. \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0432\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u043c,\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0441\u0435 <code>FProperty<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0435\u0441\u0442\u044c \u043b\u0438 \u0444\u043b\u0430\u0433 <code>CPF_OutParm<\/code>, \u0438 \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c, \u0442\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u0434 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0445\u0440\u0430\u043d\u044f\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 out-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435,\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0442\u0443\u0434\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 <code>FProperty<\/code>, \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0432 \u0441\u0442\u044d\u043a <code>FFrame<\/code>.<\/p>\n<p>\u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c <strong>UFunction::Invoke()<\/strong>, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0442\u0443\u0434\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0441\u0442\u044d\u043a, \u0438 \u0430\u0434\u0440\u0435\u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"cpp\">Function->Invoke(this, NewStack, ReturnValueAddress);<\/code><\/pre>\n<h4>2.3 \u041e\u0448\u0438\u0431\u043a\u0430: <\/h4>\n<h4>&#171;#include found after .generated.h file &#8212; the .generated.h file should always be the last #include in a header&#187;  <\/h4>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 .generated.h \u0444\u0430\u0439\u043b \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c?<\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>SimplifiedClassParse()<\/code> \u0432 \u0444\u0430\u0439\u043b\u0435 <code>HeaderParser.cpp<\/code>.\u0412 \u043d\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433 .h \u0444\u0430\u0439\u043b\u043e\u0432. \u0427\u0430\u0441\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043d\u0438\u0436\u0435.<\/p>\n<p>\u0426\u0438\u043a\u043b \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0434\u0435\u0442 \u043f\u0430\u0440\u0441\u0438\u043d\u0433:<\/p>\n<pre><code class=\"cpp\">... for (const TCHAR* StartOfLine = Buffer; FParse::Line(&amp;Buffer, StrLine, true); StartOfLine = Buffer) {   CurrentLine++;    const TCHAR* Str = *StrLine;   bool bProcess = !bInComment;   \/\/ for skipping nested multi-line comments    int32 BraceCount = 0;   if( bProcess &amp;&amp; FParse::Command(&amp;Str,TEXT(\"#if\")) )   {   }   else if ( bProcess &amp;&amp; FParse::Command(&amp;Str,TEXT(\"#include\")) )   {      \/\/ Handle #include directives as if they were 'dependson' keywords.      const FString&amp; DependsOnHeaderName = Str;       if (DependsOnHeaderName != TEXT(\"\\\"UObject\/DefineUPropertyMacros.h\\\"\") &amp;&amp; DependsOnHeaderName != TEXT(\"\\\"UObject\/UndefineUPropertyMacros.h\\\"\"))      {         if (bFoundGeneratedInclude)         {            FUHTMessage(SourceFile, CurrentLine).Throwf(TEXT(\"#include found after .generated.h file - the .generated.h file should always be the last #include in a header\"));         }          bFoundGeneratedInclude = DependsOnHeaderName.Contains(TEXT(\".generated.h\"));         if (!bFoundGeneratedInclude &amp;&amp; DependsOnHeaderName.Len())         {            bool  bIsQuotedInclude = DependsOnHeaderName[0] == '\\\"';            int32 HeaderFilenameEnd = DependsOnHeaderName.Find(bIsQuotedInclude ? TEXT(\"\\\"\") : TEXT(\">\"), ESearchCase::CaseSensitive, ESearchDir::FromStart, 1);             if (HeaderFilenameEnd != INDEX_NONE)            {               \/\/ Include the extension in the name so that we later know where this entry came from.               SourceFile.GetIncludes().AddUnique(FHeaderProvider(EHeaderProviderSourceType::FileName, FPaths::GetCleanFilename(DependsOnHeaderName.Mid(1, HeaderFilenameEnd - 1))));            }         }      }   } ...<\/code><\/pre>\n<p>\u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>DependsOnHeaderName<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441 <code>include\u2019\u043e\u043c<\/code> \u0444\u0430\u0439\u043b\u043e\u0432 <code>UObject\/DefineUPropertyMacros.h<\/code><\/p>\n<p>\u0438\u043b\u0438 <code>UObject\/UndefineUPropertyMacros.h<\/code><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0432\u043e\u0439 \u0444\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043c, \u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>bFoundGeneratedInclude<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0431\u044b\u0442\u044c \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0435\u0449\u0435 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0448\u0430\u0433\u0435. \u041f\u0440\u043e\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0446\u0438\u043a\u043b \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 <code>.generated.h<\/code> \u0443\u0436\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u044d\u0442\u0438 depend-\u0444\u0430\u0439\u043b\u044b <code>DefineUPropertyMacros.h<\/code> \u0438 <code>UndefineUPropertyMacros.h<\/code>.:<\/p>\n<p>\u0412\u043e\u0442 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0438 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441, \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c:<\/p>\n<pre><code class=\"cpp\">DefineUPropertyMacros.h: \/\/ Copyright Epic Games, Inc. All Rights Reserved.  \/*=============================================================================   DefineUPropertyMacros.h: macro'ed typedefs for FProperties =============================================================================*\/  #ifndef UProperty   #define UProperty DEPRECATED_MACRO(4.25, \"UProperty has been renamed to FProperty\") FProperty #endif  #ifndef UNumericProperty   #define UNumericProperty DEPRECATED_MACRO(4.25, \"UNumericProperty has been renamed to FNumericProperty\") FNumericProperty #endif #ifndef UByteProperty   #define UByteProperty DEPRECATED_MACRO(4.25, \"UByteProperty has been renamed to FByteProperty\") FByteProperty #endif ...<\/code><\/pre>\n<pre><code class=\"cpp\">UndefineUPropertyMacros.h: \/\/ Copyright Epic Games, Inc. All Rights Reserved.  \/*=============================================================================   UndefineUPropertyMacros.h =============================================================================*\/  #ifdef UProperty   #undef UProperty #endif  #ifdef UNumericProperty   #undef UNumericProperty #endif  #ifdef UByteProperty   #undef UByteProperty #endif  #ifdef UInt8Property   #undef UInt8Property #endif  #ifdef UInt16Property   #undef UInt16Property #endif ... <\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u0444\u0430\u0439\u043b\u044b \u0433\u0434\u0435 \u043e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043d\u0435\u043a\u0438\u0439 \u0441\u043a\u043e\u0443\u043f, \u0433\u0434\u0435 \u0432\u0441\u0435 \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b.  <\/p>\n<pre><code class=\"cpp\">FieldPathProperty.cpp: \/\/ Copyright Epic Games, Inc. All Rights Reserved.  #include \"UObject\/FieldPathProperty.h\" #include \"UObject\/PropertyPortFlags.h\" #include \"UObject\/Package.h\" #include \"UObject\/UnrealTypePrivate.h\" #include \"UObject\/LinkerLoad.h\" #include \"UObject\/ConstructorHelpers.h\" #include \"Misc\/Parse.h\" #include \"UObject\/PropertyHelper.h\"  \/\/ WARNING: This should always be the last include in any file that needs it (except .generated.h) #include \"UObject\/UndefineUPropertyMacros.h\" \u2026 \u2026 bool FFieldPathProperty::SupportsNetSharedSerialization() const {   return false; }  #include \"UObject\/DefineUPropertyMacros.h\" \/\/\u041a\u043e\u043d\u0435\u0446 \u0444\u0430\u0439\u043b\u0430. <\/code><\/pre>\n<p>\u0422.\u0435 \u0447\u0442\u043e\u0431\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e,\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u044d\u0442\u043e\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 .<code>generated<\/code>.h \u0444\u0430\u0439\u043b \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c, \u0442.\u043a \u0446\u0435\u043f\u043e\u0447\u043a\u0430 <code>include\u2019\u043e\u0432<\/code> \u0432 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u044d\u0442\u0438\u043c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f\u043c.<\/p>\n<p>\u0425\u043e\u0442\u044f, \u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u0430. \u0422\u0430\u043a \u0447\u0442\u043e \u0431\u044b\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043d\u0430\u0441 \u0438\u0437\u0431\u0430\u0432\u044f\u0442 \u043e\u0442 \u043d\u0443\u0436\u0434\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c.<\/p>\n<h2>3. Unreal Header Tool.<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0441\u0430\u043c UHT \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041f\u0440\u043e\u0434\u0443\u043a\u0442 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438, \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u041a\u043e\u0441\u043d\u0435\u043c\u0441\u044f \u0435\u0433\u043e \u0432\u0441\u043a\u043e\u043b\u044c\u0437\u044c, \u0442.\u043a \u043e\u0431\u0437\u043e\u0440\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u0443\u0447\u0435\u0431\u043d\u0438\u043a \u043d\u0430 \u0442\u044b\u0441\u044f\u0447\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446.<\/p>\n<p>\u0412\u0441\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043f\u0440\u0438\u0432\u0435\u0442\u043b\u0438\u0432\u043e\u0433\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <code>INT32_MAIN_INT32_ARGC_TCHAR_ARGV<\/code>,<\/p>\n<p>\u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u0444\u0430\u0439\u043b\u0435 <code>Platform.h<\/code>, \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0432 \u0444\u0430\u0439\u043b\u0435 <code>UnrealHeadderToolMain<\/code>.<\/p>\n<pre><code class=\"cpp\">\/** * Application entry point * * @param  ArgC   Command-line argument count * @param  ArgV   Argument strings *\/ INT32_MAIN_INT32_ARGC_TCHAR_ARGV() {   FTaskTagScope Scope(ETaskTag::EGameThread);   FString CmdLine;    for (int32 Arg = 0; Arg &lt; ArgC; Arg++)   {      FString LocalArg = ArgV[Arg];      if (LocalArg.Contains(TEXT(\" \"), ESearchCase::CaseSensitive))      {         CmdLine += TEXT(\"\\\"\");         CmdLine += LocalArg;         CmdLine += TEXT(\"\\\"\"); ...<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0441\u0438\u0442\u0441\u044f \u0438\u043c\u044f \u0438\u0433\u0440\u044b \u0438 \u0444\u0430\u0439\u043b\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431\u043e \u0432\u0441\u0435\u0445 \u043c\u043e\u0434\u0443\u043b\u044f\u0445, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0439 UHT \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434.<\/p>\n<pre><code class=\"cpp\">... \/\/ Parse the game name or project filename.  UHT reads the list of plugins from there in case one of the plugins is UHT plugin. FString GameName = FParse::Token(CmdLinePtr, false);  \/\/ This parameter is the absolute path to the file which contains information about the modules \/\/ that UHT needs to generate code for. ModuleInfoFilename = FParse::Token(CmdLinePtr, false ); ...<\/code><\/pre>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u044d\u0442\u043e\u0439 main \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u0441 \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442.<\/p>\n<pre><code class=\"cpp\">extern ECompilationResult::Type UnrealHeaderTool_Main(const FString&amp; ModuleInfoFilename); ECompilationResult::Type Result = UnrealHeaderTool_Main(ModuleInfoFilename); return Result;<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>UnrealHeaderTool_Main:<\/code><\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u0442\u0430\u0439\u043c\u0435\u0440, \u043e\u0442\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0432\u0440\u0435\u043c\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u044c \u043a \u043c\u043e\u0434\u0443\u043b\u044f\u043c, \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>FManifest::LoadFromFile<\/code><\/p>\n<pre><code class=\"cpp\">ECompilationResult::Type UnrealHeaderTool_Main(const FString&amp; ModuleInfoFilename) {   double MainTime = 0.0;   FDurationTimer MainTimer(MainTime);   MainTimer.Start();    check(GIsUCCMakeStandaloneHeaderGenerator);    FString ModuleInfoPath = FPaths::GetPath(ModuleInfoFilename);    \/\/ The meta data keywords must be initialized prior to going wide   FBaseParser::InitMetadataKeywords();    \/\/ Load the manifest file, giving a list of all modules to be processed, pre-sorted by dependency ordering   FResults::Try([&amp;ModuleInfoFilename]() { GManifest = FManifest::LoadFromFile(ModuleInfoFilename); });    TArray&lt;FUnrealSourceFile*> OrderedSourceFiles;   TArray&lt;FUnrealPackageDefinitionInfo*> PackageDefs;   PackageDefs.Reserve(GManifest.Modules.Num());    double TotalPrepareModuleTime = FResults::TimedTry([&amp;PackageDefs, &amp;ModuleInfoPath]() { PrepareModules(PackageDefs, ModuleInfoPath); }); ...<\/code><\/pre>\n<p><code>FManifest<\/code> &#8212; \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0432\u0441\u0435\u0445 \u043c\u043e\u0434\u0443\u043b\u044f\u0445 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0442.\u0435 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0430\u0440\u0441\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u043c\u0438. \u0422\u0430\u043a\u0436\u0435 \u0442\u0430\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u0430 \u0438 \u043f\u0443\u0442\u0438 root \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.  <\/p>\n<pre><code class=\"cpp\">struct FManifest {   bool    IsGameTarget;   FString RootLocalPath;   FString RootBuildPath;   FString TargetName;   FString ExternalDependenciesFile;     \/** Ordered list of modules that define UObjects or UStructs, which we may need to generate       code for.  The list is in module dependency order, such that most dependent modules appear first. *\/   TArray&lt;FManifestModule> Modules;    \/**    * Loads a *.uhtmanifest from the specified filename.    *    * @param Filename The filename of the manifest to load.    * @return The loaded module info.    *\/   static FManifest LoadFromFile(const FString&amp; Filename);    friend FArchive&amp; operator&lt;&lt;(FArchive&amp; Ar, FManifest&amp; Manifest)   {      Ar &lt;&lt; Manifest.IsGameTarget;      Ar &lt;&lt; Manifest.RootLocalPath;      Ar &lt;&lt; Manifest.RootBuildPath;      Ar &lt;&lt; Manifest.TargetName;      Ar &lt;&lt; Manifest.Modules;           return Ar;   } }; <\/code><\/pre>\n<p>\u0412 \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u043e\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0439\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<ul>\n<li>\n<p>\u0418\u043c\u044f \u043c\u043e\u0434\u0443\u043b\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0438\u043f \u043c\u043e\u0434\u0443\u043b\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043c\u044f \u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043f\u0438\u0441\u043a\u0438 public-header \u0438 private-header \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 UObject \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 public-header \u0444\u0430\u0439\u043b\u044b \u0438 \u043f\u0440.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"cpp\">struct FManifestModule {   \/** The name of the module *\/   FString Name;    \/** Module type *\/   EBuildModuleType::Type ModuleType;    \/** Overridden package settings to add additional flags that can help with organization *\/   EPackageOverrideType::Type OverrideModuleType;    \/** Long package name for this module's UObject class *\/   FString LongPackageName;    \/** Base directory of this module on disk *\/   FString BaseDirectory;    \/** The directory to which #includes from this module should be relative *\/   FString IncludeBase;    \/** Directory where generated include files should go *\/   FString GeneratedIncludeDirectory; ... <\/code><\/pre>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043a\u0430\u043a\u043e\u0433\u043e \u0432\u0438\u0434\u0430 \u0431\u044b\u0432\u0430\u044e\u0442 \u043c\u043e\u0434\u0443\u043b\u0438:<\/p>\n<pre><code class=\"cpp\">struct EBuildModuleType {   enum Type   {      Program,      EngineRuntime,      EngineUncooked,      EngineDeveloper,      EngineEditor,      EngineThirdParty,      GameRuntime,      GameUncooked,      GameDeveloper,      GameEditor,      GameThirdParty,      \/\/ NOTE: If you add a new value, make sure to update the ToString() method below!       Max   }; ...<\/code><\/pre>\n<p>\u0422.\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0440\u0430\u0437\u043d\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e. \u041a\u0430\u043a\u0438\u0435 \u0442\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0434\u0432\u0438\u0436\u043a\u0430 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435,\u043a\u0430\u043a\u0438\u0435 \u0442\u043e \u0434\u043b\u044f \u0441\u0430\u043c\u043e\u0439 \u0438\u0433\u0440\u044b (\u0431\u0438\u043b\u0434\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439).<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 <code>Manifest<\/code> \u0444\u0430\u0439\u043b\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0433\u0440\u0443\u0437\u043a\u0430 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0438 \u0441\u0430\u043c \u043f\u0430\u0440\u0441\u0438\u043d\u0433. \u0412 \u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043a \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043b\u044f\u043c\u0431\u0434\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>TimedTry<\/code>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0434\u043b\u044f \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <code>try-catch<\/code> \u0431\u043b\u043e\u043a\u0430.<\/p>\n<pre><code class=\"cpp\">\/** * Invoke the given lambda in a try block catching all supported exception types. * @param InLambda The code to be executed in the try block * @return The time in seconds it took to execute the lambda *\/ template&lt;typename Lambda> static double TimedTry(Lambda&amp;&amp; InLambda) {   double DeltaTime = 0.0;   {      FScopedDurationTimer Timer(DeltaTime);      Try(InLambda);   }   return DeltaTime; } ...  void PrepareModules(TArray&lt;FUnrealPackageDefinitionInfo*>&amp; PackageDefs, const FString&amp; ModuleInfoPath)  ... <\/code><\/pre>\n<p>\u0412 <code>PrepareModules()<\/code> \u0438\u0437 Manifest \u0444\u0430\u0439\u043b\u0430 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043c\u043e\u0434\u0443\u043b\u044f\u0445 <strong>(FManifestModule)<\/strong> \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e Package\u2019\u0430\u0445 <strong>(FUnrealPackageDefinitionInfo)<\/strong>.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0430\u043c \u043f\u0430\u043a\u0435\u0442 \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u044f. \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 __API \u043c\u0430\u043a\u0440\u043e\u0441.<\/p>\n<pre><code class=\"cpp\">\/\/ Create the package definition TSharedRef&lt;FUnrealPackageDefinitionInfo> PackageDefRef = MakeShared&lt;FUnrealPackageDefinitionInfo>(Module, Package); FUnrealPackageDefinitionInfo&amp; PackageDef = *PackageDefRef; GTypeDefinitionInfoMap.AddNameLookup(PackageDef); PackageDefs.Add(&amp;PackageDef)<\/code><\/pre>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438. \u0412 \u043f\u0430\u043a\u0435\u0442\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 \u0438 \u043a\u043b\u0430\u0441\u0441\u0430\u0445 \u043f\u043e\u0434\u043b\u0435\u0436\u0430\u0449\u0438\u0445 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0443.\u00a0 \u041d\u0443 \u0438 \u0435\u0449\u0435 \u043d\u0435\u043a\u0430\u044f meta \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">\/\/FUnrealPackageDefinitionInfo private:   const FManifestModule&amp; Module;   TArray&lt;TSharedRef&lt;FUnrealSourceFile>> AllSourceFiles;   TArray&lt;TSharedRef&lt;FUnrealTypeDefinitionInfo>> AllClasses;   FString SingletonName;   FString SingletonNameChopped;   FString ExternDecl;   FString ShortUpperName;   FString API;   bool bWriteClassesH = false; };<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0446\u0438\u043a\u043b \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e <code>PublicClassesHeaders<\/code> \u043f\u043e\u0442\u043e\u043c <code>PublicHeaders<\/code> \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 <code>InternalHeaders<\/code>.<\/p>\n<p>\u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0432\u0441\u0435 <code>Module.PublicUObjectClassesHeaders<\/code><\/p>\n<p><code>Module.PublicUObjectHeaders<\/code> \u0438 <code>Module.InternalUObjectHeaders<\/code>, \u0438\u0437 \u043d\u0438\u0445 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>FUnrealSourceFile<\/code> \u0438 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 <code>AllSourceFiles<\/code> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0445\u0435\u0434\u0434\u0435\u0440\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">if (NormalizedFullFilename != NormalizedExistingFilename) {   FUHTMessage(*UnrealSourceFile).LogError(TEXT(\"Duplicate leaf header name found: %s (original: %s)\"), *NormalizedFullFilename, *NormalizedExistingFilename); }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u043a\u0435\u0442\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u043e\u043d\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f out \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432\u043e \u0432\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">double TotalPreparseTime = FResults::TimedTry([&amp;PackageDefs, &amp;ModuleInfoPath]() { PreparseSources(PackageDefs, ModuleInfoPath); }); double TotalDefineTypesTime = FResults::TimedTry([&amp;PackageDefs]() { DefineTypes(PackageDefs); }); double TotalResolveParentsTime = FResults::TimedTry([&amp;PackageDefs]() { ResolveParents(PackageDefs); }); double TotalPrepareTypesForParsingTime = FResults::TimedTry([&amp;PackageDefs]() { PrepareTypesForParsing(PackageDefs); }); double TotalTopologicalSortTime = FResults::TimedTry([&amp;OrderedSourceFiles]() { TopologicalSort(OrderedSourceFiles); }); double TotalParseTime = FResults::TimedTry([&amp;OrderedSourceFiles]() { ParseSourceFiles(OrderedSourceFiles); }); double TotalPostParseFinalizeTime = FResults::TimedTry([&amp;PackageDefs]() { PostParseFinalize(PackageDefs); }); TotalTopologicalSortTime += FResults::TimedTry([&amp;OrderedSourceFiles]() { TopologicalSort(OrderedSourceFiles); }); \/\/ Sort again to include new dependencies double TotalCodeGenTime = FResults::TimedTry([&amp;PackageDefs, &amp;OrderedSourceFiles]() { Export(PackageDefs, OrderedSourceFiles); }); double TotalCheckForScriptPluginsTime = FResults::TimedTry([&amp;ScriptPlugins]() { GetScriptPlugins(ScriptPlugins); }); double TotalCreateEngineTypesTime = ScriptPlugins.IsEmpty() ? 0.0 : FResults::TimedTry([&amp;PackageDefs]() { CreateEngineTypes(PackageDefs); }); double TotalPluginTime = ScriptPlugins.IsEmpty() ? 0.0 : FResults::TimedTry([&amp;ScriptPlugins, &amp;PackageDefs, &amp;ExternalDependencies]() { ExportToScriptPlugins(ScriptPlugins, PackageDefs, ExternalDependencies); }); double TotalWriteExternalDependenciesTime = FResults::TimedTry([&amp;ExternalDependencies]() { WriteExternalDependencies(ExternalDependencies); }); double TotalSummaryTime = FResults::TimedTry([&amp;PackageDefs]() { GenerateSummary(PackageDefs); }); <\/code><\/pre>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 <code>PreparseSources()<\/code>.<\/p>\n<p>\u0412 \u043d\u0435\u043c:<\/p>\n<ul>\n<li>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u044b\u0439 \u0435\u0433\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433.<\/p>\n<\/li>\n<\/ul>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0430\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433:<\/p>\n<pre><code class=\"cpp\">void PreparseSources(TArray&lt;FUnrealPackageDefinitionInfo*>&amp; PackageDefs, const FString&amp; ModuleInfoPath) { #if UHT_ENABLE_CONCURRENT_PREPARSING   FGraphEventArray LoadTasks;   LoadTasks.Reserve(1024); \/\/ Fairly arbitrary number   for (FUnrealPackageDefinitionInfo* PackageDef : PackageDefs)   {      for (TSharedRef&lt;FUnrealSourceFile>&amp; SourceFile : PackageDef->GetAllSourceFiles())      {          \/\/ Phase #1: Load the file         auto LoadLambda = [&amp;SourceFile = *SourceFile, &amp;ModuleInfoPath]()         {            LoadSource(SourceFile, ModuleInfoPath);         };          \/\/ Phase #2: Perform simplified class parse (can run concurrenrtly)         auto PreProcessLambda = [&amp;SourceFile = *SourceFile]()         {            PreparseSource(SourceFile);         }; ...    }; <\/code><\/pre>\n<p>\u0412 \u043d\u0435\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>FHeaderParser::SimplifiedClassParse()<\/code> \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 <code>SourceFile.<\/code><\/p>\n<pre><code class=\"cpp\">... \/\/ Parse the header to extract the information needed FUHTStringBuilder ClassHeaderTextStrippedOfCppText; FHeaderParser::SimplifiedClassParse(SourceFile, *SourceFile.GetContent(), \/*out*\/ ClassHeaderTextStrippedOfCppText); SourceFile.SetContent(MoveTemp(ClassHeaderTextStrippedOfCppText)); ...<\/code><\/pre>\n<p>\u0418 \u0432 <code>SimplifiedClassParse()<\/code> \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438\u0437 \u0445\u0435\u0434\u0435\u0440\u0430.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 <code>#else-#if<\/code> \u0434\u0435\u0440\u0435\u043a\u0442\u0438\u0432, \u0438 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u044b\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">... bool bIsDirective = false; if( FParse::Command(&amp;Str,TEXT(\"#endif\")) ) {    ...    else if( FParse::Command(&amp;Str,TEXT(\"#if\")) || FParse::Command(&amp;Str,TEXT(\"#ifdef\")) || FParse::Command(&amp;Str,TEXT(\"#ifndef\")) ) {    ...  FUHTMessage(SourceFile, CurrentLine).Throwf(   TEXT(\"Mixing %s with %s in an #elif preprocessor block is not supported\"),   GetBlockDirectiveTypeString(OldDirective),   GetBlockDirectiveTypeString(NewDirective) );    ...    const TCHAR* FoundSubstr = nullptr; if (FindInitialStr(FoundSubstr, TrimmedStrLine, TEXT(\"UPROPERTY\"))   || FindInitialStr(FoundSubstr, TrimmedStrLine, TEXT(\"UCLASS\"))   || FindInitialStr(FoundSubstr, TrimmedStrLine, TEXT(\"USTRUCT\"))   || FindInitialStr(FoundSubstr, TrimmedStrLine, TEXT(\"UENUM\"))   || FindInitialStr(FoundSubstr, TrimmedStrLine, TEXT(\"UINTERFACE\"))   || FindInitialStr(FoundSubstr, TrimmedStrLine, TEXT(\"UDELEGATE\"))   || FindInitialStr(FoundSubstr, TrimmedStrLine, TEXT(\"UFUNCTION\"))) {   FUHTMessage(SourceFile, CurrentLine).Throwf(TEXT(\"%s must not be inside preprocessor blocks, except for WITH_EDITORONLY_DATA\"), FoundSubstr); }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0431\u043b\u043e\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u043d\u0435\u0435 \u0432\u0438\u0434\u0435\u043b\u0438:<br \/>\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u0432 \u0444\u0430\u0439\u043b \u0445\u0435\u0434\u0434\u0435\u0440\u044b:<\/p>\n<pre><code class=\"cpp\">... for (const TCHAR* StartOfLine = Buffer; FParse::Line(&amp;Buffer, StrLine, true); StartOfLine = Buffer) {   CurrentLine++;    const TCHAR* Str = *StrLine;   bool bProcess = !bInComment;   \/\/ for skipping nested multi-line comments    int32 BraceCount = 0;   if( bProcess &amp;&amp; FParse::Command(&amp;Str,TEXT(\"#if\")) )   {   }   else if ( bProcess &amp;&amp; FParse::Command(&amp;Str,TEXT(\"#include\")) )   {      \/\/ Handle #include directives as if they were 'dependson' keywords.      const FString&amp; DependsOnHeaderName = Str;       if (DependsOnHeaderName != TEXT(\"\\\"UObject\/DefineUPropertyMacros.h\\\"\") &amp;&amp; DependsOnHeaderName != TEXT(\"\\\"UObject\/UndefineUPropertyMacros.h\\\"\"))      {         if (bFoundGeneratedInclude)         {            FUHTMessage(SourceFile, CurrentLine).Throwf(TEXT(\"#include found after .generated.h file - the .generated.h file should always be the last #include in a header\"));         } ...<\/code><\/pre>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0432 \u043a\u043e\u0434\u0435, \u0434\u0430\u0431\u044b \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u043a\u043e\u0434:  <\/p>\n<pre><code class=\"cpp\">\/\/ look for a \/ * ... * \/ block, ignoring anything inside literal strings Pos = StrLine.Find(TEXT(\"\/*\"), ESearchCase::CaseSensitive, ESearchDir::FromStart, Pos); EndPos = StrLine.Find(TEXT(\"*\/\"), ESearchCase::CaseSensitive, ESearchDir::FromStart, FMath::Max(0, Pos - 1));<\/code><\/pre>\n<p>\u0418 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u00a0 \u0431\u043b\u043e\u043a\u043e\u043c \u0438\u0437 5-\u0442\u0438 \u0431\u043b\u043e\u043a\u043e\u0432 if-else:<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043d\u0430\u0439\u0442\u0438:<code>UINTERFACE<\/code><\/p>\n<pre><code class=\"cpp\">\/\/ Get class or interface name if (const TCHAR* UInterfaceMacroDecl = FCString::Strfind(Str, TEXT(\"UINTERFACE\"))) {   if (UInterfaceMacroDecl == FCString::Strspn(Str, TEXT(\"\\t \")) + Str)   {      if (UInterfaceMacroDecl[10] != TEXT('('))      {         FUHTMessage(SourceFile, CurrentLine).Throwf(TEXT(\"Missing open parenthesis after UINTERFACE\"));      }       TSharedRef&lt;FUnrealTypeDefinitionInfo> ClassDecl = Parser.ParseClassDeclaration(StartOfLine + (UInterfaceMacroDecl - Str), CurrentLine, true, TEXT(\"UINTERFACE\"));      bGeneratedIncludeRequired |= !ClassDecl->AsClassChecked().HasAnyClassFlags(CLASS_NoExport);      SourceFile.AddDefinedClass(MoveTemp(ClassDecl));   } } <\/code><\/pre>\n<p>\u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c:<code>UCLASS<\/code><\/p>\n<pre><code class=\"cpp\">else if (const TCHAR* UClassMacroDecl = FCString::Strfind(Str, TEXT(\"UCLASS\"))) {   if (UClassMacroDecl == FCString::Strspn(Str, TEXT(\"\\t \")) + Str)   {      if (UClassMacroDecl[6] != TEXT('('))      {         FUHTMessage(SourceFile, CurrentLine).Throwf(TEXT(\"Missing open parenthesis after UCLASS\"));      }       TSharedRef&lt;FUnrealTypeDefinitionInfo> ClassDecl = Parser.ParseClassDeclaration(StartOfLine + (UClassMacroDecl - Str), CurrentLine, false, TEXT(\"UCLASS\"));      bGeneratedIncludeRequired |= !ClassDecl->AsClassChecked().HasAnyClassFlags(CLASS_NoExport);      SourceFile.AddDefinedClass(MoveTemp(ClassDecl));   } }<\/code><\/pre>\n<p>\u0418 \u0442.\u0434<\/p>\n<p>\u0418 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0414\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>ParseClassDeclaration<\/code><\/p>\n<p>\u0414\u043b\u044f \u0435\u043d\u0430\u043c\u0430 <code>ParseEnumDeclaration<\/code> \u0438 \u0442.\u043f<\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u043a\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<pre><code class=\"cpp\">TSharedRef&lt;FUnrealTypeDefinitionInfo> FHeaderPreParser::ParseClassDeclaration(const TCHAR* InputText, int32 InLineNumber, bool bClassIsAnInterface, const TCHAR* StartingMatchID) {   const TCHAR* ErrorMsg = TEXT(\"Class declaration\");   ResetParser(InputText, InLineNumber);   \/\/ Require 'UCLASS' or 'UINTERFACE'   RequireIdentifier(StartingMatchID, ESearchCase::CaseSensitive, ErrorMsg); ...<\/code><\/pre>\n<p>\u0412 <code>ResetParser()<\/code> \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0432 \u043f\u0430\u0440\u0441\u0435\u0440\u0435. \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f, \u0435\u0435 \u043d\u043e\u0440\u043c\u0435 \u0438 \u043f\u0440. \u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, \u0442.\u0435 \u0431\u0443\u0444\u0435\u0440.<\/p>\n<p>\u041e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u043e\u043a\u0435\u043d\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">\/\/ Require 'UCLASS' or 'UINTERFACE' RequireIdentifier(StartingMatchID, ESearchCase::CaseSensitive, ErrorMsg);<\/code><\/pre>\n<p>\u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0441\u0430\u043c \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0432\u0441\u0435\u0445 <code>UPROPERTY<\/code> \u0438 <code>UFUNCTION<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>ReadSpecifierSetInsideMacro().<\/code><\/p>\n<pre><code class=\"cpp\">\/\/ Reads a set of specifiers (with optional values) inside the () of a new-style metadata macro like UPROPERTY or UFUNCTION void FBaseParser::ReadSpecifierSetInsideMacro(TArray&lt;FPropertySpecifier>&amp; SpecifiersFound, const TCHAR* TypeOfSpecifier, TMap&lt;FName, FString>&amp; MetaData) {   int32 FoundSpecifierCount = 0;   auto ErrorMessageGetter = [TypeOfSpecifier]() { return FString::Printf(TEXT(\"%s declaration specifier\"), TypeOfSpecifier); };   RequireSymbol(TEXT('('), ErrorMessageGetter); ... <\/code><\/pre>\n<p>\u0412 \u043d\u0435\u0439 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430, \u0438 \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u0442\u043e \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 <code>MetaData<\/code> \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>ApplyToMetadata()<\/code>.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e:<br \/>             \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440:<\/p>\n<pre><code class=\"cpp\">\/\/ Require 'class' RequireIdentifier(TEXT(\"class\"), ESearchCase::CaseSensitive, ErrorMsg);<\/code><\/pre>\n<p>           \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 API \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<pre><code class=\"cpp\"> \/\/ Read the class name FString RequiredAPIMacroIfPresent; FString ClassName; ParseNameWithPotentialAPIMacroPrefix(\/*out*\/ ClassName, \/*out*\/ RequiredAPIMacroIfPresent, StartingMatchID); <\/code><\/pre>\n<p>          \u041f\u0430\u0440\u0441\u0438\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<p>\u0412\u0441\u0435 \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>ClassDef<\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f:  <\/p>\n<pre><code class=\"cpp\">TSharedRef&lt;FUnrealTypeDefinitionInfo> ClassDecl = Parser.ParseClassDeclaration(StartOfLine + (UClassMacroDecl - Str), CurrentLine, false, TEXT(\"UCLASS\"));<\/code><\/pre>\n<p>\u0421\u0430\u043c\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043a\u043b\u0430\u0441\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 <code>SourceFile<\/code> \u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f.\u0412\u0441\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u0435\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 \u0432 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435. \u0422.\u0435 \u0435\u0441\u043b\u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043f\u0440\u043e\u0448\u0435\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443.<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0435 \u0435\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u201cProcess_X\u201d \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445\u0441\u044f \u0432 SourceFile<\/p>\n<p>\u043a\u043b\u0430\u0441\u0441\u043e\u0432,\u0435\u043d\u0430\u043c\u043e\u0432,\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0438 \u043f\u0440.<\/p>\n<pre><code class=\"cpp\">double TotalDefineTypesTime = FResults::TimedTry([&amp;PackageDefs]() { DefineTypes(PackageDefs); });<\/code><\/pre>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0435 \u0435\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <em>\u201cProcess_X\u201d<\/em> \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445\u0441\u044f \u0432 <code>SourceFile<\/code>\u043a\u043b\u0430\u0441\u0441\u043e\u0432,\u0435\u043d\u0430\u043c\u043e\u0432,\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0438 \u043f\u0440.<\/p>\n<p>\u0414\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">for (TSharedRef&lt;FUnrealTypeDefinitionInfo>&amp; TypeDef : SourceFile.GetDefinedClasses()) {   FUnrealClassDefinitionInfo&amp; ClassDef = TypeDef->AsClassChecked();   ProcessParsedClass(ClassDef);   GTypeDefinitionInfoMap.AddNameLookup(UHTCastChecked&lt;FUnrealObjectDefinitionInfo>(TypeDef));   AllClasses.Add(TypeDef); } \u2026 <\/code><\/pre>\n<p>\u0414\u043b\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440:<\/p>\n<pre><code class=\"cpp\">... for (TSharedRef&lt;FUnrealTypeDefinitionInfo>&amp; TypeDef : SourceFile.GetDefinedStructs()) {   FUnrealScriptStructDefinitionInfo&amp; ScriptStructDef = TypeDef->AsScriptStructChecked();   ProcessParsedStruct(ScriptStructDef);   GTypeDefinitionInfoMap.AddNameLookup(UHTCastChecked&lt;FUnrealObjectDefinitionInfo>(TypeDef)); } ... <\/code><\/pre>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 <code>ProcessParsedClass()<\/code>:<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u043f\u0440\u0435\u0444\u0438\u043a\u0441:<\/p>\n<pre><code class=\"cpp\">\/\/ All classes must start with a valid unreal prefix if (!FHeaderParser::ClassNameHasValidPrefix(ClassName, ClassNameStripped)) {   ClassDef.Throwf(TEXT(\"Invalid class name '%s'. The class name must have an appropriate prefix added (A for Actors, U for other classes).\"), *ClassName); }<\/code><\/pre>\n<p>\u041d\u0430 \u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<pre><code class=\"cpp\">if(FHeaderParser::IsReservedTypeName(ClassNameStripped)) {   ClassDef.Throwf(TEXT(\"Invalid class name '%s'. Cannot use a reserved name ('%s').\"), *ClassName, *ClassNameStripped); }<\/code><\/pre>\n<p>\u0422\u043e \u0447\u0442\u043e \u043a\u043b\u0430\u0441\u0441 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 UObject\u2019\u0430:<\/p>\n<pre><code class=\"cpp\">if (BaseClassName.IsEmpty() &amp;&amp; (ClassName != TEXT(\"UObject\"))) {   ClassDef.Throwf(TEXT(\"Class '%s' must inherit UObject or a UObject-derived class\"), *ClassName); }<\/code><\/pre>\n<p>\u0414\u0430\u0436\u0435 \u043d\u0430 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0431\u044f&#8230;<\/p>\n<pre><code class=\"cpp\">if (ClassName == BaseClassName) {   ClassDef.Throwf(TEXT(\"Class '%s' cannot inherit from itself\"), *ClassName); }<\/code><\/pre>\n<p>\u0411\u043b\u0438\u0436\u0435 \u043a \u043a\u043e\u043d\u0446\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a <code>UClass\u2019\u0430<\/code>:<\/p>\n<pre><code class=\"cpp\">UClass* ResultClass = FEngineAPI::FindObject&lt;UClass>(ANY_PACKAGE,*ClassNameStripped);<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0438\u0441\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 <code>ClassDef.<\/code><\/p>\n<pre><code class=\"cpp\">ClassDef.InitializeFromExistingUObject(ResultClass); ClassDef.SetObject(ResultClass);<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0432 <code>ResolveParents<\/code> \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438\u0437 <code>PackageDefs<\/code>.<\/p>\n<p>\u041e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f ResolveSuperClasses.\u0412\u043d\u0443\u0442\u0440\u0438 \u0438\u0449\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u0437 ClassDef.\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u043b\u0430\u0433\u0438 \u0438 \u0441\u0430\u043c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c.<\/p>\n<pre><code class=\"cpp\">SuperClassInfo.Struct = FoundBaseClassDef; ClassDef.SetClassCastFlags(FoundBaseClassDef->GetClassCastFlags()); if (Class != nullptr) {   Class->SetSuperStruct(FoundBaseClassDef->GetClass()); } <\/code><\/pre>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043f\u043e\u0438\u0441\u043a \u043d\u0435 \u0443\u0432\u0435\u043d\u0447\u0430\u043b\u0441\u044f \u0443\u0441\u043f\u0435\u0445\u043e\u043c, \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"cpp\">if (FoundBaseClassDef == nullptr) {   \/\/ Don't know its parent class. Raise error.   ClassDef.Throwf(TEXT(\"Couldn't find parent type for '%s' named '%s' in current module (Package: %s) or any other module parsed so far.\"), *ClassDef.GetName(), *BaseClassName, PackageName); }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432 \u043a <code>PrepareTypesForParsing()<\/code>.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e\u2026<\/p>\n<pre><code class=\"cpp\">void PrepareTypesForParsing(TArray&lt;FUnrealPackageDefinitionInfo*>&amp; PackageDefs) {   \/\/ Does nothing now }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>TopologicalSort<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u044f\u0441\u043d\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432,\u00a0\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 \u044d\u0442\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0437 \u043d\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f <code>OrderedSourceFiles<\/code>,\u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0442\u0443\u0434\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430, \u0438 \u043f\u043e\u043c\u0435\u0447\u0430\u044f \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u043d\u0435\u0433\u043e \u043a\u0430\u043a <code>Unmarked<\/code>.<\/p>\n<pre><code class=\"cpp\">... const TArray&lt;FUnrealSourceFile*>&amp; UnorderedSourceFiles = GUnrealSourceFilesMap.GetAllSourceFiles(); OrderedSourceFiles.Reset(UnorderedSourceFiles.Num()); for (FUnrealSourceFile* SourceFile : UnorderedSourceFiles) {   SourceFile->SetTopologicalState(ETopologicalState::Unmarked); } ...<\/code><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>TopologicalVisit<\/code>, \u043a\u0443\u0434\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f out \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>OrderedSourceFiles<\/code> \u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 SourceFile, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u0443\u0436\u0435 \u0432 \u043d\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u044b, \u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043d\u0438\u0445 \u0442\u0430\u043a \u0436\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>TopologicalVisit<\/code>.<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u043c\u0430\u0440\u043a\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0432\u044b\u0437\u043e\u0432 \u043f\u0440\u043e\u0448\u0435\u043b \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e <code>Permanent<\/code> \u0438 \u0444\u0430\u0439\u043b \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 <code>OrderedSourceFiles<\/code>.<\/p>\n<p>\u0421\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043e\u0431\u0445\u043e\u0434 \u0433\u0440\u0430\u0444\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443.<\/p>\n<p>\u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430: \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c, \u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0431\u0440\u043e\u0448\u0435\u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437 \u0432\u0438\u0434\u0435\u043b\u0438: &#171;<strong><em>Circular dependency detected&#187;.<\/em><\/strong><\/p>\n<pre><code class=\"cpp\">... if (FUnrealSourceFile* Recusion = TopologicalVisit(OrderedSourceFiles, *SourceFile)) {   UE_LOG(LogCompile, Error, TEXT(\"Circular dependency detected:\"));   TopologicalRecursion(*Recusion, *Recusion);   FResults::SetResult(ECompilationResult::OtherCompilationError);   return; } ... <\/code><\/pre>\n<p>\u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 <code>ParseSourceFiles<\/code>.<\/p>\n<p>\u0422\u0430\u043c \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 <code>TArray&lt;FParseCPP> ParsedCPPs<\/code>;, \u0432 \u043d\u0435\u043c \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u043e:<\/p>\n<p><code>ParsedCPPs.Reserve(OrderedSourceFiles.Num());<\/code>\u0418 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0433\u0434\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430: \u041f\u0430\u043a\u0435\u0442 \u0438 \u0444\u0430\u0439\u043b:<\/p>\n<p><code>FParseCPP(FUnrealPackageDefinitionInfo&amp; InPackageDef, FUnrealSourceFile&amp;)<\/code><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u0422\u0430\u0441\u043e\u043a &#8212; \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0445 \u0437\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0438\u0445 \u0442\u0438\u043f: <code>FGraphEvent<\/code>.<\/p>\n<p>\u0412 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 <code>FParseCPP<\/code> \u0434\u0430\u0436\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0442\u0440\u0435\u0442\u044c\u0435 \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438:<\/p>\n<pre><code class=\"cpp\">struct FParseCPP {   FParseCPP(FUnrealPackageDefinitionInfo&amp; InPackageDef, FUnrealSourceFile&amp; InSourceFile)      : PackageDef(InPackageDef)      , SourceFile(InSourceFile)   {}    \/**    * The package definition being exported    *\/   FUnrealPackageDefinitionInfo&amp; PackageDef;    \/**    * The source file being exported    *\/   FUnrealSourceFile&amp; SourceFile;    \/**    * This task represents the task that parses the source    *\/   FGraphEventRef ParseTaskRef; }; <\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0446\u0438\u043a\u043b \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u0432 ParsedCPPs \u0432\u044b\u0437\u044b\u0432\u0430\u044f \u0434\u043b\u044f \u043d\u0435\u0433\u043e;<\/p>\n<p><code>FHeaderParser::Parse(ParsedCPP.PackageDef, ParsedCPP.SourceFile);<\/code><\/p>\n<p>\u0413\u0434\u0435 <code>ParsedCPP<\/code> &#8212; \u044d\u043b\u043c\u0435\u043d\u0442 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430.<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>FHeaderParser<\/code> \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>ParseHeader()<\/code><\/p>\n<p>\u0422\u0430\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u0430\u0440\u0441\u044f\u0442\u0441\u044f \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>FixupDelegateProperties()<\/code>, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c:<\/p>\n<pre><code class=\"cpp\">... \/\/ Make sure the compilation ended with valid nesting. if (bEncounteredNewStyleClass_UnmatchedBrackets) {   Throwf(TEXT(\"Missing } at end of class\") ); }  if (NestLevel == 1) {   Throwf(TEXT(\"Internal nest inconsistency\") ); } else if (NestLevel > 2) {   Throwf(TEXT(\"Unexpected end of script in '%s' block\"), NestTypeName(TopNest->NestType) ); } ...<\/code><\/pre>\n<p>\u0418 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e <code>FUnrealClassDefinitionInfo<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>PostParsingClassSetup()<\/code>, \u0433\u0434\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0444\u043b\u0430\u0433\u0438:<\/p>\n<pre><code class=\"cpp\">... \/\/ Set the class config flag if any properties have config for (TSharedRef&lt;FUnrealPropertyDefinitionInfo> PropertyDef : ClassDef.GetProperties()) {   if (PropertyDef->HasAnyPropertyFlags(CPF_Config))   {      ClassDef.SetClassFlags(CLASS_Config);      break;   } } ...<\/code><\/pre>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 <code>.generated.h<\/code> \u0444\u0430\u0439\u043b\u0430:<\/p>\n<pre><code class=\"cpp\">if (!bSpottedAutogeneratedHeaderInclude &amp;&amp; !bEmptyFile &amp;&amp; !bNoExportClassesOnly) {   const FString&amp; ExpectedHeaderName = SourceFile.GetGeneratedHeaderFilename();   Throwf(TEXT(\"Expected an include at the top of the header: '#include \\\"%s\\\"'\"), *ExpectedHeaderName); }<\/code><\/pre>\n<p>\u041d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0444\u0438\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430, \u0432\u044b\u0437\u044b\u0432\u0430\u044f <code>PostParseFinalize()<\/code>.<\/p>\n<p>\u0412 \u043d\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u0430\u043a\u0435\u0442 &#8212; \u043d\u0435 \u0438\u043c\u0435\u044e\u0449\u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432, \u043d\u043e \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u0441\u0435 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u0442\u0438\u043f\u044b, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <em>\u0444\u0438\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e<\/em>.<\/p>\n<pre><code class=\"cpp\">TArray&lt;FUnrealTypeDefinitionInfo*> NoSourceTypeDefs; GTypeDefinitionInfoMap.ForAllTypesByName([&amp;NoSourceTypeDefs](FUnrealTypeDefinitionInfo&amp; TypeDef) {   if (!TypeDef.HasSource())   {      NoSourceTypeDefs.Add(&amp;TypeDef);   } });<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0434\u043b\u044f \u043d\u0438\u0445 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u0430 \u0444\u0438\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f &#8212; <code>PostParseFinalizeInternal<\/code>, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0438\u0437 \u0434\u0432\u0443\u0445 \u044d\u0442\u0430\u043f\u043e\u0432,\u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0432\u0442\u043e\u0440\u043e\u0439. \u0412 \u043d\u0435\u043c \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:  <\/p>\n<pre><code class=\"cpp\">... case EPostParseFinalizePhase::Phase2: {   UPackage* Package = GetPackage();    FString PackageName = Package->GetName();   PackageName.ReplaceInline(TEXT(\"\/\"), TEXT(\"_\"), ESearchCase::CaseSensitive);    SingletonName.Appendf(TEXT(\"Z_Construct_UPackage_%s()\"), *PackageName);   SingletonNameChopped = SingletonName.LeftChop(2);   ExternDecl.Appendf(TEXT(\"\\tUPackage* %s;\\r\\n\"), *SingletonName);   break; } ...<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 \u0434\u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b, \u0438 \u0443\u0436\u0435 \u0434\u043b\u044f \u043d\u0438\u0445 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>PostParseFinalize().<\/code><\/p>\n<pre><code class=\"cpp\">... for (TSharedRef&lt;FUnrealSourceFile>&amp; LocalSourceFile : GetAllSourceFiles()) {   for (TSharedRef&lt;FUnrealTypeDefinitionInfo>&amp; TypeDef : LocalSourceFile->GetDefinedTypes())   {      TypeDef->PostParseFinalize(Phase);   } } ...<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0444\u0438\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u043d\u043e\u0432\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438, \u043d\u0430\u043a\u043e\u043d\u0435\u0446:<\/p>\n<pre><code class=\"cpp\">void Export(TArray&lt;FUnrealPackageDefinitionInfo*>&amp; PackageDefs, TArray&lt;FUnrealSourceFile*>&amp; OrderedSourceFiles).<\/code><\/pre>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0439\u00a0<\/p>\n<pre><code class=\"cpp\">FNativeClassHeaderGenerator::GenerateSourceFiles(GeneratedCPPs)<\/code><\/pre>\n<p>\u041a\u0443\u0434\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438\u0437 <code>OrderedSourceFiles<\/code>.<\/p>\n<p>                                                                 \u0438<\/p>\n<pre><code class=\"cpp\">FNativeClassHeaderGenerator::Generate(*PackageDef, GeneratedCPPs);<\/code><\/pre>\n<p>\u041a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0446\u0438\u043a\u043b\u0435 \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u043c, \u0443\u0436\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u043c\u0438 <code>GeneratedCPPs<\/code>.<\/p>\n<pre><code class=\"cpp\">for (FUnrealPackageDefinitionInfo* PackageDef : PackageDefs) {   FResults::Try([&amp;GeneratedCPPs, PackageDef]() { FNativeClassHeaderGenerator::Generate(*PackageDef, GeneratedCPPs); }); }<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435, \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>GenerateSourceFiles()<\/code> \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0430\u043c <code>.h \u0444\u0430\u0439\u043b<\/code>.<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u0430\u043c\u043e\u043c \u0432\u0435\u0440\u0445\u0443 \u043d\u0430\u0448\u0435\u0433\u043e .h \u0444\u0430\u0439\u043b\u0430:<\/p>\n<pre><code class=\"cpp\">GeneratedHeaderText.Logf(   TEXT(\"#ifdef %s\"                                                   LINE_TERMINATOR_ANSI        \"#error \\\"%s.generated.h already included, missing '#pragma once' in %s.h\\\"\"  LINE_TERMINATOR_ANSI        \"#endif\"                                                     LINE_TERMINATOR_ANSI        \"#define %s\"                                                  LINE_TERMINATOR_ANSI   LINE_TERMINATOR_ANSI),   *FileDefineName, *StrippedFilename, *StrippedFilename, *FileDefineName); <\/code><\/pre>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u043e\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<pre><code class=\"cpp\">#ifdef MYPROJECT_TestClass_generated_h #error \"TestClass.generated.h already included, missing '#pragma once' in TestClass.h\" #endif #define MYPROJECT_TestClass_generated_h<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0446\u0438\u043a\u043b \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u043c \u0442\u0438\u043f\u0430\u043c \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442:<\/p>\n<p><code>Generator.ExportGeneratedEnumInitCode()<\/code> \u0434\u043b\u044f enum\u2019\u0430<\/p>\n<p><code>Generator.ExportGeneratedStructBodyMacros()<\/code> \u0434\u043b\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440<\/p>\n<p>\u0414\u043b\u044f \u0434\u0435\u043b\u0435\u0433\u0430\u0442\u043e\u0432:<\/p>\n<p><code>Generator.ExportDelegateDeclaration()<\/code><\/p>\n<p><code>Generator.ExportDelegateDefinition()<\/code><\/p>\n<p>\u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<pre><code class=\"cpp\">Generator.ExportClassFromSourceFileInner ... for (FUnrealFieldDefinitionInfo* FieldDef : Types) {   if (FUnrealEnumDefinitionInfo* EnumDef = UHTCast&lt;FUnrealEnumDefinitionInfo>(FieldDef))   {      \/\/ Is this ever not the case?      if (EnumDef->GetOuter()->GetObject()->IsA(UPackage::StaticClass()))      {         GeneratedFunctionDeclarations.Log(EnumDef->GetExternDecl(true));         Generator.ExportGeneratedEnumInitCode(GeneratedCPPText, ReferenceGatherers, SourceFile, *EnumDef);            EnumRegs.Add(EnumDef);         }      }   else if (FUnrealScriptStructDefinitionInfo* ScriptStructDef = UHTCast&lt;FUnrealScriptStructDefinitionInfo>(FieldDef))   { ... <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0439 \u0444\u0430\u0439\u043b \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438:<\/p>\n<pre><code class=\"cpp\">GeneratedHeaderText.Log(TEXT(\"#undef CURRENT_FILE_ID\\r\\n\")); GeneratedHeaderText.Logf(TEXT(\"#define CURRENT_FILE_ID %s\\r\\n\\r\\n\\r\\n\"), *SourceFile.GetFileId());<\/code><\/pre>\n<p>\u0412 \u043a\u043b\u0430\u0441\u0441\u0435 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">#undef CURRENT_FILE_ID #define CURRENT_FILE_ID FID_MyProject_Source_MyProject_TestClass_h<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f, \u0433\u0434\u0435 \u0446\u0438\u043a\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0441\u0435 \u0442\u0438\u043f\u044b \u0432\u043d\u043e\u0432\u044c, \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439:  <\/p>\n<pre><code class=\"cpp\">for (FUnrealFieldDefinitionInfo* FieldDef : Types) {   if (FUnrealEnumDefinitionInfo* EnumDef = UHTCast&lt;FUnrealEnumDefinitionInfo>(FieldDef))   {      Generator.ExportEnum(GeneratedHeaderText, *EnumDef);   } }<\/code><\/pre>\n<p>\u0418 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 <code>Registration info<\/code>:<\/p>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f .cpp \u0444\u0430\u0439\u043b\u0430.<\/p>\n<pre><code class=\"cpp\">... \/\/ Generate the single registration method if (!EnumRegs.IsEmpty() || !ScriptStructRegs.IsEmpty() || !ClassRegs.IsEmpty()) {   static const TCHAR* Prefix = TEXT(\"Z_CompiledInDeferFile_\");   FString StaticsName = FString::Printf(TEXT(\"%s%s_Statics\"), Prefix, *SourceFile.GetFileId());    GeneratedCPPText.Logf(TEXT(\"\\tstruct %s\\r\\n\"), *StaticsName);   GeneratedCPPText.Log(TEXT(\"\\t{\\r\\n\")); ... <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0435\u0433\u043e \u0432 <code>GeneratedCPP.<\/code><\/p>\n<p>\u0412 <code>WriteHeader()<\/code> \u0438 <code>WriteSource()<\/code>\u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043d\u0438\u0445 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">void FNativeClassHeaderGenerator::WriteSourceFile(FGeneratedCPP&amp; GeneratedCPP)  bool bHasChanged = WriteHeader(GeneratedCPP.Header, GeneratedHeaderText, AdditionalHeaders, GeneratedCPP.ForwardDeclarations); WriteSource(Module, GeneratedCPP.Source, GeneratedCPPText, &amp;SourceFile, GeneratedCPP.CrossModuleReferences);<\/code><\/pre>\n<p>\u0412 <code>WriteHeader()<\/code> \u0438 <code>WriteSource()<\/code> \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0435 \u0436\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0442\u0435\u0445 \u0441\u0430\u043c\u044b\u0445 <code>#include\u2019\u043e\u0432<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0431\u044b\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0448\u0430\u0433\u0435.<\/p>\n<p>\u0414\u043b\u044f \u0445\u0435\u0434\u0435\u0440\u0430:<\/p>\n<pre><code class=\"cpp\">FUHTStringBuilder GeneratedHeaderTextWithCopyright; GeneratedHeaderTextWithCopyright.Log(HeaderCopyright); GeneratedHeaderTextWithCopyright.Log(TEXT(\"#include \\\"UObject\/ObjectMacros.h\\\"\\r\\n\")); GeneratedHeaderTextWithCopyright.Log(TEXT(\"#include \\\"UObject\/ScriptMacros.h\\\"\\r\\n\"));<\/code><\/pre>\n<p>\u0418 \u0434\u043b\u044f cpp:<\/p>\n<pre><code class=\"cpp\">FUHTStringBuilder FileText; FileText.Log(HeaderCopyright); FileText.Log(RequiredCPPIncludes);<\/code><\/pre>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f cpp \u0444\u0430\u0439\u043b\u0430 \u0431\u044b\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435\u2026<\/p>\n<pre><code class=\"cpp\">const TCHAR* HeaderCopyright =   TEXT(\"\/\/ Copyright Epic Games, Inc. All Rights Reserved.\\r\\n\"        \"\/*===========================================================================\\r\\n\"        \"\\tGenerated code exported from UnrealHeaderTool.\\r\\n\"        \"\\tDO NOT modify this manually! Edit the corresponding .h files instead!\\r\\n\"        \"===========================================================================*\/\\r\\n\" LINE_TERMINATOR_ANSI);  const TCHAR* RequiredCPPIncludes = TEXT(\"#include \\\"UObject\/GeneratedCppIncludes.h\\\"\" LINE_TERMINATOR_ANSI);<\/code><\/pre>\n<p>\u0415\u0441\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f   <\/p>\n<pre><code class=\"cpp\">FNativeClassHeaderGenerator::Generate(   FUnrealPackageDefinitionInfo&amp; PackageDef,   TArray&lt;FGeneratedCPP>&amp; GeneratedCPPs<\/code><\/pre>\n<p>\u041a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 <code>GenerateSourceFiles()<\/code> , \u043e\u0434\u043d\u0430\u043a\u043e, \u043a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438, \u043e\u043d\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b, \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b, pragma once\u2019\u044b \u0438 \u0442.\u0434.<\/p>\n<pre><code class=\"cpp\">... \/\/ Write the classes and enums header prefixes. FUHTStringBuilder ClassesHText; ClassesHText.Log(HeaderCopyright); ClassesHText.Log(TEXT(\"#pragma once\\r\\n\")); ClassesHText.Log(TEXT(\"\\r\\n\")); ClassesHText.Log(TEXT(\"\\r\\n\"));  \/\/ Fill with the rest source files from this package. TSet&lt;FUnrealSourceFile*> PublicHeaderGroupIncludes; for (FGeneratedCPP* GeneratedCPP : ExportedSorted) {   if (GeneratedCPP->SourceFile.IsPublic())   {      PublicHeaderGroupIncludes.Add(&amp;GeneratedCPP->SourceFile);   } } for (TSharedRef&lt;FUnrealSourceFile>&amp; SourceFile : PackageDef.GetAllSourceFiles()) {   if (SourceFile->IsPublic())   {      PublicHeaderGroupIncludes.Add(&amp;*SourceFile);   } } ...<\/code><\/pre>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u0441\u044f \u0441 \u0434\u0435\u0442\u0430\u043b\u044f\u043c\u0438 \u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 .generated.h \u0438 .cpp \u0444\u0430\u0439\u043b\u043e\u0432 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f:<\/p>\n<pre><code class=\"cpp\">double TotalCheckForScriptPluginsTime = FResults::TimedTry([&amp;ScriptPlugins]() { GetScriptPlugins(ScriptPlugins); });<\/code><\/pre>\n<p><code>GetScriptPlugins()<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0443\u0436\u0435 \u0434\u043b\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u0442\u0430\u043a \u0436\u0435 \u0431\u0435\u0440\u044f \u0438\u0445 \u0438\u0437 GManifest.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f c\u043e\u0437\u0434\u0430\u0435\u0442 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0430\u043c\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430, \u0442.\u0435 \u0431\u0435\u0440\u0435\u0442 \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432 \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0435\u0442 \u0442\u0438\u043f\u044b \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438.  <\/p>\n<pre><code class=\"cpp\">void CreateEngineTypes(TArray&lt;FUnrealPackageDefinitionInfo*>&amp; PackageDefs)<\/code><\/pre>\n<p>\u0414\u043b\u044f <code>Enum\u2019\u0430<\/code> \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:  <\/p>\n<pre><code class=\"cpp\">FUnrealFieldDefinitionInfo::CreateUObjectEngineTypesInternal(Phase); ... switch (Phase) { case ECreateEngineTypesPhase::Phase1: {   UPackage* Package = GetPackageDef().GetPackage();   const FString&amp; EnumName = GetNameCPP();    \/\/ Create enum definition.   UEnum* Enum = new(EC_InternalUseOnlyConstructor, Package, FName(EnumName), RF_Public) UEnum(FObjectInitializer());   Enum->SetEnums(Names, CppForm, EnumFlags, false);   Enum->CppType = CppType;   Enum->GetPackage()->GetMetaData()->SetObjectValues(Enum, GetMetaDataMap());   SetObject(Enum);   break; }  case ECreateEngineTypesPhase::Phase2:   break;  case ECreateEngineTypesPhase::Phase3:   break; } ...<\/code><\/pre>\n<p>\u0413\u0434\u0435, \u0434\u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u043a\u0435\u0442, \u0438\u043c\u044f \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435, \u0433\u0434\u0435, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c, \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 meta \u0434\u0430\u043d\u043d\u044b\u0435.  <\/p>\n<pre><code class=\"cpp\">\/** * Set the key\/value pair in the Property's metadata * @param Object the object to set the metadata for * @Values The metadata key\/value pairs *\/ void SetObjectValues(const UObject* Object, const TMap&lt;FName, FString>&amp; Values); <\/code><\/pre>\n<p>13-\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043f\u0440\u0438\u0443\u0440\u043e\u0447\u0435\u043d \u043a \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0443 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438\u0437 \u043d\u0438\u0445 \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u043a\u043b\u0430\u0441\u0441\u043e\u0432 <code>FClassTree<\/code>\u0438 \u0432\u044b\u0437\u043e\u0432\u0443 \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430:<\/p>\n<pre><code class=\"cpp\">ExportClassToScriptPlugins(SourceFileLookup, ClassTree.GetClass(), Module, *Plugin); ExportClassTreeToScriptPlugins(SourceFileLookup, &amp;ClassTree, Module, *Plugin);<\/code><\/pre>\n<p>14-\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0438\u0445 \u0432 \u0444\u0430\u0439\u043b:<\/p>\n<pre><code class=\"cpp\">void WriteExternalDependencies(const FString&amp; ExternalDependencies) {   FFileHelper::SaveStringToFile(ExternalDependencies, *GManifest.ExternalDependenciesFile); } <\/code><\/pre>\n<p>\u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0432\u044b\u0437\u043e\u0432 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a\u0430\u0445, \u043e\u0431\u0449\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0442.\u0434, \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u044d\u0442\u043e \u0432 \u043b\u043e\u0433\u0438:<\/p>\n<pre><code class=\"cpp\">void GenerateSummary(TArray&lt;FUnrealPackageDefinitionInfo*>&amp; PackageDefs) {   for (FUnrealPackageDefinitionInfo* PackageDef : PackageDefs)   {      const FManifestModule&amp; Module = PackageDef->GetModule();       double TotalTimes[int32(ESourceFileTime::Count)] = { 0.0 };      int32 LinesParsed = 0;      int32 StatementsParsed = 0;      int32 SourceCount = 0;      TArray&lt;TSharedRef&lt;FUnrealSourceFile>>&amp; SourceFiles = PackageDef->GetAllSourceFiles();      for (TSharedRef&lt;FUnrealSourceFile>&amp; SourceFile : SourceFiles)      {         for (int32 Index = 0; Index &lt; int32(ESourceFileTime::Count); ++Index)         {            TotalTimes[int32(Index)] += SourceFile->GetTime(ESourceFileTime(Index));         }         LinesParsed += SourceFile->GetLinesParsed();         StatementsParsed += SourceFile->GetStatementsParsed();      }      UE_LOG(LogCompile, Log, TEXT(\"Success: Module %s parsed %d sources(s), %d line(s), %d statement(s).  Times(secs) Load: %.3f, PreParse: %.3f, Parse: %.3f, Generate: %.3f.\"), *Module.Name,         SourceFiles.Num(), LinesParsed, StatementsParsed, TotalTimes[int32(ESourceFileTime::Load)], TotalTimes[int32(ESourceFileTime::PreParse)], TotalTimes[int32(ESourceFileTime::Parse)], TotalTimes[int32(ESourceFileTime::Generate)]);   } } <\/code><\/pre>\n<p>\u0418 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0444\u0438\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0432\u0441\u0435\u0445 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f \u0432\u044b\u0448\u0435 \u043d\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0434\u0430\u0431\u044b \u043d\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u0435\u0449\u0435 \u0441\u0438\u043b\u044c\u043d\u0435\u0435, \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043b\u043e\u0433\u043e\u0432 \u043e \u043c\u043e\u0434\u0443\u043b\u044f\u0445, \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445, \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0442.\u043f<\/p>\n<pre><code class=\"cpp\">\/\/ Count the number of sources int NumSources = 0; for (const FManifestModule&amp; Module : GManifest.Modules) {   NumSources += Module.PublicUObjectClassesHeaders.Num() + Module.PublicUObjectHeaders.Num() + Module.InternalUObjectHeaders.Num() + Module.PrivateUObjectHeaders.Num(); } UE_LOG(LogCompile, Log, TEXT(\"Preparing %d modules took %.3f seconds\"), GManifest.Modules.Num(), TotalPrepareModuleTime); UE_LOG(LogCompile, Log, TEXT(\"Preparsing %d sources took %.3f seconds\"), NumSources, TotalPreparseTime); UE_LOG(LogCompile, Log, TEXT(\"Defining types took %.3f seconds\"), TotalDefineTypesTime); UE_LOG(LogCompile, Log, TEXT(\"Resolving type parents took %.3f seconds\"), TotalResolveParentsTime); UE_LOG(LogCompile, Log, TEXT(\"Preparing types for parsing took %.3f seconds\"), TotalPrepareTypesForParsingTime); ... <\/code><\/pre>\n<p>\u0413\u0434\u0435 \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0446\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f:<\/p>\n<pre><code class=\"cpp\">RequestEngineExit(TEXT(\"UnrealHeaderTool finished\")); return FResults::GetOverallResults();<\/code><\/pre>\n<hr\/>\n<h2>4. \u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.<\/h2>\n<p>\u0412\u043e\u0442 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0438 \u0432\u0441\u0435! \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u043b\u0438, \u0438 \u043e\u0441\u043e\u0431\u043e\u0435 \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0442\u0435\u043c, \u043a\u0442\u043e \u0434\u043e\u0447\u0438\u0442\u0430\u043b \u0434\u043e \u043a\u043e\u043d\u0446\u0430, \u0438 \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u043e\u0440\u043e\u0432\u0430\u043b \u0432\u0441\u0435 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>\u0427\u0430\u0441\u0442\u0438 \u043a\u043e\u0434\u0430 \u0431\u044b\u043b\u0438 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e, \u043e\u0434\u043d\u0430\u043a\u043e, \u044d\u0442\u043e \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u0435\u0441\u044c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u043c\u043d\u043e\u044e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0431\u044b\u043b \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u043f\u043e\u043d\u044f\u0442\u0435\u043d \u0432\u0441\u0435\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0433\u043b\u0443\u0431\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u043e\u043f\u044f\u0442\u044c \u0436\u0435, \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u0442\u0435 \u0436\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0441\u043b\u0435\u0434\u0443\u044f \u0432\u043d\u0438\u0437 \u043f\u043e \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p>\u041f\u0438\u0448\u0438\u0442\u0435, \u0447\u0442\u043e \u0431\u044b \u0432\u0430\u043c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0435\u0449\u0435 \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0439\u0442\u0435!<\/p>\n<p> \u0421\u043f\u0430\u0441\u0438\u0431\u043e!<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/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\/690662\/\"> https:\/\/habr.com\/ru\/post\/690662\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435  <\/h2>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442 \u0425\u0430\u0431\u0440!<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 UHT \u0438 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044f \u0432 Unreal Engine.<\/p>\n<p>\u0422\u043e\u0447\u043d\u0435\u0435:<\/p>\n<ul>\n<li>\n<p>\u041a\u0430\u043a \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f .generated.h \u0438 .gen.cpp.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u043a\u043e\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043e\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0420\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a UHT \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b, \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u0438, \u043f\u0430\u043a\u0435\u0442\u044b, \u0444\u0430\u0439\u043b\u044b \u0432 \u043d\u0438\u0445.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043b\u0430\u0441\u0441\u044b \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0437\u0430\u0442\u0440\u043e\u043d\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e\u0432\u0438\u0447\u043a\u0430\u043c, \u043f\u043e\u043b\u0430\u0433\u0430\u044e, \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043c\u0430\u043b\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430, \u0442.\u043a \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u0438 \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445. <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0447\u044c \u0432\u0441\u0435\u043c \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0448\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0432\u0438\u0436\u043a\u0435 \u0438 \u0441\u043c\u043e\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u043c \u043b\u0438\u0447\u043d\u043e. <strong>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0441\u0430\u043c\u0438\u043c, \u043e\u0431\u0440\u0430\u0449\u0430\u044f \u043e\u0441\u043e\u0431\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u0435 \u0432\u0435\u0449\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0431\u0443\u0434\u0443 \u0437\u0434\u0435\u0441\u044c \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c.<\/strong><\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u044f \u043b\u0438\u0448\u044c \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043d\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0439 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u0432 \u0434\u0432\u0438\u0436\u043a\u0435, \u0435\u0433\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440. \u042f \u043b\u0438\u0448\u044c \u043f\u044b\u0442\u0430\u044e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438. \u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u0431\u044b \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0438\u0441\u044c \u0432\u044b. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043a\u0430\u043a \u0431\u044b \u044f \u043d\u0435 \u043f\u044b\u0442\u0430\u043b\u0441\u044f, \u043c\u043e\u0433 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430.<\/p>\n<p>\u041f\u043e\u0441\u0435\u043c\u0443, \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u0439\u0434\u0435\u0442\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043a\u0430\u043a\u0438\u0435 \u0431\u044b \u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e \u043d\u0435\u0441\u043e\u0441\u0442\u044b\u043a\u043e\u0432\u043a\u0438, \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0438, \u043f\u0440\u043e\u0431\u0435\u043b\u044b \u0438\u043b\u0438 \u043e\u0442\u043a\u0440\u043e\u0432\u0435\u043d\u043d\u044b\u0439 \u0431\u0440\u0435\u0434: \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0438\u0448\u0438\u0442\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445. \u042f \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0442\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043c\u043e\u0433\u0443.  <\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043f\u0430\u0441\u0438\u0431\u043e:<\/p>\n<div class=\"persona\" persona=\"true\">\n<h5 class=\"persona__heading\" persona=\"true\">\u0422\u0438\u043c\u043e\u0444\u0435\u0439 \u0411\u0435\u043b\u043e\u0432<\/h5>\n<p>\u0417\u0430 \u043d\u0435\u043e\u0446\u0435\u043d\u0438\u043c\u0443\u044e \u043f\u043e\u043c\u043e\u0449\u044c \u0432 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u0446\u0438\u0438.<a href=\"https:\/\/habr.com\/en\/users\/Signer\/\" rel=\"noopener noreferrer nofollow\"><br \/>habr.com\/en\/users\/Signer\/<\/a> <\/p>\n<\/div>\n<div class=\"persona\" persona=\"true\">\n<h5 class=\"persona__heading\" persona=\"true\">\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0428\u0443\u043c\u0435\u0439\u043a\u043e<\/h5>\n<p>\u0417\u0430 \u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u0446\u0438\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f.<br \/><a href=\"https:\/\/www.linkedin.com\/in\/forrgit\/\" rel=\"noopener noreferrer nofollow\">www.linkedin.com\/in\/forrgit\/<\/a><\/p>\n<\/div>\n<p>\u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f!<\/p>\n<hr\/>\n<h2>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c.<\/h2>\n<p>\u0427\u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0430\u043c UHT?<\/p>\n<p>Unreal Headder Tool &#8212; \u043f\u0430\u0440\u0441\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 UObject \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0432\u0435\u0449\u0438, \u043a\u0430\u043a \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044f \u0432 Unreal Engine.<\/p>\n<p>\u0421\u0443\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0430: \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0435\u0439 \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f UHT, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u0432\u0430\u0448\u0438\u043c \u0444\u0430\u0439\u043b\u0430\u043c \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u043e\u0432\u044b\u0435: <code>.generated.h<\/code> \u0438 .<code>gen.cpp<\/code> . <\/p>\n<p>\u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441, \u0442\u043e \u0442\u0430\u043c \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438. \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441 move-\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u043e\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 private \u043f\u043e\u043b\u044f. \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <code>DECLARE_CLASS<\/code>  \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 static \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0440. <\/p>\n<p>\u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u0442\u043e \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043d\u0435\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435; <code>StaticStruct<\/code>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u043f\u0440.<\/p>\n<p>\u0418 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u043e <code>GENERATED_BODY<\/code> \u0432 \u0432\u0430\u0448\u0438\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u0445.<\/p>\n<h2>\u0413\u043b\u0430\u0432\u0430 1. \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438.<\/h2>\n<p>\u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430 \u0442\u0435 \u0444\u0430\u0439\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043a \u043d\u0430\u0448\u0438\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u0430\u043c. <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">#pragma once #include \"TestStruct.generated.h\"  USTRUCT() struct FMyStruct { GENERATED_BODY() };<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0430 \u0444\u0430\u0439\u043b\u0430 .generated.h \u0438 .gen.cpp<\/p>\n<pre><code class=\"cpp\">\/\/TestStruct.generated.h  \/\/ Copyright Epic Games, Inc. All Rights Reserved. \/*=========================================================================== Generated c\/Teode exported from UnrealHeaderTool. DO NOT modify this manually! Edit the corresponding .h files instead! ===========================================================================*\/  #include \"UObject\/ObjectMacros.h\" #include \"UObject\/ScriptMacros.h\"  PRAGMA_DISABLE_DEPRECATION_WARNINGS #ifdef MYPROJECT_TestStruct_generated_h #error \"TestStruct.generated.h already included, missing '#pragma once' in TestStruct.h\" #endif #define MYPROJECT_TestStruct_generated_h  #define FID_MyProject_Source_MyProject_TestStruct_h_7_GENERATED_BODY \\ friend struct Z_Construct_UScriptStruct_FMyStruct_Statics; \\ MYPROJECT_API static class UScriptStruct* StaticStruct();   template&lt;> MYPROJECT_API UScriptStruct* StaticStruct&lt;struct FMyStruct>();  #undef CURRENT_FILE_ID #define CURRENT_FILE_ID FID_MyProject_Source_MyProject_TestStruct_h   PRAGMA_ENABLE_DEPRECATION_WARNINGS <\/code><\/pre>\n<p>\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0435 \u0445\u0435\u0434\u0434\u0435\u0440\u044b \u044d\u0442\u043e <code>\"UObject\/ObjectMacros.h\"<\/code> \u0438 <code>\"UObject\/ScriptMacros.h\"<\/code>  <\/p>\n<h2>1.1 ObjectMacros.h<\/h2>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u043d UF, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043c\u0430\u043a\u0440\u043e\u0441 <code>UFUNCTION()<\/code>  <\/p>\n<pre><code class=\"cpp\">namespace UF {   \/\/ valid keywords for the UFUNCTION and UDELEGATE macros   enum   {      \/\/\/ This function is designed to be overridden by a blueprint.  Do not provide a body for this function;      \/\/\/ the autogenerated code will include a thunk that calls ProcessEvent to execute the overridden body.      BlueprintImplementableEvent,       \/\/\/ This function is designed to be overridden by a blueprint, but also has a native implementation.      \/\/\/ Provide a body named [FunctionName]_Implementation instead of [FunctionName]; the autogenerated      \/\/\/ code will include a thunk that calls the implementation method when necessary.      BlueprintNativeEvent,       \/\/\/ This function is sealed and cannot be overridden in subclasses.      \/\/\/ It is only a valid keyword for events; declare other methods as static or final to indicate that they are sealed.      SealedEvent,       \/\/\/ This function is executable from the command line.      Exec,       \/\/\/ This function is replicated, and executed on servers.  Provide a body named [FunctionName]_Implementation instead of [FunctionName];      \/\/\/ the autogenerated code will include a thunk that calls the implementation method when necessary.      Server,       \/\/\/ This function is replicated, and executed on clients.  Provide a body named [FunctionName]_Implementation instead of [FunctionName];      \/\/\/ the autogenerated code will include a thunk that calls the implementation method when necessary.      Client,       \/\/\/ This function is both executed locally on the server and replicated to all clients, regardless of the Actor's NetOwner      NetMulticast,       \/\/\/ Replication of calls to this function should be done on a reliable channel.      \/\/\/ Only valid when used in conjunction with Client or Server      Reliable,       \/\/\/ Replication of calls to this function can be done on an unreliable channel.      \/\/\/ Only valid when used in conjunction with Client or Server      Unreliable,     ...   } <\/code><\/pre>\n<p>\u041a\u0440\u043e\u043c\u0435 \u043d\u0435\u0433\u043e \u0442\u0430\u043a \u0436\u0435 \u0435\u0441\u0442\u044c UP, \u0433\u0434\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f <code>UPROPERTY():<\/code><\/p>\n<pre><code class=\"cpp\">namespace UP {   \/\/ valid keywords for the UPROPERTY macro   enum   {      \/\/\/ This property is const and should be exported as const.      Const,       \/\/\/ Property should be loaded\/saved to ini file as permanent profile.      Config,       \/\/\/ Same as above but load config from base class, not subclass.      GlobalConfig,       \/\/\/ Property should be loaded as localizable text. Implies ReadOnly.      Localized,       \/\/\/ Property is transient: shouldn't be saved, zero-filled at load time.      Transient,       \/\/\/ Property should always be reset to the default value during any type of duplication (copy\/paste, binary duplication, etc.)      DuplicateTransient,       \/\/\/ Property should always be reset to the default value unless it's being duplicated for a PIE session - deprecated, use NonPIEDuplicateTransient instead      NonPIETransient,       \/\/\/ Property should always be reset to the default value unless it's being duplicated for a PIE session      NonPIEDuplicateTransient,       \/\/\/ Value is copied out after function call. Only valid on function param declaration.      Ref,       \/\/\/ Object property can be exported with it's owner.      Export,       \/\/\/ Hide clear (and browse) button in the editor.      NoClear,   ...  };<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u044f \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443, \u043e\u0434\u043d\u0430\u043a\u043e \u043e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043a\u0440\u043e\u043c\u0435 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u0435\u0449\u0435:<\/p>\n<pre><code class=\"cpp\">namespace US \/\/ USTRUCT() namespace UM \/\/ Metadata \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 USTRUCT,UPROPERTY \u0438 \u043f\u0440 namespace UI \/\/ UINTERFACE() namespace UC \/\/ UCLASS()<\/code><\/pre>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0442\u0430\u043c \u0435\u0441\u0442\u044c ENUM&#8217;\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0444\u043b\u0430\u0433\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0444\u043b\u0430\u0433\u0438 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 <code>Details<\/code> \u043f\u043e\u0434 \u043f\u043e\u043b\u0435\u043c <code>Defined Property Flags:<\/code><\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043b\u0438 \u0432 \u043a\u043e\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0444\u043b\u0430\u0433\u043e\u0432.  <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0430\u043c\u0438 \u0444\u043b\u0430\u0433\u0438 \u0443\u0447\u0430\u0432\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u0434\u0432\u0438\u0436\u043a\u0430 . \u0422\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u043b\u0430\u0433 CPF_SaveGame \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 \u0434\u043b\u044f \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445:\u200b  <\/p>\n<pre><code class=\"cpp\">bool FProperty::ShouldSerializeValue( FArchive&amp; Ar ) const { if (Ar.ShouldSkipProperty(this)) { return false; }     \/\/\u0427\u0435\u0440\u0435\u0437 \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 PropertyFlags. if (!(PropertyFlags &amp; CPF_SaveGame) &amp;&amp; Ar.IsSaveGame()) { return false; }  const uint64 SkipFlags = CPF_Transient | CPF_DuplicateTransient | CPF_NonPIEDuplicateTransient | CPF_NonTransactional | CPF_Deprecated | CPF_DevelopmentAssets | CPF_SkipSerialization; if (!(PropertyFlags &amp; SkipFlags)) { return true; }  bool Skip = ((PropertyFlags &amp; CPF_Transient) &amp;&amp; Ar.IsPersistent() &amp;&amp; !Ar.IsSerializingDefaults()) ||((PropertyFlags &amp; CPF_DuplicateTransient) &amp;&amp; (Ar.GetPortFlags() &amp; PPF_Duplicate)) ||((PropertyFlags &amp; CPF_NonPIEDuplicateTransient) &amp;&amp; !(Ar.GetPortFlags() &amp; PPF_DuplicateForPIE) &amp;&amp; (Ar.GetPortFlags() &amp; PPF_Duplicate)) ||((PropertyFlags &amp; CPF_NonTransactional) &amp;&amp; Ar.IsTransacting()) ||((PropertyFlags &amp; CPF_Deprecated) &amp;&amp; !Ar.HasAllPortFlags(PPF_UseDeprecatedProperties) &amp;&amp; (Ar.IsSaving() || Ar.IsTransacting() || Ar.WantBinaryPropertySerialization())) ||  ((PropertyFlags &amp; CPF_SkipSerialization) &amp;&amp; (Ar.WantBinaryPropertySerialization() || !Ar.HasAllPortFlags(PPF_ForceTaggedSerialization))) ||  (IsEditorOnlyProperty() &amp;&amp; Ar.IsFilterEditorOnly());  return !Skip; }<\/code><\/pre>\n<p>\u041d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>FProperty<\/code>. \u041c\u044b \u043a \u043d\u0435\u0439 \u0435\u0449\u0435 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f.<\/p>\n<p>\u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u043f\u0430\u0440\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u0442\u0438\u043c\u0438 \u0444\u043b\u0430\u0433\u0430\u043c\u0438:<\/p>\n<p>\u0412 UHT \u043f\u0430\u0440\u0441\u0435\u0440\u0435 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0430\u044f \u0442\u0438\u043f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 out-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440.<\/p>\n<pre><code class=\"cpp\">void FHeaderParser::GetVarType(   FScope*                         Scope,   EGetVarTypeOptions          Options,   FPropertyBase&amp;                  VarProperty,   EPropertyFlags                  Disallow,   EUHTPropertyType            OuterPropertyType,   EPropertyFlags             OuterPropertyFlags,   EPropertyDeclarationStyle::Type PropertyDeclarationStyle,   EVariableCategory               VariableCategory,   FIndexRange*                    ParsedVarIndexRange,   ELayoutMacroType*               OutLayoutMacroType )<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0430\u043c\u043e\u0439 \u0441\u0435\u0431\u044f, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e, \u0438 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0441\u0430\u043c\u043e \u0437\u0430 \u0441\u0435\u0431\u044f:   <\/p>\n<pre><code class=\"cpp\">FUnrealFunctionDefinitionInfo&amp; FHeaderParser::CompileDelegateDeclaration(const FStringView&amp;<\/code><\/pre>\n<\/div>\n<\/div>\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-339055","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/339055","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=339055"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/339055\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=339055"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=339055"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=339055"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}