{"id":2667,"date":"2026-10-04T19:14:51","date_gmt":"2026-10-04T11:14:51","guid":{"rendered":"https:\/\/www.xinot.icu\/?p=2667"},"modified":"2026-10-04T19:15:42","modified_gmt":"2026-10-04T11:15:42","slug":"%e7%bb%99character%e6%8d%a2%e4%b8%80%e4%b8%aa%e8%87%aa%e5%b7%b1%e7%9a%84cmc","status":"publish","type":"post","link":"https:\/\/www.xinot.icu\/?p=2667","title":{"rendered":"\u7ed9Character\u6362\u4e00\u4e2a\u81ea\u5df1\u7684CMC"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"2667\" class=\"elementor elementor-2667\" data-elementor-settings=\"[]\">\n\t\t\t\t\t\t\t<div class=\"elementor-section-wrap\">\n\t\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-7b874cb elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7b874cb\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b256cbc\" data-id=\"b256cbc\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f5e20b6 elementor-widget elementor-widget-heading\" data-id=\"f5e20b6\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">\u7ed9Character\u6362\u4e00\u4e2a\u81ea\u5df1\u7684CMC\n<\/h2>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-144f0c02 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"144f0c02\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-95f6560\" data-id=\"95f6560\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-629af4d7 elementor-widget elementor-widget-text-editor\" data-id=\"629af4d7\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">\u76ee\u5f55<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:html -->\n<div style=\"width:10%;border-top:2.4px solid #6ec1e4;margin:-13px 0 22px\"><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:html -->\n<style>\n.xn-toc ul{list-style:none;margin:0;padding:0}\n.xn-toc>ul>li{margin:0 0 6px}\n.xn-toc>ul>li>a{font-weight:700;color:#4b4f58}\n.xn-toc li ul{margin:4px 0 10px 2px;padding-left:16px;border-left:2px solid #d6ecf5}\n.xn-toc li li{margin:3px 0;font-size:15px}\n.xn-toc li li a{color:#777}\n.xn-toc a{text-decoration:none;transition:color .15s}\n.xn-toc a:hover{color:#6ec1e4}\n<\/style>\n<nav class=\"xn-toc\"><ul>\n<li><a href=\"#toc-1\">\u524d\u8a00<\/a><\/li>\n<li><a href=\"#toc-2\">\u5148\u5199\u4e00\u4e2a\u81ea\u5df1\u7684 Character<\/a><ul>\n<li><a href=\"#toc-3\">\u5411\u524d\u58f0\u660e\u4e0e #include<\/a><\/li>\n<li><a href=\"#toc-4\">Character \u4ee3\u7801\u5b9e\u73b0<\/a><\/li>\n<li><a href=\"#toc-5\">PlayerController \u4e0e GameMode<\/a><\/li>\n<li><a href=\"#toc-6\">Demo \u9879\u76ee\u7ed3\u6784<\/a><\/li>\n<\/ul><\/li>\n<li><a href=\"#toc-7\">CMC \u5b50\u7c7b\uff1a\u51b2\u523a<\/a><ul>\n<li><a href=\"#toc-8\">\u6539\u6210\u5458 vs override<\/a><\/li>\n<li><a href=\"#toc-9\">GymCharacterMovementComponent<\/a><\/li>\n<li><a href=\"#toc-10\">Character \u4fa7\u6309\u952e\u63a5\u5165<\/a><\/li>\n<li><a href=\"#toc-11\">\u804c\u8d23\u68b3\u7406<\/a><\/li>\n<li><a href=\"#toc-12\">\u5b9e\u6d4b<\/a><\/li>\n<\/ul><\/li>\n<li><a href=\"#toc-13\">\u7236\u7c7b\u7684 CMC \u5b50\u5bf9\u8c61\u66ff\u6362<\/a><ul>\n<li><a href=\"#toc-14\">C++ \u6784\u9020\u51fd\u6570\u7684\u4e24\u4e2a\u9636\u6bb5<\/a><\/li>\n<li><a href=\"#toc-15\">Subobject \u5b50\u5bf9\u8c61<\/a><\/li>\n<li><a href=\"#toc-16\">FObjectInitializer<\/a><\/li>\n<li><a href=\"#toc-17\">\u4e3a\u4ec0\u4e48\u53ea\u80fd\u5728\u521d\u59cb\u5316\u5217\u8868\u91cc\uff1f<\/a><\/li>\n<li><a href=\"#toc-18\">\u6574\u4f53\u903b\u8f91\u68b3\u7406<\/a><\/li>\n<\/ul><\/li>\n<li><a href=\"#toc-19\">\u610f\u56fe\u4e0e\u8054\u7f51<\/a><ul>\n<li><a href=\"#toc-20\">\u670d\u52a1\u5668\u7684\u6982\u5ff5<\/a><\/li>\n<li><a href=\"#toc-21\">CMC \u7f51\u7edc\u9884\u6d4b\uff08\u6682\u6401\u7f6e\uff09<\/a><\/li>\n<li><a href=\"#toc-22\">\u4ece QA \u89c6\u89d2\u770b CMC \u7684\u7f51\u7edc\u6d4b\u8bd5<\/a><\/li>\n<\/ul><\/li>\n<li><a href=\"#toc-23\">\u4e00\u4e9b\u5c0f\u7591\u8651<\/a><\/li>\n<\/ul><\/nav>\n<!-- \/wp:html -->\n\n<!-- wp:spacer {\"height\":\"27px\"} -->\n<div style=\"height:27px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<!-- \/wp:spacer -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"toc-1\">\u524d\u8a00<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:html -->\n<div style=\"width:10%;border-top:2.4px solid #6ec1e4;margin:-13px 0 22px\"><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u4e0a\u4e00\u7bc7\u628a\u300c\u4ece\u8f93\u5165\u5230\u89d2\u8272\u79fb\u52a8\u300d\u7684\u94fe\u8def\u8d70\u4e86\u4e00\u904d\uff0c\u8fd9\u7bc7\u662f\u63a5\u7740\u5f80\u4e0b\u505a\u7684\u4e1c\u897f\uff1a\u5199\u4e00\u4e2a\u81ea\u5df1\u7684 Character\uff0c\u518d\u7ed9\u5b83\u6362\u4e0a\u4e00\u4e2a\u81ea\u5df1\u7684 CMC\uff08CharacterMovementComponent\uff09\uff0c\u7528 CMC \u5b50\u7c7b\u505a\u4e00\u4e2a\u51b2\u523a\u3002<br>\u5176\u4e2d\u6700\u60f3\u8bb0\u4e0b\u6765\u7684\u662f\u300c\u7236\u7c7b\u7684 CMC \u5b50\u5bf9\u8c61\u66ff\u6362\u300d\u90a3\u4e00\u6bb5\uff0c\u4e5f\u5c31\u662f\u4e3a\u4ec0\u4e48\u6362 CMC \u7684\u90a3\u4e00\u884c\u4ee3\u7801\uff0c\u53ea\u80fd\u5199\u5728\u6784\u9020\u51fd\u6570\u7684\u521d\u59cb\u5316\u5217\u8868\u91cc\u3002<br>\u5f15\u64ce\u7248\u672c\u540c\u6837\u662f 5.6.1 \u6e90\u7801\u7248\uff0c\u5de5\u7a0b\u4f9d\u65e7\u662f\u7b2c\u4e09\u4eba\u79f0\u6a21\u677f\u6539\u7684\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:spacer {\"height\":\"27px\"} -->\n<div style=\"height:27px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<!-- \/wp:spacer -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"toc-2\">\u5148\u5199\u4e00\u4e2a\u81ea\u5df1\u7684 Character<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:html -->\n<div style=\"width:10%;border-top:2.4px solid #6ec1e4;margin:-13px 0 22px\"><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"toc-3\">\u5411\u524d\u58f0\u660e\u4e0e #include<\/h4>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>\u5199 Character \u4e4b\u524d\uff0c\u5148\u804a\u4e00\u4e0b C++ \u672c\u8eab\u7684\u4e1c\u897f\uff0c\u56e0\u4e3a UE \u7684\u5934\u6587\u4ef6\u91cc\u5230\u5904\u662f\u5411\u524d\u58f0\u660e\u3002#include \u662f\u9884\u5904\u7406\u9636\u6bb5\u7684\u6587\u672c\u590d\u5236\u3002\u9884\u5904\u7406\u5668\u628a Foo.h \u7684\u5168\u90e8\u5185\u5bb9\u539f\u5730\u5c55\u5f00\u5230\u4f60\u5199 #include &#8220;Foo.h&#8221; \u7684\u90a3\u4e00\u884c\uff0c\u7136\u540e\u7f16\u8bd1\u5668\u624d\u770b\u5230\u4ee3\u7801\u3002\u6240\u4ee5\u62ff\u5230\u7684\u662f\u5b8c\u6574\u7c7b\u578b\uff08complete type\uff09\uff0c\u7f16\u8bd1\u5668\u77e5\u9053\u8fd9\u4e2a\u7c7b\u591a\u5927\u3001\u6709\u54ea\u4e9b\u6210\u5458\u3001\u6210\u5458\u5728\u4ec0\u4e48\u504f\u79fb\u3002\u5411\u524d\u58f0\u660e\u53ea\u662f\u544a\u8bc9\u7f16\u8bd1\u5668\u300c\u6709\u8fd9\u4e48\u4e2a\u540d\u5b57\uff0c\u5b83\u662f\u4e2a class\u300d\uff0c\u7f16\u8bd1\u5668\u6b64\u65f6\u62ff\u5230\u7684\u662f\u4e0d\u5b8c\u6574\u7c7b\u578b\uff08incomplete type\uff09\uff0c\u77e5\u9053\u5b83\u5b58\u5728\uff0c\u4e0d\u77e5\u9053\u5b83\u591a\u5927\u3001\u91cc\u9762\u6709\u4ec0\u4e48\u3002\u90a3\u4ec0\u4e48\u60c5\u51b5\u7528\u5411\u524d\u58f0\u660e\uff0c\u4ec0\u4e48\u60c5\u51b5\u7528 #include\uff1f\u6307\u9488\u548c\u5f15\u7528\u7684\u5927\u5c0f\u662f\u56fa\u5b9a\u7684\uff0864 \u4f4d\u5e73\u53f0\u4e0a\u662f 8 \u5b57\u8282\uff09\uff0c\u7f16\u8bd1\u5668\u4e0d\u9700\u8981\u77e5\u9053\u5b83\u6307\u5411\u4ec0\u4e48\u5c31\u80fd\u7ed9\u5b83\u5206\u914d\u7a7a\u95f4\uff1b\u5176\u4ed6\u4e00\u5207\u90fd\u9700\u8981\u771f\u6b63\u770b\u5230\u7c7b\u7684\u5b9a\u4e49\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>\u5411\u524d\u58f0\u660e\u5c31\u591f\u4e86\u7684\u60c5\u51b5\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>\u58f0\u660e\u6307\u9488 AMyCharacter*\u3001\u5f15\u7528 AMyCharacter&amp;<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>\u51fd\u6570\u53c2\u6570\u3001\u8fd4\u56de\u503c\u7684\u58f0\u660e<\/li>\n<!-- \/wp:list-item --><\/ul>\n<!-- \/wp:list -->\n\n<!-- wp:paragraph -->\n<p>\u9700\u8981 #include \u7684\u60c5\u51b5\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>\u6309\u503c\u58f0\u660e\u6210\u5458 AMyCharacter Member<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>\u7ee7\u627f class X : public AMyCharacter<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>\u8c03\u7528\u6210\u5458 Ptr-&gt;Jump()<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>sizeof(AMyCharacter)\u3001new AMyCharacter<\/li>\n<!-- \/wp:list-item --><\/ul>\n<!-- \/wp:list -->\n\n<!-- wp:paragraph -->\n<p>\u6211\u81ea\u5df1\u7684 GymCharacter.h \u91cc\u5c31\u662f\u8fd9\u4e48\u5199\u7684\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">\/\/ \u5411\u524d\u58f0\u660e\u7c7b, \u907f\u514d\u5728\u5934\u6587\u4ef6\u4e2d\u5305\u542b\u8fc7\u591a\u7684\u5934\u6587\u4ef6, \u4ee5\u51cf\u5c11\u7f16\u8bd1\u65f6\u95f4\nclass USpringArmComponent;\nclass UCameraComponent;\nclass UInputAction;\nstruct FInputActionValue;<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>UE \u5b98\u65b9\u7684 C++ \u7f16\u7801\u89c4\u8303\u91cc\u6709\u4e00\u6761\uff1a<em>\u201cForward declarations are preferred to including headers.\u201d<\/em> \u6838\u5fc3\u610f\u601d\u5c31\u662f .h \u91cc\u5c3d\u91cf\u5411\u524d\u58f0\u660e\uff0c.cpp \u91cc\u624d #include\u3002\u53e6\u5916\u5b98\u65b9\u8fd8\u6709\u4e00\u4efd IWYU\uff08Include What You Use\uff09\u6587\u6863\uff0c\u8981\u6c42\u6bcf\u4e2a\u5934\u6587\u4ef6\u81ea\u7ed9\u81ea\u8db3\uff0c\u53ea include \u81ea\u5df1\u771f\u6b63\u9700\u8981\u7684\u3002<br>\u8fd9\u5bf9\u4e8e UE \u8fd9\u79cd\u8d85\u5927\u9879\u76ee\u5f88\u91cd\u8981\uff0c\u975e\u5e38\u5f71\u54cd\u7f16\u8bd1\u65f6\u95f4\u3002\u4e00\u4e2a\u5934\u6587\u4ef6\u4e00\u65e6\u6539\u52a8\uff0c\u6240\u6709\u76f4\u63a5\u6216\u95f4\u63a5 include \u5b83\u7684 .cpp \u90fd\u8981\u91cd\u65b0\u7f16\u8bd1\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"toc-4\">Character \u4ee3\u7801\u5b9e\u73b0<\/h4>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>\u4e3b\u8981\u53c2\u8003\u5b98\u65b9\u7b2c\u4e09\u4eba\u79f0\u793a\u4f8b\u6a21\u677f\u7684 Character \u7c7b\u4ee3\u7801\uff0c\u5b9e\u73b0\u81ea\u5df1\u7684 C++ Character \u7c7b\uff0c\u505a\u5230\u53ef\u4ee5 WASD \u79fb\u52a8\u4ee5\u53ca\u9f20\u6807\u63a7\u5236\u76f8\u673a\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>\u5934\u6587\u4ef6\u91cc\u58f0\u660e\u8f93\u5165\u52a8\u4f5c\u548c\u5bf9\u5e94\u7684\u5904\u7406\u51fd\u6570\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">\/\/ \u79fb\u52a8\uff0c\u9f20\u6807\u65cb\u8f6c\u8f93\u5165\u52a8\u4f5cIA\u7684\u58f0\u660e\nUPROPERTY(EditAnywhere, Category = \"Input\")\nUInputAction* MoveAction;\n\nUPROPERTY(EditAnywhere, Category = \"Input\")\nUInputAction* MouseLookAction;\n\n\/\/ \u91cd\u5199 SetupPlayerInputComponent \u51fd\u6570\uff0c\u7ed1\u5b9a\u8f93\u5165\u52a8\u4f5c\u5230\u5bf9\u5e94\u7684\u51fd\u6570\nvirtual void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) override;\n\n\/**\n * @brief \u89d2\u8272\u79fb\u52a8\uff0c\u5904\u7406character\u7684\u8f93\u5165\n * @param Value \u53ea\u8bfb\u7684\u8f93\u5165\u503c\uff0c\u5305\u542b\u4e86\u79fb\u52a8\u65b9\u5411\u548c\u901f\u5ea6\u7b49\u4fe1\u606f\n *\/\nvoid Move(const FInputActionValue&amp; Value);\nvoid Look(const FInputActionValue&amp; Value);<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u7ed1\u5b9a EIC \u7684\u65b9\u6cd5\u53c2\u8003\u5b98\u65b9\u793a\u4f8b\uff0c\u8fd9\u91cc\u53ea\u653e\u76f8\u673a\u65cb\u8f6c Look \u7684\u5b9e\u73b0\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">\/**\n * @brief \u76f8\u673a\u65cb\u8f6c\n * @param Value \u53ea\u8bfb\u7684\u8f93\u5165\u503c\uff0c\u5305\u542b\u4e86\u65cb\u8f6c\u65b9\u5411\u548c\u901f\u5ea6\u7b49\u4fe1\u606f\n *\/\nvoid AGymCharacter::Look(const FInputActionValue&amp; Value)\n{\n    \/\/ \u5c06\u8f93\u5165\u503c\u8f6c\u6362\u4e3a FVector2D \u7c7b\u578b\uff0c\u8868\u793a\u9f20\u6807\u6216\u624b\u67c4\u7684\u65cb\u8f6c\u8f93\u5165\n    const FVector2D V = Value.Get&lt;FVector2D&gt;();\n\n    \/\/ \u7ee7\u627f\u81ea ACharacter \u7684 AddControllerYawInput \u548c AddControllerPitchInput \u51fd\u6570\n    \/\/ \u7528\u4e8e\u5c06X\u4e0eY\u8f74\u7684\u8f93\u5165\u503c\u5e94\u7528\u5230\u89d2\u8272\u7684\u63a7\u5236\u5668\u4e0a\uff0c\u5b9e\u73b0\u76f8\u673a\u7684\u65cb\u8f6c\n    AddControllerYawInput(V.X);\n    AddControllerPitchInput(V.Y);\n}<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>C++ \u5199\u5b8c\u4e4b\u540e\u662f\u84dd\u56fe\u914d\u7f6e\uff1a\u7528\u8fd9\u4e2a C++ \u7c7b\u521b\u5efa\u84dd\u56fe\u5b50\u7c7b\uff0c\u5728\u84dd\u56fe\u91cc\u914d\u7f6e\u597d\u5bf9\u5e94\u7684 IA\uff1b\u518d\u5728 GameMode \u84dd\u56fe\u7c7b\u4e2d\u914d\u7f6e PlayerControllerClass\u3001Default Pawn Class\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"toc-5\">PlayerController \u4e0e GameMode<\/h4>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>\u4e0a\u9762\u914d GameMode \u7684\u65f6\u5019\u51fa\u73b0\u4e86 PlayerController\uff0c\u987a\u4fbf\u7406\u4e00\u4e0b\u8fd9\u4e24\u4e2a\u4e1c\u897f\u3002<br>\u76ee\u524d\u53ef\u4ee5\u7406\u89e3\u4e3a\uff0cPlayerController \u662f\u73a9\u5bb6\u672c\u4eba\u5728 UE \u91cc\u7684\u4ee3\u8868\uff1a\u6211\u81ea\u5df1\u662f PlayerController\uff0c\u800c\u6211\u64cd\u63a7\u7684\u662f Character\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>\u5728 UE \u4e2d\uff0c\u73a9\u5bb6\u88ab\u5206\u6210\u4e86\u4e24\u5c42\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">APlayerController   \u2190 \u73a9\u5bb6\u3002\u770b\u54ea\u513f\u3001\u6309\u4e86\u4ec0\u4e48\u952e\u3001UI \u5f52\u5b83\n       \u2193 possess\nAPawn \/ ACharacter  \u2190 \u8eab\u4f53\u3002\u6709\u80f6\u56ca\u3001\u6709\u7f51\u683c\u4f53\u3001\u4f1a\u79fb\u52a8<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u7406\u7531\u5f88\u7b80\u5355\uff0c\u73a9\u5bb6\u53ea\u6709\u4e00\u4e2a\uff0c\u800c\u73a9\u5bb6\u53ef\u4ee5\u64cd\u63a7\u7684\u5bf9\u8c61\u4e0d\u6b62\u4e00\u4e2a\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>PlayerController \u901a\u5e38\u7528\u6765\u505a\u4ec0\u4e48\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>\u76f8\u673a\u7ba1\u7406 PlayerCameraManager\uff0c\u76f8\u673a\u7684\u914d\u7f6e\u3001\u9707\u5c4f\u3001\u6296\u52a8\u7b49\u3002PlayerCameraManager \u5f52 PlayerController \u7ba1\uff1b\u89d2\u8272\u8eab\u4e0a\u6302\u7684 CameraComponent\uff0c\u662f\u88ab\u5b83\u62ff\u6765\u7528\u7684\u3002<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>\u9700\u8981\u65f6\u5c4f\u853d\u73a9\u5bb6\u7684\u79fb\u52a8\u8f93\u5165\uff0cController \u4e0a\u6709 SetIgnoreMoveInput \u53ef\u4ee5\u505a\u8fd9\u4ef6\u4e8b\u3002<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>\u63a7\u5236\u53f0\u547d\u4ee4\u7684\u81ea\u5b9a\u4e49\u58f0\u660e\u7b49\u3002<\/li>\n<!-- \/wp:list-item --><\/ul>\n<!-- \/wp:list -->\n\n<!-- wp:paragraph -->\n<p>GameMode \u7b80\u5355\u5730\u8bf4\uff0c\u4f5c\u7528\u5c31\u662f\u5b9a\u4e49\u6e38\u620f\u89c4\u5219\uff0c\u5305\u62ec\u7528\u4ec0\u4e48 Pawn \u7c7b\u3001\u7528\u4ec0\u4e48 PlayerController\u3001\u73a9\u5bb6\u51fa\u751f\u70b9\u3001\u80dc\u5229\u6761\u4ef6\u3001\u73a9\u5bb6\u6e38\u73a9\u4eba\u6570\u7b49\u3002<br>\u5728\u591a\u4eba\u6e38\u620f\u7684\u60c5\u51b5\u4e0b\uff0cGameMode \u53ea\u5b58\u5728\u4e8e\u670d\u52a1\u5668\u4e0a\uff08\u89c4\u5219\u7531\u670d\u52a1\u5668\u88c1\u5b9a\uff09\u3002PlayerController \u5219\u662f\u670d\u52a1\u5668\u4e0a\u6709\u6bcf\u4e2a\u73a9\u5bb6\u7684\u4e00\u4efd\uff0c\u800c\u6bcf\u4e2a\u5ba2\u6237\u7aef\u53ea\u6709\u81ea\u5df1\u7684\u90a3\u4e00\u4e2a\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"toc-6\">Demo \u9879\u76ee\u7ed3\u6784<\/h4>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>\u6574\u4e2a Demo \u7684\u7ed3\u6784\u5927\u81f4\u5982\u4e0b\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">\u5173\u5361 World Settings\n \u2514\u2500\u2500 GameMode Override = BP_GymGameMode\n      \u2502  (\u7236\u7c7b AGymGameMode\uff0cC++ \u91cc\u53ea\u5199\u4e86 DefaultPawnClass \u515c\u5e95)\n      \u251c\u2500\u2500 PlayerControllerClass = BP_ThirdPersonPlayerController\n      \u2502    \u2514\u2500\u2500 \u6ce8\u518c IMC_Default + IMC_MouseLook  \u2190 \u952e\u4f4d\u5728\u8fd9\u513f\n      \u2514\u2500\u2500 DefaultPawnClass = BP_GymCharacter\n           \u2514\u2500\u2500 \u6302 IA_Move \/ IA_MouseLook \/ IA_Jump \/ IA_Crouch \/ IA_Sprint  \u2190 \u7ed1\u5b9a\u5728\u8fd9\u513f\n                \u2514\u2500\u2500 AGymCharacter (C++)\uff1a\u7ec4\u4ef6 + \u8f93\u5165\u5904\u7406\u5b9e\u73b0<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>GameMode \u7684 C++ \u90a3\u4e00\u884c\u515c\u5e95\u957f\u8fd9\u6837\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">AGymGameMode::AGymGameMode()\n{\n    DefaultPawnClass = AGymCharacter::StaticClass();\n}<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:spacer {\"height\":\"27px\"} -->\n<div style=\"height:27px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<!-- \/wp:spacer -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"toc-7\">CMC \u5b50\u7c7b\uff1a\u51b2\u523a<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:html -->\n<div style=\"width:10%;border-top:2.4px solid #6ec1e4;margin:-13px 0 22px\"><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>Character \u80fd\u8dd1\u80fd\u8f6c\u89c6\u89d2\u4e4b\u540e\uff0c\u5c31\u8be5\u52a8\u79fb\u52a8\u672c\u8eab\u4e86\u3002\u8fd9\u4e00\u90e8\u5206\u7528 CMC \u5b50\u7c7b\u5b9e\u73b0\u4e00\u4e2a\u6309\u4f4f Shift \u51b2\u523a\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"toc-8\">\u6539\u6210\u5458 vs override<\/h4>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>\u4e4b\u524d\u6211\u505a\u8fc7\u4e00\u7248\u51b2\u523a\uff0c\u662f\u76f4\u63a5\u4fee\u6539 CMC \u7684 MaxWalkSpeed \u6210\u5458\u5b9e\u73b0\u7684\uff1b\u8fd9\u6b21\u6539\u6210\u9760\u91cd\u5199 GetMaxSpeed() \u51fd\u6570\u6765\u5b9e\u73b0\u3002<br>\u4e24\u79cd\u505a\u6cd5\u6709\u4ec0\u4e48\u4e0d\u540c\uff1f\u6539\u6210\u5458\u662f\u300c\u5199\u72b6\u6001\u300d\uff0coverride \u662f\u300c\u8bfb\u65f6\u8ba1\u7b97\u300d\uff0c\u5176\u4f59\u5dee\u522b\u5168\u4ece\u8fd9\u91cc\u6d3e\u751f\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>\u771f\u76f8\u6709\u51e0\u4efd<\/strong> \u2014\u2014 \u6539\u6210\u5458\u8981\u81ea\u5df1\u5b58\u4e00\u4efd\u539f\u503c\uff0c\u4e8e\u662f\u6709\u4e24\u4efd\uff1boverride \u4e0d\u52a8 MaxWalkSpeed\uff0c\u914d\u7f6e\u53ea\u6709\u4e00\u4efd\u3002<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>\u8981\u4e0d\u8981\u56de\u6eda<\/strong> \u2014\u2014 \u6539\u6210\u5458\u5fc5\u987b\u8986\u76d6\u6240\u6709\u300c\u6539\u56de\u6765\u300d\u7684\u8def\u5f84\uff0c\u6f0f\u4e00\u6761\u5c31\u6c38\u4e45\u574f\uff1boverride \u6ca1\u6709\u56de\u6eda\u8fd9\u56de\u4e8b\uff0c\u6bcf\u5e27\u91cd\u7b97\uff0c\u574f\u4e00\u5e27\u81ea\u6108\u3002<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>\u4f1a\u4e0d\u4f1a\u548c\u522b\u4eba\u8e29<\/strong> \u2014\u2014 \u6539\u6210\u5458\u662f\u5168\u5c40\u53ef\u5199\u7684\u4e00\u4e2a\u6570\uff0c\u8c01\u6700\u540e\u5199\u8c01\u8d62\uff1boverride \u662f\u628a\u300c\u600e\u4e48\u7b97\u300d\u6536\u8fdb\u4e00\u4e2a\u51fd\u6570\uff0c\u51b2\u523a\u548c\u8e72\u4f0f\u8c01\u4f18\u5148\u7531\u4f60\u5728\u91cc\u9762\u660e\u786e\u5199\u6b7b\u3002<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>\u80fd\u4e0d\u80fd\u8054\u7f51<\/strong> \u2014\u2014 \u6539\u6210\u5458\u4ea7\u751f\u7684\u662f\u91cd\u653e\u4e0d\u51fa\u6765\u7684\u9690\u85cf\u72b6\u6001\uff1boverride \u7684\u8f93\u5165\u53ea\u6709\u610f\u56fe bit\uff0c\u670d\u52a1\u5668\u62ff\u5230\u8fd9 1 bit \u5c31\u80fd\u7b97\u51fa\u540c\u4e00\u4e2a\u503c\u3002\u524d\u63d0\u662f\u8fd9\u4e2a\u610f\u56fe bit \u5f97\u5148\u63a5\u8fdb CMC \u7684\u7f51\u7edc\u9884\u6d4b\uff08SavedMove\uff09\uff0c\u6211\u73b0\u5728\u7684\u7248\u672c\u8fd8\u6ca1\u63a5\uff0c\u540e\u9762\u4f1a\u8bf4\u3002<\/li>\n<!-- \/wp:list-item --><\/ul>\n<!-- \/wp:list -->\n\n<!-- wp:paragraph -->\n<p>\u5f15\u64ce\u539f\u7248\u7684 GetMaxSpeed() \u672c\u8eab\u5c31\u662f\u300c\u8bfb\u65f6\u8ba1\u7b97\u300d\uff0c\u6309\u79fb\u52a8\u6a21\u5f0f\u8fd4\u56de\u4e0d\u540c\u7684\u503c\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">float UCharacterMovementComponent::GetMaxSpeed() const\n{\n    switch(MovementMode)\n    {\n    case MOVE_Walking:\n    case MOVE_NavWalking:\n        return IsCrouching() ? MaxWalkSpeedCrouched : MaxWalkSpeed;\n    case MOVE_Falling:\n        return MaxWalkSpeed;\n    case MOVE_Swimming:\n        return MaxSwimSpeed;\n    case MOVE_Flying:\n        return MaxFlySpeed;\n    case MOVE_Custom:\n        return MaxCustomMovementSpeed;\n    case MOVE_None:\n    default:\n        return 0.f;\n    }\n}<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u6240\u4ee5\u5982\u679c\u51b2\u523a\u662f\u9760\u6539 MaxWalkSpeed\uff0c\u8e72\u7740\u7684\u65f6\u5019\u8fd9\u4e2a\u503c\u6839\u672c\u6ca1\u4eba\u8bfb\uff0c\u6309\u8fd9\u6bb5\u4ee3\u7801\u63a8\uff0c\u8e72\u7740\u6309\u51b2\u523a\u5c31\u662f\u6ca1\u53cd\u5e94\uff0c\u800c\u4e14\u4e0d\u4f1a\u6709\u4efb\u4f55\u62a5\u9519\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"toc-9\">GymCharacterMovementComponent<\/h4>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>\u5148\u8bf4\u8fd9\u4e2a CMC \u5b50\u7c7b\u7684\u804c\u8d23\uff1a\u4e0d\u9700\u8981\u91cd\u65b0\u5b9e\u73b0\u6574\u4e2a\u89d2\u8272 3C \u7cfb\u7edf\uff0c\u53ea\u9700\u8981\u5728\u539f\u6709 CMC \u903b\u8f91\u4e0a\u52a0\u4e0a\u51b2\u523a\u76f8\u5173\u7684\u903b\u8f91\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>\u5148\u5728\u7f16\u8f91\u5668\u91cc\u6309\u7167\u5411\u5bfc\uff0c\u521b\u5efa\u7ee7\u627f\u81ea UE \u81ea\u5e26 CMC \u7684 C++ \u7c7b\uff0c\u8fd9\u91cc\u5c06\u8fd9\u4e2a CMC \u5b50\u7c7b\u53d6\u540d\u4e3a GymCharacterMovementComponent\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:image {\"align\":\"center\"} -->\n<figure class=\"wp-block-image aligncenter\"><img decoding=\"async\" src=\"https:\/\/www.xinot.icu\/wp-content\/uploads\/2026\/10\/\u7ed9Character\u6362\u4e00\u4e2a\u81ea\u5df1\u7684CMC_\u56fe1.png\" alt=\"\"\/><\/figure>\n<!-- \/wp:image -->\n\n<!-- wp:paragraph -->\n<p>\u9700\u8981\u5199\u7684\u4ee3\u7801\u6709\u8fd9\u4e9b\u3002\u65b0\u589e\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>\u4e00\u4e2a\u51b2\u523a\u7684 bool \u610f\u56fe<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>\u4e00\u4e2a\u51b2\u523a\u5224\u5b9a\u51fd\u6570<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>\u51b2\u523a\u72b6\u6001\u4e0b\u7684\u52a0\u901f\u5ea6\u548c\u6700\u5927\u901f\u5ea6<\/li>\n<!-- \/wp:list-item --><\/ul>\n<!-- \/wp:list -->\n\n<!-- wp:paragraph -->\n<p>\u91cd\u5199\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>GetMaxSpeed\uff0c\u589e\u52a0\u51b2\u523a\u72b6\u6001\u4e0b\u8fd4\u56de\u7684\u901f\u5ea6<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>GetMaxAcceleration\uff0c\u540c\u4e0a\uff0c\u8fd4\u56de\u52a0\u901f\u5ea6<\/li>\n<!-- \/wp:list-item --><\/ul>\n<!-- \/wp:list -->\n\n<!-- wp:paragraph -->\n<p>\u5934\u6587\u4ef6\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">UCLASS()\nclass MYDEMO_API UGymCharacterMovementComponent : public UCharacterMovementComponent\n{\n    GENERATED_BODY()\n\npublic:\n\n    \/\/ \u5224\u65ad\u73a9\u5bb6\u662f\u5426\u5904\u4e8e\u51b2\u523a\u72b6\u6001\n    bool IsSprinting() const;\n\n    \/\/ \u73a9\u5bb6\u60f3\u4e0d\u60f3\u51b2\u523a\u7684flag\n    UPROPERTY(BlueprintReadOnly, Category = \"Sprint\")\n    bool bWantsToSprint = false;\n\n    \/\/ \u91cd\u5199GetMaxSpeed\u51fd\u6570\uff0c\u51b2\u523a\u72b6\u6001\u65f6\u8fd4\u56de\u51b2\u523a\u901f\u5ea6\n    virtual float GetMaxSpeed() const override;\n    \/\/ \u91cd\u5199GetMaxAcceleration\u51fd\u6570\uff0c\u51b2\u523a\u72b6\u6001\u65f6\u8fd4\u56de\u51b2\u523a\u52a0\u901f\u5ea6\n    virtual float GetMaxAcceleration() const override;\n\nprotected:\n\n    \/\/ \u73a9\u5bb6\u51b2\u523a\u7684\u901f\u5ea6\u548c\u52a0\u901f\u5ea6\uff0cbp\u91cc\u9762\u53ef\u4ee5\u8c03\u6574\uff0c\u5206\u7c7b\u53eb\u505aSprint\n    UPROPERTY(EditAnywhere, Category = \"Sprint\")\n    float SprintSpeed = 1000.f;\n\n    \/\/ \u53d6\u540d\u5bf9\u7167\u5f15\u64ce\u7684\u547d\u540d\u89c4\u8303\uff0c\u901f\u5ea6\u662fSpeed\uff0c\u52a0\u901f\u5ea6\u662fAcceleration\n    UPROPERTY(EditAnywhere, Category = \"Sprint\")\n    float SprintAcceleration = 4096.f;\n};<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>CPP\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">bool UGymCharacterMovementComponent::IsSprinting() const\n{\n    \/\/ \u53ea\u6709\u5728\u5e73\u5730\u884c\u8d70\u65f6\uff0cbWantsToSprint\u4e3atrue\uff0c\u624d\u5141\u8bb8\u51b2\u523a\uff0c\u8e72\u4e0b\u3001\u7a7a\u4e2d\u3001\u722c\u5899\u7b49\u72b6\u6001\u4e0b\u4e0d\u5141\u8bb8\u51b2\u523a\n    return bWantsToSprint &amp;&amp; MovementMode == MOVE_Walking &amp;&amp; !IsCrouching();\n}\n\nfloat UGymCharacterMovementComponent::GetMaxSpeed() const\n{\n    \/\/ \u5982\u679c\u73a9\u5bb6\u60f3\u8981\u51b2\u523a\uff0c\u5c31\u8fd4\u56de\u51b2\u523a\u901f\u5ea6\uff0c\u5426\u5219\u8fd4\u56de\u9ed8\u8ba4\u7684\u6700\u5927\u901f\u5ea6\n    if(IsSprinting()) return SprintSpeed;\n\n    return Super::GetMaxSpeed();\n}\n\nfloat UGymCharacterMovementComponent::GetMaxAcceleration() const\n{\n    \/\/ \u73a9\u5bb6\u5904\u4e8e\u51b2\u523a\u72b6\u6001\u65f6\u624d\u8fd4\u56de\u51b2\u523a\u52a0\u901f\u5ea6\uff0c\u51b2\u523a\u72b6\u6001\u7684\u5224\u5b9a\u4e0eGetMaxSpeed\u65b9\u6cd5\u4e00\u81f4\n    if (IsSprinting()) return SprintAcceleration;\n\n    return Super::GetMaxAcceleration();\n}<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u4e24\u4e2a override \u90fd\u662f\u5728\u5f15\u64ce\u539f\u7248\u5916\u9762\u5957\u4e00\u5c42\uff1a\u51b2\u523a\u65f6\u8fd4\u56de\u81ea\u5df1\u7684\u503c\uff0c\u5176\u4f59\u60c5\u51b5\u4ea4\u8fd8\u7ed9 Super::\u3002\u5f15\u64ce\u539f\u7248\u7684 GetMaxAcceleration() \u53ea\u6709\u4e00\u884c return MaxAcceleration;\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>SprintAcceleration \u4e3a\u4ec0\u4e48\u662f 4096\uff1f\u76f4\u7ebf\u52a0\u901f\u65f6\uff0cCalcVelocity \u91cc\u4fee\u6b63\u65b9\u5411\u7684\u90a3\u4e00\u9879\u4e0d\u6539\u53d8\u901f\u5ea6\u5927\u5c0f\uff0c\u6240\u4ee5\u4ece\u9759\u6b62\u52a0\u901f\u5230\u4e0a\u9650\u7684\u65f6\u95f4\u5c31\u662f\u300c\u901f\u5ea6\u5dee \u00f7 \u52a0\u901f\u5ea6\u300d\u3002\u5f15\u64ce\u9ed8\u8ba4\u8d70\u8def\u662f 600 \/ 2048 \u2248 0.29 \u79d2\uff1b\u51b2\u523a\u5982\u679c\u4e0d\u6539\u52a0\u901f\u5ea6\uff0c\u5c31\u662f 1000 \/ 2048 \u2248 0.49 \u79d2\uff0c\u8d77\u6b65\u4f1a\u663e\u5f97\u62d6\u6c93\u3002\u6309\u540c\u6837\u7684\u6bd4\u4f8b\u653e\u5927\u662f 3413\uff0c\u6211\u53d6\u4e86 4096\uff0c\u4e5f\u5c31\u662f 0.24 \u79d2\uff0c\u6211\u7684\u624b\u611f\u504f\u597d\u8d77\u6b65\u66f4\u5feb\u4e00\u70b9\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"toc-10\">Character \u4fa7\u6309\u952e\u63a5\u5165<\/h4>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>CMC \u90a3\u8fb9\u51c6\u5907\u597d\u4e86\uff0cCharacter \u8fd9\u8fb9\u8981\u505a\u7684\u5c31\u662f\u628a\u6309\u952e\u63a5\u4e0a\u3002\u9700\u8981\u5199\u7684\u4ee3\u7801\u6709\u8fd9\u4e9b\uff0c\u65b0\u589e\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>\u51b2\u523a\u7684 IA<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>\u51b2\u523a\u5f00\u59cb\/\u7ed3\u675f\u7684\u65b9\u6cd5<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>\u5728 SetupPlayerInputComponent \u91cc\u7ed1\u5b9a Started \/ Completed\uff0c\u5206\u522b\u5bf9\u5e94\u51b2\u523a\u5f00\u59cb\/\u7ed3\u675f\u7684\u65b9\u6cd5<\/li>\n<!-- \/wp:list-item --><\/ul>\n<!-- \/wp:list -->\n\n<!-- wp:paragraph -->\n<p>\u5934\u6587\u4ef6\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">UPROPERTY(EditAnywhere, Category = \"Input\")\nUInputAction* SprintAction;\n\nvoid StartSprint();\nvoid StopSprint();<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>CPP\uff0c\u7ed1\u5b9a\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">\/\/ Sprint\u6309\u4e0b\u89e6\u53d1\uff0c\u677e\u5f00\u505c\u6b62\u89e6\u53d1\nEIC-&gt;BindAction(SprintAction, ETriggerEvent::Started, this, &amp;AGymCharacter::StartSprint);\nEIC-&gt;BindAction(SprintAction, ETriggerEvent::Completed, this, &amp;AGymCharacter::StopSprint);<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u7ed1\u5230\u7684\u4e24\u4e2a\u51fd\u6570\uff0c\u5404\u81ea\u53ea\u505a\u4e00\u4ef6\u4e8b\uff0c\u5c31\u662f\u6539\u610f\u56fe\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">void AGymCharacter::StartSprint()\n{\n    UGymCharacterMovementComponent* GymCMC = Cast&lt;UGymCharacterMovementComponent&gt;(GetCharacterMovement());\n    if (GymCMC) GymCMC-&gt;bWantsToSprint = true;\n}\n\nvoid AGymCharacter::StopSprint()\n{\n    UGymCharacterMovementComponent* GymCMC = Cast&lt;UGymCharacterMovementComponent&gt;(GetCharacterMovement());\n    if (GymCMC) GymCMC-&gt;bWantsToSprint = false;\n}<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u8fd9\u91cc\u8981 Cast\uff0c\u662f\u56e0\u4e3a GetCharacterMovement() \u8fd4\u56de\u7684\u662f\u57fa\u7c7b UCharacterMovementComponent* \u6307\u9488\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"toc-11\">\u804c\u8d23\u68b3\u7406<\/h4>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>\u8fd9\u6b21\u53ef\u4ee5\u660e\u786e\u770b\u5230\u4e24\u8005\u7684\u804c\u8d23\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">Character\n\u2502\n\u251c\u2500\u2500 \u63a5\u6536\u73a9\u5bb6\u8f93\u5165\n\u2502\n\u2514\u2500\u2500 \u544a\u8bc9 CMC\uff1a\n    \"\u73a9\u5bb6\u60f3\u5e72\u4ec0\u4e48\"\n            \u2193\n            \u2193\nCMC\n\u2502\n\u251c\u2500\u2500 \u5224\u65ad\u5f53\u524d\u72b6\u6001\n\u251c\u2500\u2500 \u51b3\u5b9a\u662f\u5426\u5141\u8bb8\u884c\u4e3a\n\u251c\u2500\u2500 \u8ba1\u7b97\u79fb\u52a8\u53c2\u6570\n\u2502\n\u2514\u2500\u2500 \u6267\u884c\u5b9e\u9645\u79fb\u52a8<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"toc-12\">\u5b9e\u6d4b<\/h4>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>PIE \u91cc\u6253\u5f00 p.VisualizeMovement 1\uff0c\u89d2\u8272\u5934\u9876\u4f1a\u663e\u793a\u79fb\u52a8\u8c03\u8bd5\u4fe1\u606f\uff0c\u5176\u4e2d Velocity \u90a3\u4e00\u884c\u5e26\u7740\u5f53\u524d\u7684 Max\uff08\u6700\u5927\u901f\u5ea6\uff09\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>\u5e73\u5730\u6309\u4f4f Shift\uff1aMax \u4ece 600 \u8df3\u5230 1000\u3002<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>\u8e72\u7740\u6309 Shift\uff1a\u4e0d\u51b2\u523a\uff0cIsSprinting() \u91cc\u7684 !IsCrouching() \u751f\u6548\u3002<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>\u51b2\u523a\u4e2d\u6309 Ctrl \u8e72\u4e0b\uff1a\u6389\u5230 300\uff08\u5f15\u64ce\u9ed8\u8ba4\u8e72\u4f0f\u901f\u5ea6\u662f MaxWalkSpeed * 0.5\uff09\uff1b\u677e\u5f00 Ctrl\uff0c\u81ea\u52a8\u6062\u590d\u5230 1000\uff0c\u4e0d\u9700\u8981\u91cd\u6309 Shift\u3002\u8fd9\u5c31\u662f\u524d\u9762\u8bf4\u7684\u300c\u6bcf\u5e27\u91cd\u7b97\uff0c\u574f\u4e00\u5e27\u81ea\u6108\u300d\u3002<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>\u6309\u4f4f Shift \u8d77\u8df3\uff1aMax \u663e\u793a 600\uff0c\u4f46\u6c34\u5e73\u901f\u5ea6\u4fdd\u6301\u5728 1000\u3002<\/li>\n<!-- \/wp:list-item --><\/ul>\n<!-- \/wp:list -->\n\n<!-- wp:paragraph -->\n<p>\u6700\u540e\u4e00\u6761\u4e00\u5f00\u59cb\u6211\u4ee5\u4e3a\u4f1a\u88ab\u524a\u901f\uff1a\u79bb\u5730\u540e IsSprinting() \u56e0\u4e3a MOVE_Walking \u4e0d\u6210\u7acb\u800c\u53d8\u6210 false\uff0cGetMaxSpeed() \u56de\u843d\u5230 600\uff0c\u901f\u5ea6\u5e94\u8be5\u88ab\u62c9\u56de\u53bb\u624d\u5bf9\u3002\u5b9e\u6d4b\u4e0d\u662f\u8fd9\u6837\uff0c\u7ffb\u4e86\u4e0b\u6e90\u7801\uff0c\u7a7a\u4e2d\u6709\u4e24\u5904\u76f8\u5173\u7684\u903b\u8f91\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>\u8d85\u901f\u786e\u5b9e\u4f1a\u8fdb CalcVelocity \u7684\u5236\u52a8\u5206\u652f\uff0c\u4f46\u7a7a\u4e2d\u4f20\u8fdb\u53bb\u7684\u6469\u64e6\u662f FallingLateralFriction\uff0c\u5236\u52a8\u51cf\u901f\u5ea6\u662f BrakingDecelerationFalling\uff0c\u5f15\u64ce\u9ed8\u8ba4\u90fd\u662f 0\uff08CharacterMovementComponent.cpp:724\u3001:729\uff09\u3002ApplyVelocityBraking \u5f00\u5934\u5c31\u5224\u65ad\u4e86\u6469\u64e6\u548c\u5236\u52a8\u90fd\u662f 0 \u7684\u8bdd\u76f4\u63a5 return\uff0c\u4ec0\u4e48\u90fd\u4e0d\u505a\u3002<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>\u5df2\u7ecf\u8d85\u901f\u65f6\uff0cCalcVelocity \u5939\u901f\u5ea6\u7684\u76ee\u6807\u662f\u300c\u5f53\u524d\u901f\u5ea6\u300d\u800c\u4e0d\u662f MaxSpeed\uff08:3841\uff09\uff0c\u5b83\u53ea\u963b\u6b62\u7ee7\u7eed\u52a0\u901f\uff0c\u4e0d\u4f1a\u5f80\u4e0b\u62c9\u3002<\/li>\n<!-- \/wp:list-item --><\/ul>\n<!-- \/wp:list -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">const float NewMaxInputSpeed = IsExceedingMaxSpeed(MaxInputSpeed) ? Velocity.Size() : MaxInputSpeed;<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u6240\u4ee5\u7a7a\u4e2d\u8d85\u901f\u662f\u6ca1\u6709\u7ea0\u6b63\u673a\u5236\u7684\uff0c\u51b2\u8d77\u6765\u7684\u901f\u5ea6\u4f1a\u88ab\u5e26\u8fdb\u7a7a\u4e2d\u3002<br>\u843d\u5730\u4e4b\u540e\uff1a\u5982\u679c\u8fd8\u6309\u7740 Shift\uff0cWalking \u4e0b IsSprinting() \u53c8\u6210\u7acb\uff0c\u4e0a\u9650\u56de\u5230 1000\uff1b\u5982\u679c\u7a7a\u4e2d\u5df2\u7ecf\u677e\u5f00\uff0c\u843d\u5730\u4e0a\u9650\u662f 600\uff0c\u901f\u5ea6 1000\uff0c\u8d85\u901f\u5c31\u4f1a\u8d70\u5730\u9762\u7684\u5236\u52a8\u53c2\u6570\uff08BrakingDecelerationWalking \u9ed8\u8ba4\u7b49\u4e8e MaxAcceleration \u5373 2048\u3001GroundFriction 8\u3001BrakingFrictionFactor 2\uff09\uff0c\u628a\u901f\u5ea6\u538b\u56de 600\u3002\u8fd8\u6309\u7740\u65b9\u5411\u952e\u7684\u8bdd\uff0c:3818 \u90a3\u6bb5\u4f1a\u4fdd\u8bc1\u5236\u52a8\u4e0d\u4f1a\u628a\u901f\u5ea6\u538b\u5230 600 \u4ee5\u4e0b\u3002<br>MOVE_Walking \u8fd9\u4e2a\u95e8\u69db\uff0c\u53ea\u51b3\u5b9a\u300c\u7a7a\u4e2d\u80fd\u4e0d\u80fd\u91cd\u65b0\u52a0\u901f\u5230 1000\u300d\uff0c\u4e0d\u5f71\u54cd\u300c\u5df2\u7ecf\u51b2\u8d77\u6765\u7684\u901f\u5ea6\u5e26\u8fdb\u7a7a\u4e2d\u300d\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:spacer {\"height\":\"27px\"} -->\n<div style=\"height:27px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<!-- \/wp:spacer -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"toc-13\">\u7236\u7c7b\u7684 CMC \u5b50\u5bf9\u8c61\u66ff\u6362<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:html -->\n<div style=\"width:10%;border-top:2.4px solid #6ec1e4;margin:-13px 0 22px\"><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u4e0a\u9762\u4e00\u76f4\u9ed8\u8ba4 GetCharacterMovement() \u62ff\u5230\u7684\u5c31\u662f GymCMC\uff0c\u4f46 CMC \u662f ACharacter \u81ea\u5df1\u521b\u5efa\u7684\uff0c\u600e\u4e48\u8ba9\u5b83\u521b\u5efa\u7684\u662f\u6211\u7684\u5b50\u7c7b\uff1f\u8fd9\u662f\u8fd9\u7bc7\u6700\u60f3\u8bb0\u7684\u90e8\u5206\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"toc-14\">C++ \u6784\u9020\u51fd\u6570\u7684\u4e24\u4e2a\u9636\u6bb5<\/h4>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>C++ \u6784\u9020\u51fd\u6570\u53ef\u4ee5\u7c97\u7565\u7406\u89e3\u6210\u4e24\u4e2a\u9636\u6bb5\uff1a\u521d\u59cb\u5316\u9636\u6bb5 + \u6784\u9020\u51fd\u6570\u4f53\u6267\u884c\u9636\u6bb5\u3002\u8fd9\u5c5e\u4e8e C++ \u7684\u5bf9\u8c61\u6784\u9020\u673a\u5236\uff0c\u5e76\u975e UE C++ \u72ec\u6709\u3002<br>\u6bd4\u5982\u6709\u8fd9\u6837\u4e00\u6bb5\u4ee3\u7801\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">AMyCharacter::AMyCharacter()\n    : Super()\n    , SomeMember(123)\n{\n    SomeMember = 456;\n}<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u53ef\u4ee5\u7406\u89e3\u4e3a\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">\u7b2c\u4e00\u9636\u6bb5\uff1a\u521d\u59cb\u5316\u9636\u6bb5\n    \u2193\n\u6784\u9020\u7236\u7c7b\n\u6784\u9020\u6210\u5458\u53d8\u91cf\n    \u2193\n\u7b2c\u4e8c\u9636\u6bb5\uff1a\u6267\u884c\u6784\u9020\u51fd\u6570\u4f53\n    \u2193\n\u6267\u884c { } \u91cc\u7684\u4ee3\u7801<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u90a3\u4e48\u521d\u59cb\u5316\u5217\u8868\u5c31\u662f\u5192\u53f7\u540e\u9762\u7684\u8fd9\u4e00\u6574\u6bb5\uff0c\u5b83\u8d1f\u8d23\u5728\u8fdb\u5165\u6784\u9020\u51fd\u6570\u4f53\u4e4b\u524d\uff0c\u8c03\u7528\u7236\u7c7b\u6784\u9020\u51fd\u6570\u548c\u521d\u59cb\u5316\u6210\u5458\u53d8\u91cf\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">Super()\nSomeMember(123)<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u5982\u679c\u6d3e\u751f\u7c7b\u6784\u9020\u51fd\u6570\u7684\u521d\u59cb\u5316\u5217\u8868\u6ca1\u6709\u663e\u5f0f\u6307\u5b9a\u7236\u7c7b\uff0c\u90a3\u4e48\u7236\u7c7b\u4f1a\u88ab\u9ed8\u8ba4\u521d\u59cb\u5316\uff0c\u8fd9\u610f\u5473\u7740\u4f1a\u8c03\u7528\u7236\u7c7b\u7684\u65e0\u53c2\u6784\u9020\u51fd\u6570\uff1b\u82e5\u7236\u7c7b\u6ca1\u6709\u65e0\u53c2\u6784\u9020\u51fd\u6570\uff0c\u5219\u4f1a\u7f16\u8bd1\u62a5\u9519\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>\u4e3a\u4ec0\u4e48\u9700\u8981\u8fd9\u79cd\u673a\u5236\uff1f\u5148\u4ece\u4e00\u4e2a\u5bf9\u8c61\u662f\u600e\u4e48\u88ab\u521b\u5efa\u7684\u8bf4\u8d77\u3002\u5047\u8bbe\u6211\u4eec\u6709\u4e00\u4e2a\u7c7b AGymCharacter\uff0c\u5e76\u4e14\u521b\u5efa\u5bf9\u5e94\u7684\u5bf9\u8c61\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">class MYDEMO_API AGymCharacter : public ACharacter {}\n\nAGymCharacter* Character = ...<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u90a3\u4e48\u6b64\u65f6\u5b9e\u9645\u7684\u521b\u5efa\u987a\u5e8f\u662f\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">\u521b\u5efa AGymCharacter\n      \u2193\n\u6784\u9020 UObject\n      \u2193\n\u6784\u9020 AActor\n      \u2193\n\u6784\u9020 APawn\n      \u2193\n\u6784\u9020 ACharacter  \u6b64\u65f6\u4f1a\u521b\u5efaUE\u9ed8\u8ba4\u7684CMC\n      \u2193\n\u6784\u9020 AGymCharacter\n      \u2193\n\u5b8c\u6210<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u4e5f\u5c31\u662f\u8bf4\uff0c\u7236\u7c7b\u6c38\u8fdc\u5148\u6784\u9020\uff08\u6790\u6784\u5219\u76f8\u53cd\uff0c\u5b50\u7c7b\u5148\u6790\u6784\uff09\uff0c\u6bcf\u4e00\u5c42\u7236\u7c7b\u5728\u6267\u884c\u81ea\u5df1\u7684\u51fd\u6570\u4f53\u4e4b\u524d\uff0c\u53c8\u5fc5\u987b\u5148\u628a\u81ea\u5df1\u7684\u7236\u7c7b\u521d\u59cb\u5316\u5b8c\u6210\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>ACharacter \u7684\u6784\u9020\u51fd\u6570\u91cc\uff0c\u521b\u5efa CMC \u7684\u5c31\u662f\u8fd9\u4e00\u884c\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">CharacterMovement = CreateDefaultSubobject&lt;UCharacterMovementComponent&gt;(ACharacter::CharacterMovementComponentName);<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u6240\u4ee5\u5f53\u8fdb\u5165 AGymCharacter \u7684\u6784\u9020\u51fd\u6570\u4f53\u65f6\uff0cACharacter \u5df2\u7ecf\u6784\u9020\u5b8c\u6210\uff0c\u800c CMC \u4e5f\u5df2\u7ecf\u5728 ACharacter \u7684\u6784\u9020\u8fc7\u7a0b\u4e2d\u521b\u5efa\u5b8c\u6210\uff0c\u6b64\u65f6\u518d\u60f3\u628a UE \u7684 CMC \u6362\u6210\u81ea\u5df1\u7684 GymCMC\uff0c\u5df2\u7ecf\u592a\u665a\u4e86\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"toc-15\">Subobject \u5b50\u5bf9\u8c61<\/h4>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>\u300cCMC \u662f ACharacter \u7684\u9ed8\u8ba4\u5b50\u5bf9\u8c61\u300d\uff0c\u8fd9\u53e5\u8bdd\u600e\u4e48\u7406\u89e3\uff1f\u6ce8\u610f\u8fd9\u91cc\u8bf4\u7684\u662f\u9ed8\u8ba4\u5b50\u5bf9\u8c61\uff08Default Subobject\uff09\uff0c\u4e0e\u666e\u901a\u7684\u300c\u5b50\u7c7b\u300d\u6982\u5ff5\u4e0d\u540c\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>\u7236\u7c7b\u5b50\u7c7b\u4e4b\u95f4\u7684\u5173\u7cfb\u662f\u300c\u7ee7\u627f\u300d\uff0c\u6bd4\u5982\u8bf4\uff1aACharacter is-a APawn\u3002\u800c\u5b50\u5bf9\u8c61\u7684\u6982\u5ff5\u662f\u300c\u62e5\u6709\u300d\u5173\u7cfb\uff0c\u6bd4\u5982\u8bf4\uff1aACharacter has-a CharacterMovementComponent\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>\u4ee5 ACharacter \u4e3e\u4f8b\u5b50\uff0c\u53ef\u4ee5\u628a ACharacter \u60f3\u6210\u4e00\u4e2a\u300c\u5927\u5bf9\u8c61\u300d\uff0c\u5b83\u91cc\u9762\u62e5\u6709\u3001\u7ba1\u7406\u7740\u4e00\u4e9b\u5c5e\u4e8e\u81ea\u5df1\u7684\u5c0f\u5bf9\u8c61\uff0c\u8fd9\u4e9b\u5c0f\u5bf9\u8c61\u5c31\u662f\u5b83\u7684 Subobject\uff08\u5b50\u5bf9\u8c61\uff09\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">ACharacter\n\u251c\u2500\u2500 CapsuleComponent\n\u251c\u2500\u2500 Mesh\n\u251c\u2500\u2500 CharacterMovement\n\u2514\u2500\u2500 ...<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u7406\u89e3\u4e86\u5b50\u5bf9\u8c61\u7684\u6982\u5ff5\uff0c\u9ed8\u8ba4\u5b50\u5bf9\u8c61\u4e5f\u597d\u7406\u89e3\u4e86\uff1aACharacter \u9700\u8981\u62e5\u6709 CharacterMovement \u7c7b\u578b\u7684\u5b50\u5bf9\u8c61\uff0c\u800c\u6784\u9020 ACharacter \u7684\u65f6\u5019\uff0c\u9ed8\u8ba4\u521b\u5efa\u7684\u90a3\u4e2a CharacterMovement \u7c7b\u578b\u7684\u5b50\u5bf9\u8c61\u5c31\u662f CMC\uff0c\u6240\u4ee5 CMC \u5c31\u662f ACharacter \u7684\u9ed8\u8ba4\u5b50\u5bf9\u8c61\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>\u6240\u4ee5\u5f53 AGymCharacter \u6784\u5efa\u7684\u65f6\u5019\uff0c\u5b83\u4f1a\u76f4\u63a5\u7ee7\u627f ACharacter \u6240\u62e5\u6709\u7684 CMC\u3002\u66f4\u51c6\u786e\u7684\u63cf\u8ff0\u662f\uff1aAGymCharacter \u7ee7\u627f\u4e86 ACharacter\uff0c\u56e0\u6b64 ACharacter \u90a3\u90e8\u5206\u5bf9\u8c61\u72b6\u6001\u4e5f\u5c5e\u4e8e\u8fd9\u4e2a AGymCharacter \u5bf9\u8c61\uff0c\u5176\u4e2d\u5305\u62ec\u7531 ACharacter \u521b\u5efa\u548c\u62e5\u6709\u7684 CMC\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"toc-16\">FObjectInitializer<\/h4>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>\u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u4e2a\u673a\u5236\uff0c\u5728 AGymCharacter \u7684\u6784\u9020\u8fc7\u7a0b\u4e2d\uff0c\u63d0\u524d\u544a\u8bc9\u7236\u7c7b ACharacter\uff1a\u7b49\u4f1a\u513f\u521b\u5efa CMC \u9ed8\u8ba4\u5b50\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u8981\u7528 GymCMC \u8fd9\u4e2a\u7c7b\u3002<br>\u6ce8\u610f\uff0c\u5e76\u4e0d\u662f\u5c06\u5df2\u7ecf\u521b\u5efa\u597d\u7684 CMC \u66ff\u6362\u6389\uff0c\u800c\u662f\u5728 ACharacter \u521b\u5efa\u5b83\u7684\u9ed8\u8ba4\u5b50\u5bf9\u8c61 CMC \u4e4b\u524d\uff0c\u5c31\u544a\u8bc9\u5b83\u8fd9\u6b21\u7528\u53e6\u4e00\u4e2a\u7c7b\u6765\u521b\u5efa\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>FObjectInitializer \u53ef\u4ee5\u628a\u5b83\u7406\u89e3\u6210\uff1aUE \u5728\u300c\u521b\u5efa\u4e00\u4e2a UObject \u5bf9\u8c61\u300d\u7684\u8fc7\u7a0b\u4e2d\uff0c\u968f\u8eab\u5e26\u7740\u7684\u4e00\u4efd\u300c\u6784\u9020\u914d\u7f6e\u5355\u300d\uff0c\u5b83\u4f1a\u544a\u8bc9 UE \u8fd9\u6b21\u521b\u5efa\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u5404\u79cd\u9ed8\u8ba4\u5b50\u5bf9\u8c61\u8be5\u600e\u4e48\u521b\u5efa\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>\u5177\u4f53\u505a\u6cd5\u662f\uff0c\u5728\u6784\u9020\u51fd\u6570\u7684\u58f0\u660e\u91cc\u52a0\u4e0a FObjectInitializer \u7c7b\u578b\u7684\u53c2\u6570\uff0c\u6362\u6389\u6784\u9020\u51fd\u6570\u7684\u7b7e\u540d\uff1b\u7136\u540e\u5728\u8be5\u6784\u9020\u51fd\u6570\u7684\u521d\u59cb\u5316\u5217\u8868\u91cc\uff0c\u5c31\u53ef\u4ee5\u8c03\u7528\u6307\u5b9a\u7684\u7236\u7c7b\u6784\u9020\u51fd\u6570\u4e86\u3002\u8fd9\u6837\uff0c\u5728\u6784\u9020 AGymCharacter \u7684\u65f6\u5019\uff0c\u80fd\u591f\u62ff\u5230 FObjectInitializer \u8fd9\u5f20\u300c\u9884\u7ea6\u5355\u300d\uff0c\u518d\u901a\u8fc7\u521d\u59cb\u5316\u5217\u8868\u628a\u5b83\u4f20\u7ed9 ACharacter\u3002<br>\u5c31\u80fd\u8fbe\u5230 ACharacter \u521b\u5efa\u5b50\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u6362\u6210 GymCMC \u8fd9\u4e2a\u7c7b\u7684\u6548\u679c\uff01<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">\/\/ \u5934\u6587\u4ef6\u58f0\u660e\nAGymCharacter(const FObjectInitializer&amp; ObjectInitializer);\n\/\/ CPP\u5b9a\u4e49\nAGymCharacter::AGymCharacter(\n    const FObjectInitializer&amp; ObjectInitializer\n)\n    : Super(\n        ObjectInitializer.SetDefaultSubobjectClass&lt;UGymCharacterMovementComponent&gt;(\n            ACharacter::CharacterMovementComponentName\n        )\n    )\n{\n    \/\/ ACharacter \u4f1a\u5728\u81ea\u5df1\u7684\u6784\u9020\u9636\u6bb5\u521b\u5efa CMC\uff0c\u6240\u4ee5\u6211\u8981\u5728 ACharacter \u6784\u9020\u4e4b\u524d\uff0c\u901a\u8fc7 FObjectInitializer \n    \/\/ \u63d0\u524d\u9884\u7ea6\uff1a\"\u8fd9\u4e2a CMC \u7528\u6211\u7684\u5b50\u7c7b\u6765\u521b\u5efa\u3002\"\n\n    \/\/ ......\u5404\u79cd\u6784\u9020\u51fd\u6570\u4f53\u4ee3\u7801\n}<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>ACharacter::CharacterMovementComponentName \u662f ACharacter \u91cc\u7684\u4e00\u4e2a\u9759\u6001 FName\uff08\u503c\u662f &#8220;CharMoveComp&#8221;\uff09\u3002ACharacter \u521b\u5efa CMC \u65f6\u7528\u7684\u4e5f\u662f\u8fd9\u4e2a\u540d\u5b57\uff0c\u6240\u4ee5\u5b83\u80fd\u9760\u540d\u5b57\u627e\u5230\u8fd9\u6b21\u767b\u8bb0\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"toc-17\">\u4e3a\u4ec0\u4e48\u53ea\u80fd\u5728\u521d\u59cb\u5316\u5217\u8868\u91cc\uff1f<\/h4>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>\u4e0a\u9762\u8bf4\u7684\u300c\u5df2\u7ecf\u592a\u665a\u300d\uff0c\u5728\u6e90\u7801\u91cc\u6709\u66f4\u5177\u4f53\u7684\u7b54\u6848\u3002<br>SetDefaultSubobjectClass \u505a\u7684\u4e8b\u5f88\u7b80\u5355\uff0c\u5c31\u662f\u5f80\u914d\u7f6e\u5355\u91cc\u767b\u8bb0\u4e00\u6761\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">\/**\n * Sets the class to use for a subobject defined in a base class, the class must be a subclass of the class used by the base class.\n *\/\nconst FObjectInitializer&amp; SetDefaultSubobjectClass(FName SubobjectName, const UClass* Class) const\n{\n    AssertIfSubobjectSetupIsNotAllowed(SubobjectName);\n    SubobjectOverrides.Add(SubobjectName, Class);\n    return *this;\n}<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u6ce8\u91ca\u91cc\u4e5f\u5199\u4e86\uff0c\u6362\u4e0a\u53bb\u7684\u7c7b\u5fc5\u987b\u662f\u7236\u7c7b\u539f\u672c\u90a3\u4e2a\u7c7b\u7684\u5b50\u7c7b\uff0cGymCMC \u7ee7\u627f\u81ea CMC\uff0c\u6240\u4ee5\u6ca1\u95ee\u9898\u3002\u5b83\u8fd4\u56de\u7684\u662f\u914d\u7f6e\u5355\u81ea\u5df1\uff0c\u6240\u4ee5\u300c\u767b\u8bb0\u300d\u548c\u300c\u4f20\u7ed9 Super\u300d\u53ef\u4ee5\u5199\u6210\u540c\u4e00\u4e2a\u8868\u8fbe\u5f0f\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>\u5173\u952e\u5728\u7b2c\u4e00\u884c\u90a3\u4e2a\u68c0\u67e5\u3002\u6700\u5e95\u5c42\u7684 UObject \u6784\u9020\u51fd\u6570\u4e00\u6267\u884c\uff0c\u5c31\u4f1a\u628a\u767b\u8bb0\u5173\u6389\uff08UObjectGlobals.cpp:3966\uff09\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">const_cast&lt;FObjectInitializer&amp;&gt;(ObjectInitializer).FinalizeSubobjectClassInitialization();<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u5173\u6389\u4e4b\u540e\u518d\u8c03 SetDefaultSubobjectClass\uff0cAssertIfSubobjectSetupIsNotAllowed \u4f1a\u76f4\u63a5 Fatal\uff08UObjectGlobals.cpp:4810\uff09\uff0c\u62a5\u9519\u4fe1\u606f\u5199\u5f97\u5f88\u76f4\u767d\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">Subobject class setup is only allowed in base class constructor call (in the initialization list)<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u800c Super(&#8230;) \u62ec\u53f7\u91cc\u7684\u90a3\u4e2a\u8868\u8fbe\u5f0f\uff0c\u662f\u5728\u8c03\u7528\u7236\u7c7b\u6784\u9020\u51fd\u6570\u4e4b\u524d\u5c31\u6c42\u503c\u7684\uff0c\u90a3\u65f6\u8fde UObject \u90fd\u8fd8\u6ca1\u5f00\u59cb\u6784\u9020\uff0c\u767b\u8bb0\u8fd8\u5f00\u7740\u3002\u6240\u4ee5\u5b83\u662f\u552f\u4e00\u6765\u5f97\u53ca\u7684\u5730\u65b9\u3002\u5230\u4e86 AGymCharacter \u7684\u51fd\u6570\u4f53\u91cc\u518d\u8c03\uff0c\u5c31\u4e0d\u53ea\u662f\u300c\u592a\u665a\u4e86\u6ca1\u6548\u679c\u300d\uff0c\u800c\u662f\u76f4\u63a5\u5d29\u6e83\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"toc-18\">\u6574\u4f53\u903b\u8f91\u68b3\u7406<\/h4>\n<!-- \/wp:heading -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">C++\u7ee7\u627f\n   \u2193\n\u7236\u7c7b\u5fc5\u987b\u5148\u6784\u9020\n   \u2193\n\u521d\u59cb\u5316\u5217\u8868\u53ef\u4ee5\u6307\u5b9a\u7236\u7c7b\u600e\u4e48\u6784\u9020\n   \u2193\nACharacter \u6784\u9020\u8fc7\u7a0b\u4e2d\u521b\u5efa Default Subobject\n   \u2193\n\u5176\u4e2d\u6709 CharacterMovementComponent\n   \u2193\n\u6211\u60f3\u8ba9\u5b83\u4f7f\u7528 GymCMC\n   \u2193\n\u4e0d\u80fd\u7b49 ACharacter \u6784\u9020\u5b8c\u518d\u6362\n   \u2193\n\u5fc5\u987b\u63d0\u524d\u51c6\u5907 FObjectInitializer\n   \u2193\nSetDefaultSubobjectClass()\n   \u2193\n\u901a\u8fc7 : Super(...) \u4f20\u7ed9 ACharacter\n   \u2193\nACharacter \u521b\u5efa CMC \u65f6\n\u4f7f\u7528 GymCMC<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u6362\u5b8c\u4e4b\u540e\uff0c\u5728 BP_GymCharacter \u7684\u7ec4\u4ef6\u6811\u91cc\u70b9 CharacterMovement\uff0c\u5c31\u80fd\u770b\u5230\u5b83\u7684\u7c7b\u578b\u5df2\u7ecf\u53d8\u6210\u4e86 GymCharacterMovementComponent\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:image {\"align\":\"center\"} -->\n<figure class=\"wp-block-image aligncenter\"><img decoding=\"async\" src=\"https:\/\/www.xinot.icu\/wp-content\/uploads\/2026\/10\/\u7ed9Character\u6362\u4e00\u4e2a\u81ea\u5df1\u7684CMC_\u56fe2.png\" alt=\"\"\/><\/figure>\n<!-- \/wp:image -->\n\n<!-- wp:spacer {\"height\":\"27px\"} -->\n<div style=\"height:27px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<!-- \/wp:spacer -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"toc-19\">\u610f\u56fe\u4e0e\u8054\u7f51<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:html -->\n<div style=\"width:10%;border-top:2.4px solid #6ec1e4;margin:-13px 0 22px\"><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"toc-20\">\u670d\u52a1\u5668\u7684\u6982\u5ff5<\/h4>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>\u524d\u9762\u300c\u80fd\u4e0d\u80fd\u8054\u7f51\u300d\u90a3\u6761\u63d0\u5230\u4e86\u610f\u56fe bit\uff0c\u8fd9\u91cc\u5c55\u5f00\u4e00\u4e0b\u3002\u76ee\u524d\u53ef\u4ee5\u5148\u628a\u670d\u52a1\u5668\u7406\u89e3\u6210\u4e00\u4e2a\u300c\u88c1\u5224\u300d\u3002<br>\u6bd4\u65b9\u8bf4\uff0c\u73b0\u5728\u6709\u4e24\u4e2a\u4e1c\u897f\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">bWantsToSprint = false\nSprintSpeed = 1000<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>bWantsToSprint \u662f\u4e00\u4e2a\u610f\u56fe bit\u3002\u5f15\u64ce\u91cc\u540c\u7c7b\u7684\u610f\u56fe\uff0c\u6bd4\u5982\u8e72\u4f0f\u7684 bWantsToCrouch\uff0c\u8d70\u7684\u662f CMC \u7684\u90a3\u5957 SavedMove \/ CompressedFlags \u4f53\u7cfb\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>\u5728\u8054\u7f51\u6e38\u620f\u91cc\uff0c\u901a\u5e38\u4f20\u610f\u56fe\u6bd4\u4f20\u7ed3\u679c\u66f4\u5408\u9002\uff0c\u539f\u56e0\u5982\u4e0b\u3002<br>\u539f\u56e0 1\uff1a\u670d\u52a1\u5668\u4e5f\u9700\u8981\u8fdb\u884c\u4e00\u6b21\u8ba1\u7b97\u3002\u5047\u8bbe\u672c\u5730\u5ba2\u6237\u7aef\u76f4\u63a5\u544a\u8bc9\u670d\u52a1\u5668\u300c\u6211\u5f53\u524d\u6b63\u5728\u51b2\u523a\uff0c\u901f\u5ea6 1000\u300d\uff0c\u670d\u52a1\u5668\u6ca1\u6cd5\u9a8c\u8bc1\u8fd9\u662f\u5426\u5408\u6cd5\uff0c\u56e0\u4e3a\u8fd9\u662f\u7ed3\u679c\uff0c\u800c\u670d\u52a1\u5668\u4e0d\u77e5\u9053\u5ba2\u6237\u7aef\u53d1\u751f\u4e86\u4ec0\u4e48\u624d\u5bfc\u81f4\u4e86\u8fd9\u4e2a\u7ed3\u679c\uff1b\u4f46\u5982\u679c\u5ba2\u6237\u7aef\u544a\u8bc9\u670d\u52a1\u5668\u300c\u6211\u6309\u4e86 Shift\uff0c\u60f3\u8981\u51b2\u523a\u300d\uff0c\u670d\u52a1\u5668\u5c31\u53ef\u4ee5\u6839\u636e\u89c4\u5219\u8ba1\u7b97\u5f53\u524d\u80fd\u4e0d\u80fd\u51b2\u523a\uff0c\u53ef\u4ee5\u7684\u8bdd\u786e\u5207\u7684\u51b2\u523a\u901f\u5ea6\u662f\u591a\u5c11\u3002<br>\u539f\u56e0 2\uff1a\u5ba2\u6237\u7aef\u9700\u8981\u8fdb\u884c\u4e00\u6b21\u9884\u6d4b\u3002\u5047\u8bbe\u73b0\u5728\u7f51\u7edc\u5ef6\u8fdf 100ms\uff0c\u6309 Shift \u540e\u8981\u7b49\u670d\u52a1\u5668\u7684\u6a21\u62df\u7ed3\u679c\u8fd4\u56de\u624d\u51b2\u523a\uff0c\u5b9e\u9645\u6e38\u73a9\u4f53\u9a8c\u5c31\u662f\u6309\u4e86 Shift \u540e\u7b49\u4e86 100ms \u5c4f\u5e55\u91cc\u7684\u89d2\u8272\u624d\u52a8\u8d77\u6765\uff0c\u4f1a\u975e\u5e38\u5361\u624b\u3002\u6240\u4ee5 UE \u7684 CMC \u4f1a\u505a\u4e00\u79cd\u9884\u6d4b\uff1a\u300c\u6211\u5148\u731c\u670d\u52a1\u5668\u5927\u6982\u4e5f\u4f1a\u540c\u610f\u6211\u8fd9\u4e48\u505a\u300d\uff0c\u5148\u8ba9\u5ba2\u6237\u7aef\u7684\u89d2\u8272\u7acb\u523b\u51b2\u523a\uff0c\u7136\u540e\u518d\u6839\u636e\u670d\u52a1\u5668\u7684\u6743\u5a01\u6a21\u62df\u7ed3\u679c\u8fdb\u884c\u5bf9\u6bd4\uff0c\u786e\u8ba4\u662f\u5426\u9700\u8981\u56de\u6eda\u6216\u8005\u7ea0\u6b63\uff08\u7f51\u7edc\u540c\u6b65 \/ \u9884\u6d4b\u7ea0\u6b63\uff09\u3002<br>\u539f\u56e0 3\uff1a\u53ef\u4ee5\u88ab\u670d\u52a1\u5668\u91cd\u65b0\u6a21\u62df\u3002\u5e76\u4e14\u7701\u5e26\u5bbd\uff0c\u610f\u56fe\u901a\u5e38\u53ef\u4ee5\u7528\u5c11\u91cf bit \u8868\u793a\uff0c\u9002\u5408\u653e\u5165 SavedMove \u7684\u538b\u7f29\u6807\u5fd7\u4e2d\uff0c\u5728\u7f51\u7edc\u4f20\u8f93\u7684\u65f6\u5019\u5360\u7528\u7684\u8d44\u6e90\u66f4\u5c0f\u3002<br>\u4e32\u8d77\u6765\u5c31\u662f\uff1a\u5ba2\u6237\u7aef Character \u6536\u5230\u8f93\u5165\u540e\uff0c\u5148\u4fee\u6539\u5ba2\u6237\u7aef CMC \u7684\u610f\u56fe\uff1b\u8fd9\u4e2a\u610f\u56fe\u968f\u540e\u4f1a\u88ab\u8bb0\u5f55\u5230 SavedMove \u5e76\u53d1\u9001\u7ed9\u670d\u52a1\u5668\uff0c\u670d\u52a1\u5668\u6536\u5230\u540e\uff0c\u518d\u5728\u670d\u52a1\u5668\u81ea\u5df1\u7684 CMC \u4e2d\u6062\u590d\u8fd9\u4e2a\u610f\u56fe\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>\u901a\u5e38\uff0c\u5ba2\u6237\u7aef\u4f1a\u7acb\u523b\u6267\u884c\u6a21\u62df\uff0c\u7acb\u523b\u51b2\u523a\uff1b\u800c\u670d\u52a1\u5668\u8981\u7ecf\u8fc7\u77ed\u6682\u7684\u7f51\u7edc\u5ef6\u8fdf\u540e\u624d\u80fd\u6536\u5230\u8fd9\u4e2a\u610f\u56fe\uff0c\u7136\u540e\u6839\u636e\u540c\u6837\u7684\u8f93\u5165\u4ee5\u53ca\u6e38\u620f\u72b6\u6001\u91cd\u65b0\u8ba1\u7b97\u4e00\u904d\u3002\u6b64\u65f6\u6211\u4eec\u6709\u4e24\u8f6e\u6a21\u62df\u7ed3\u679c\uff0c\u5ba2\u6237\u7aef\u4e0a\u7684\u662f\u9884\u6d4b\u7ed3\u679c\uff0c\u670d\u52a1\u5668\u4e0a\u7684\u662f\u6743\u5a01\u7ed3\u679c\u3002\u5ba2\u6237\u7aef\u9884\u6d4b\u4e0d\u65ad\u5411\u524d\u6a21\u62df\uff0c\u670d\u52a1\u5668\u6536\u5230\u8f93\u5165\u540e\u8fdb\u884c\u6743\u5a01\u6a21\u62df\uff0c\u5ba2\u6237\u7aef\u518d\u6839\u636e\u670d\u52a1\u5668\u7ed3\u679c\u8fdb\u884c\u6821\u6b63\uff1a\u5982\u679c\u4e24\u4e2a\u7ed3\u679c\u76f8\u540c\uff0c\u8bf4\u660e\u5ba2\u6237\u7aef\u9884\u6d4b\u6ca1\u6709\u95ee\u9898\uff0c\u4e00\u822c\u4e0d\u4f1a\u8fdb\u884c\u989d\u5916\u5904\u7406\uff1b\u82e5\u7ed3\u679c\u4e0d\u540c\uff0c\u5ba2\u6237\u7aef\u5c31\u53ef\u80fd\u4fee\u6b63\u81ea\u5df1\u7684\u72b6\u6001\u3002\u5f88\u591a\u60c5\u51b5\u90fd\u4f1a\u5bfc\u81f4\u4e24\u8fb9\u7ed3\u679c\u4e0d\u4e00\u81f4\uff0c\u6bd4\u5982\u7f51\u7edc\u5ef6\u8fdf\u3001\u5ba2\u6237\u7aef\u9884\u6d4b\u4e0d\u5bf9\u3001\u4e24\u8fb9\u72b6\u6001\u6709\u7ec6\u5fae\u5dee\u5f02\u7b49\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"toc-21\">CMC \u7f51\u7edc\u9884\u6d4b\uff08\u6682\u6401\u7f6e\uff09<\/h4>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>\u8fd9\u4e00\u90e8\u5206\u63a5\u89e6\u5230\u4e86\u610f\u56fe\u6807\u5fd7\u548c\u8054\u7f51\u7684\u4e00\u4e9b\u6982\u5ff5\uff0c\u5982\u679c\u60f3\u8ba9 bWantsToSprint \u8054\u7f51\uff0c\u8fd8\u7f3a\u5c11\u4e00\u4e9b\u4e1c\u897f\u3002\u8fd9\u4e00\u5757\u6d89\u53ca CMC \u7f51\u7edc\u9884\u6d4b\uff0c\u548c\u5f53\u524d\u7684\u5b66\u4e60\u8def\u7ebf\u6709\u504f\u5dee\uff0c\u6682\u65f6\u6401\u7f6e\uff0c\u7559\u4e0b\u4e00\u4e9b\u5173\u952e\u8bcd\uff0c\u540e\u7eed\u9700\u8981\u7684\u65f6\u5019\u518d\u53bb\u6363\u9f13\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>\u5173\u952e\u8bcd\uff1aUE CMC \u7f51\u7edc\u9884\u6d4b\uff08Client Prediction \/ Server Authority \/ SavedMove \/ CompressedFlags\uff09<br>\u6982\u5ff5\uff1aCMC \u8054\u7f51\u65f6\u9700\u8981\u4fdd\u5b58\u6bcf\u4e00\u5e27\u7684\u8f93\u5165\u610f\u56fe\uff0c\u8ba9\u5ba2\u6237\u7aef\u9884\u6d4b\u3001\u670d\u52a1\u5668\u6743\u5a01\u6a21\u62df\u4ee5\u53ca\u5ba2\u6237\u7aef\u7ea0\u6b63 \/ \u91cd\u653e\u80fd\u591f\u4f7f\u7528\u540c\u4e00\u5e27\u7684\u8f93\u5165\u6570\u636e\uff1b\u4ee5\u540e\u5b9e\u73b0\u81ea\u5b9a\u4e49\u79fb\u52a8\u80fd\u529b\u8054\u7f51\u65f6\uff0c\u9700\u8981\u901a\u8fc7 SavedMove \u548c CompressedFlags \u6269\u5c55\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">UE CMC \u7f51\u7edc\u9884\u6d4b\n\u251c\u2500\u2500 Client Prediction\uff08\u5ba2\u6237\u7aef\u9884\u6d4b\uff09\n\u251c\u2500\u2500 Server Authority\uff08\u670d\u52a1\u5668\u6743\u5a01\uff09\n\u251c\u2500\u2500 Server Reconciliation\uff08\u670d\u52a1\u5668\u7ea0\u6b63\uff09\n\u251c\u2500\u2500 Client Replay \/ Move Replay\uff08\u5ba2\u6237\u7aef\u91cd\u653e\uff09\n\u2502\n\u251c\u2500\u2500 SavedMove \/ FSavedMove_Character\n\u2502   \u2514\u2500\u2500 \u4fdd\u5b58\u6bcf\u4e00\u5e27\u7684\u8f93\u5165\u610f\u56fe\n\u2502\n\u251c\u2500\u2500 CompressedFlags\n\u2502   \u2514\u2500\u2500 \u5c06\u8f93\u5165\u610f\u56fe\u538b\u7f29\u8fdb\u79fb\u52a8\u6570\u636e\n\u2502\n\u251c\u2500\u2500 UpdateFromCompressedFlags\n\u2502   \u2514\u2500\u2500 \u670d\u52a1\u5668\u8fd8\u539f\u8f93\u5165\u610f\u56fe\n\u2502\n\u251c\u2500\u2500 FNetworkPredictionData_Client_Character\n\u2502   \u2514\u2500\u2500 \u5ba2\u6237\u7aef\u7f51\u7edc\u9884\u6d4b\u6570\u636e\n\u2502\n\u2514\u2500\u2500 Replication\n    \u2514\u2500\u2500 \u540c\u6b65\u6700\u7ec8\u72b6\u6001 \/ \u7ed3\u679c<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"toc-22\">\u4ece QA \u89c6\u89d2\u770b CMC \u7684\u7f51\u7edc\u6d4b\u8bd5<\/h4>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>\u5b66\u5230\u8fd9\u4e00\u5757\u7684\u65f6\u5019\uff0c\u6211\u627e GPT \u5410\u69fd\u8fc7\u4e00\u6b21\uff1a\u5982\u679c\u8ba9\u6211\u4ece QA \u7684\u89d2\u5ea6\u53bb\u6d4b CMC \u7684\u7f51\u7edc\u9884\u6d4b\uff0c\u4f1a\u6709\u591a\u9ebb\u70e6\uff1f<br>\u4ee5\u524d\u505a\u8054\u673a\u529f\u80fd\u6d4b\u8bd5\uff0c\u5f88\u591a\u65f6\u5019\u5173\u6ce8\u7684\u662f\u300c\u72b6\u6001\u6709\u6ca1\u6709\u540c\u6b65\u300d\u3002\u6bd4\u5982 A \u73a9\u5bb6\u653e\u4e86\u4e2a\u6280\u80fd\uff0cB \u73a9\u5bb6\u6709\u6ca1\u6709\u770b\u5230\uff1bA \u73a9\u5bb6\u8d70\u5230\u67d0\u4e2a\u4f4d\u7f6e\uff0cB \u73a9\u5bb6\u770b\u5230\u7684\u4f4d\u7f6e\u5bf9\u4e0d\u5bf9\uff1b\u65ad\u7ebf\u91cd\u8fde\u4e4b\u540e\u72b6\u6001\u6709\u6ca1\u6709\u6062\u590d\u3002\u8fd9\u7c7b\u6d4b\u8bd5\u4e5f\u4f1a\u9047\u5230\u7f51\u7edc\u95ee\u9898\uff0c\u4f46\u601d\u8def\u76f8\u5bf9\u76f4\u63a5\uff1a\u5ba2\u6237\u7aef\u53d1\u751f\u4e86\u4ec0\u4e48 \u2192 \u670d\u52a1\u5668\u6709\u6ca1\u6709\u6536\u5230 \u2192 \u5176\u4ed6\u5ba2\u6237\u7aef\u6709\u6ca1\u6709\u6b63\u786e\u770b\u5230\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>CMC \u9ebb\u70e6\u5728\u9884\u6d4b\u3002\u5ba2\u6237\u7aef\u5148\u52a8\uff0c\u670d\u52a1\u5668\u62ff\u540c\u6837\u7684\u8f93\u5165\u91cd\u65b0\u6a21\u62df\u4e00\u904d\uff0c\u518d\u548c\u5ba2\u6237\u7aef\u62a5\u4e0a\u6765\u7684\u4f4d\u7f6e\u5bf9\u6bd4\uff1a\u5dee\u5f97\u4e0d\u591a\u5c31\u8ba4\uff0c\u5dee\u592a\u591a\u5c31\u53d1\u7ea0\u6b63\u56de\u53bb\uff0c\u5ba2\u6237\u7aef\u88ab\u62c9\u56de\u6765\u4ee5\u540e\uff0c\u518d\u628a\u8fd8\u6ca1\u88ab\u786e\u8ba4\u7684 Move \u91cd\u653e\u4e00\u904d\u3002<br>\u8fd9\u6837\u4e00\u6765\uff0cQA \u8981\u6d4b\u7684\u4e1c\u897f\u5c31\u5f00\u59cb\u53d8\u590d\u6742\u4e86\u3002\u800c\u4e14\u300c\u5b8c\u5168\u4e00\u81f4\u300d\u672c\u8eab\u5c31\u4e0d\u662f\u6807\u51c6\u3002\u670d\u52a1\u5668\u5141\u8bb8\u5ba2\u6237\u7aef\u548c\u81ea\u5df1\u6709\u4e00\u70b9\u8bef\u5dee\uff0c\u9ed8\u8ba4\u9608\u503c\u662f MAXPOSITIONERRORSQUARED = 3.0\uff08GameNetworkManager.cpp:27\uff09\uff0c\u4e5f\u5c31\u662f\u4f4d\u7f6e\u5dee\u5728\u5927\u7ea6 1.7 \u5398\u7c73\u4ee5\u5185\uff0c\u670d\u52a1\u5668\u90fd\u4e0d\u7ea0\u6b63\u3002\u6240\u4ee5 QA \u6ca1\u6cd5\u7b80\u5355\u5730\u8bf4\u300c\u6709\u4e00\u70b9\u4f4d\u7f6e\u5dee\u5c31\u662f Bug\u300d\u3002<br>\u6d4b\u8bd5\u7ef4\u5ea6\u4e5f\u8ddf\u7740\u53d8\u591a\uff1a\u5ef6\u8fdf\u3001\u4e22\u5305\u3001\u7f51\u7edc\u6296\u52a8\u3001\u5ba2\u6237\u7aef\u4f4e\u5e27\u7387\uff0c\u518d\u53e0\u4e0a\u9ad8\u901f\u79fb\u52a8\u3002\u5f15\u64ce\u5728\u975e Shipping \u5305\u91cc\u63d0\u4f9b\u4e86 NetEmulation.PktLag\u3001NetEmulation.PktLoss \u8fd9\u7c7b\u547d\u4ee4\u6765\u6784\u9020\u7f51\u7edc\u6761\u4ef6\uff0cp.NetShowCorrections 1 \u53ef\u4ee5\u628a\u53d1\u751f\u7ea0\u6b63\u7684\u4f4d\u7f6e\u753b\u51fa\u6765\u3002\u4e0d\u8fc7\u8fd9\u4e9b\u6211\u53ea\u662f\u5728\u6e90\u7801\u91cc\u627e\u5230\u4e86\uff0c\u8fd8\u6ca1\u771f\u6b63\u8dd1\u8fc7\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>\u5bf9\u9ad8\u901f\u79fb\u52a8\u7684\u6e38\u620f\uff0c\u6216\u8005\u5ef6\u8fdf\u6781\u5176\u654f\u611f\u7684 FPS \u6e38\u620f\u6765\u8bf4\uff0c\u8fd9\u4e2a\u95ee\u9898\u4f1a\u66f4\u660e\u663e\u3002\u666e\u901a\u8d70\u8def\u7684\u65f6\u5019\uff0c\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u5668\u5dee\u4e86\u4e00\u70b9\u4f4d\u7f6e\uff0c\u73a9\u5bb6\u53ef\u80fd\u90fd\u6ce8\u610f\u4e0d\u5230\uff1b\u4f46\u5982\u679c\u89d2\u8272\u6b63\u5728\u9ad8\u901f\u6ed1\u94f2\u3001\u8df3\u8dc3\u3001\u6ed1\u5899\uff0c\u751a\u81f3\u6b63\u5728\u505a\u4e00\u4e2a\u9700\u8981\u7cbe\u786e\u78b0\u649e\u68c0\u6d4b\u7684\u6500\u8d8a\u52a8\u4f5c\uff0c\u8fd9\u4e00\u70b9\u504f\u5dee\u5c31\u53ef\u80fd\u88ab\u653e\u5927\u6210\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<div class=\"prismjs-tomorrow copy-to-clipboard\" style=\"margin-bottom:20px\"><pre class=\"highlight-height language-cpp line-numbers\"><code readonly=\"true\" class=\"language-cpp\">\u5ba2\u6237\u7aef\uff1a\u6211\u649e\u5230\u5899\u4e86\uff0c\u5e94\u8be5\u5f00\u59cb\u6ed1\u5899\u3002\n\u670d\u52a1\u5668\uff1a\u4f60\u6ca1\u649e\u5230\u3002\n\u5ba2\u6237\u7aef\uff1a\uff1f\uff1f\uff1f\n\u670d\u52a1\u5668\uff1a\u7ed9\u4f60\u4fee\u56de\u6765\u3002<\/code><\/pre><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u73a9\u5bb6\u770b\u5230\u7684\uff0c\u53ef\u80fd\u5c31\u662f\u89d2\u8272\u7a81\u7136\u88ab\u62c9\u56de\u53bb\u3001\u52a8\u4f5c\u88ab\u6253\u65ad\uff0c\u6216\u8005\u660e\u663e\u5361\u4e86\u4e00\u4e0b\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>\u800c\u4e14\uff0c\u5f88\u591a\u7f51\u7edc\u95ee\u9898\u4e0d\u662f\u7a33\u5b9a\u590d\u73b0\u7684\u3002\u300c100ms \u5ef6\u8fdf\u4e0b\u4e00\u5b9a\u51fa\u95ee\u9898\u300d\u5176\u5b9e\u8fd8\u597d\u6d4b\uff0c\u771f\u6b63\u9ebb\u70e6\u7684\u662f\u300c80\uff5e120ms \u5ef6\u8fdf + \u5076\u53d1\u4e22\u5305 + \u5e27\u7387\u6ce2\u52a8 + \u73a9\u5bb6\u9ad8\u901f\u79fb\u52a8\u300d\uff0c\u7136\u540e\u5076\u5c14\u51fa\u73b0\u4e00\u6b21\u5947\u602a\u7684\u77ac\u79fb\u6216\u8005\u56de\u5f39\u3002<br>\u6211\u76ee\u524d\u8eab\u5904\u7684\u8fd9\u4e2a\u9879\u76ee\u7ec4\u867d\u7136\u4e5f\u6709\u8054\u673a\uff0c\u4f46\u662f\u901a\u5e38\u53ea\u6d4b\u8bd5\u53cc\u65b9\u72b6\u6001\u6709\u6ca1\u6709\u540c\u6b65\u5c31\u53ef\u4ee5\u4e86\uff0c\u8fd9\u79cd\u60c5\u51b5\uff0c\u53ea\u80fd\u63d0\u4e00\u4e2aP3 BUG\uff0823333\uff09\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>\u50cf\u662f\u8fd9\u79cd\u95ee\u9898\uff0c\u9760\u300c\u8f93\u5165 \u2192 \u9884\u671f\u8f93\u51fa\u300d\u90a3\u79cd\u9010\u6761\u6267\u884c\u7528\u4f8b\u7684\u70b9\u529f\u80fd\u6d4b\u6cd5\u5c31\u5f88\u96be\u53d1\u73b0\u95ee\u9898\u4e86\uff0c\u601d\u8def\u4f1a\u53d8\u6210\u300c\u6784\u9020\u4e00\u7ec4\u7f51\u7edc\u6761\u4ef6 \u2192 \u786e\u8ba4\u6e38\u620f\u8868\u73b0\u662f\u4e0d\u662f\u8fd8\u6ee1\u8db3\u4e00\u7ec4\u6807\u51c6\u300d\uff1a\u9884\u6d4b\u5408\u7406\u3001\u7ea0\u6b63\u5408\u7406\u3001\u6ca1\u6709\u660e\u663e\u7684\u7a7f\u6a21 \/ \u77ac\u79fb \/ \u72b6\u6001\u9519\u4e71\u3002<br>\u62ff\u6211\u81ea\u5df1\u7684\u51b2\u523a\u4e3e\u4e2a\u4f8b\u5b50\u3002bWantsToSprint \u6ca1\u63a5\u8fdb SavedMove\uff0c\u670d\u52a1\u5668\u6839\u672c\u4e0d\u77e5\u9053\u6211\u6309\u4e86 Shift\uff0c\u6309\u6e90\u7801\u63a8\uff0c\u8054\u673a\u65f6\u5ba2\u6237\u7aef\u8dd1 1000\u3001\u670d\u52a1\u5668\u53ea\u8ba4 600\uff0c\u4f4d\u7f6e\u5dee\u8d85\u8fc7\u9608\u503c\u5c31\u4f1a\u88ab\u62c9\u56de\u53bb\uff08\u6ca1\u5b9e\u9645\u8054\u673a\u8dd1\u8fc7\uff09\u3002\u4ee5\u524d\u4f5c\u4e3a QA\uff0c\u6211\u5927\u6982\u53ea\u4f1a\u8bb0\u4e00\u6761\u300c\u8054\u673a\u6309\u4f4f\u51b2\u523a\uff0c\u89d2\u8272\u4e00\u5361\u4e00\u5361\u5730\u88ab\u62c9\u56de\u53bb\u300d\uff1b\u73b0\u5728\u5c31\u53ef\u4ee5\u63a5\u7740\u5f80\u4e0b\u95ee\uff1a\u662f\u8f93\u5165\u6ca1\u8fdb SavedMove\uff0c\u8fd8\u662f\u4e24\u8fb9 MovementMode \u4e0d\u4e00\u81f4\uff0c\u8fd8\u662f\u78b0\u649e\u7ed3\u679c\u4e0d\u540c\uff1f<br>\u8fd9\u548c\u5355\u7eaf\u77e5\u9053\u300c\u8fd9\u91cc\u6709\u4e2a\u7f51\u7edc Bug\u300d\uff0c\u5df2\u7ecf\u662f\u4e0d\u592a\u4e00\u6837\u7684\u89c6\u89d2\u4e86\u3002\u5f53\u7136\u8fd9\u4e00\u5757\u6211\u4e5f\u53ea\u662f\u7a0d\u5fae\u5f00\u59cb\u6709\u4e86\u4e00\u70b9\u81ea\u5df1\u7684\u601d\u8003\uff0c\u51e0\u4e4e\u6ca1\u6709\u5b9e\u8df5\u3002<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:spacer {\"height\":\"27px\"} -->\n<div style=\"height:27px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n<!-- \/wp:spacer -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"toc-23\">\u4e00\u4e9b\u5c0f\u7591\u8651<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:html -->\n<div style=\"width:10%;border-top:2.4px solid #6ec1e4;margin:-13px 0 22px\"><\/div>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>\u5199 Character \u90a3\u4f1a\u513f\u7559\u4e0b\u7684\u51e0\u4e2a\u95ee\u9898\uff0c\u5230\u73b0\u5728\u8fd8\u6ca1\u5b8c\u5168\u60f3\u660e\u767d\uff1a<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>BP_ThirdPersonPlayerController \u7684\u4f5c\u7528\u3002\u73b0\u5728\u77e5\u9053 IMC \u662f\u5728\u5b83\u8eab\u4e0a\u6ce8\u518c\u7684\uff0c\u4f46\u5b83\u522b\u7684\u8fd8\u505a\u4e86\u4ec0\u4e48\uff0c\u6211\u6ca1\u7ec6\u770b\u3002<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>\u90e8\u5206\u5b9e\u73b0\u7ec6\u8282\u3002<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>\u4e3a\u4f55\u4e00\u5b9a\u8981\u7528\u84dd\u56fe\u5b50\u7c7b\u914d\u7f6e\u8d44\u4ea7\uff1f\u867d\u7136\u6211\u77e5\u9053\u5728\u84dd\u56fe\u91cc\u914d\u7f6e\u4f1a\u65b9\u4fbf\u4e00\u70b9\uff0c\u7528\u6765\u88c5 C++ \u91cc\u8d4b\u4e0d\u4e86\u503c\u7684\u8d44\u4ea7\u5f15\u7528\u3002<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>\u8fd8\u6709\u5c31\u662f\u4e0a\u9762\u6682\u6401\u7f6e\u7684\u7f51\u7edc\u9884\u6d4b\uff1abWantsToSprint \u8981\u771f\u6b63\u8054\u7f51\uff0c\u5f97\u63a5\u8fdb SavedMove \u548c CompressedFlags\uff0c\u8fd9\u4e00\u5957\u6211\u8fd8\u6ca1\u52a8\u624b\u5199\u8fc7\u3002<\/li>\n<!-- \/wp:list-item --><\/ul>\n<!-- \/wp:list -->\n\n<!-- wp:html -->\n<link rel=\"stylesheet\" href=\"https:\/\/www.xinot.icu\/wp-content\/plugins\/elementor-pro\/assets\/css\/modules\/code-highlight.min.css?ver=1.23.0\">\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/prism\/1.23.0\/components\/prism-core.min.js\"><\/script>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/prism\/1.23.0\/plugins\/autoloader\/prism-autoloader.min.js\"><\/script>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/prism\/1.23.0\/plugins\/normalize-whitespace\/prism-normalize-whitespace.min.js\"><\/script>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/prism\/1.23.0\/plugins\/line-numbers\/prism-line-numbers.min.js\"><\/script>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/prism\/1.23.0\/plugins\/toolbar\/prism-toolbar.min.js\"><\/script>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/prism\/1.23.0\/plugins\/copy-to-clipboard\/prism-copy-to-clipboard.min.js\"><\/script>\n<!-- \/wp:html -->\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u8fd9\u662f\u6458\u8981<\/p>\n","protected":false},"author":1,"featured_media":2540,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[],"class_list":["post-2667","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-24"],"_links":{"self":[{"href":"https:\/\/www.xinot.icu\/index.php?rest_route=\/wp\/v2\/posts\/2667","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xinot.icu\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xinot.icu\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xinot.icu\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xinot.icu\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2667"}],"version-history":[{"count":4,"href":"https:\/\/www.xinot.icu\/index.php?rest_route=\/wp\/v2\/posts\/2667\/revisions"}],"predecessor-version":[{"id":2671,"href":"https:\/\/www.xinot.icu\/index.php?rest_route=\/wp\/v2\/posts\/2667\/revisions\/2671"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.xinot.icu\/index.php?rest_route=\/wp\/v2\/media\/2540"}],"wp:attachment":[{"href":"https:\/\/www.xinot.icu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xinot.icu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2667"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xinot.icu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}