{"id":2330,"date":"2020-12-12T14:35:50","date_gmt":"2020-12-12T06:35:50","guid":{"rendered":"https:\/\/www.clonefactor.com\/wordpress\/?p=2330"},"modified":"2020-12-12T14:43:13","modified_gmt":"2020-12-12T06:43:13","slug":"animator-%e5%8b%95%e7%95%ab%e4%be%9d%e8%85%b3%e6%ad%a5%e7%8b%80%e6%85%8b%e5%88%87%e6%8f%9b","status":"publish","type":"post","link":"https:\/\/www.clonefactor.com\/wordpress\/program\/unity3d\/2330\/","title":{"rendered":"Animator \u52d5\u756b\u4f9d\u8173\u6b65\u72c0\u614b\u5207\u63db"},"content":{"rendered":"\n<p>\u5728\u5236\u4f5c Animator \u72c0\u614b\u6a5f\u6642\u5019, \u7d93\u5e38\u9700\u8981\u5230\u5224\u65b7\u73fe\u5728\u4eba\u578b\u7684\u5de6\u53f3\u8173\u7684\u4f4d\u7f6e.<br>\u70ba\u751a\u9ebc\u8981\u7b97\u51fa\u7576\u4e0b\u7684\u817f\u90e8\u60c5\u6cc1?<br>\u90a3\u662f\u56e0\u70ba Animation Blending \u7684\u8655\u7406.<br>\u4ee5\u4e0b\u5716\u4f5c\u793a\u610f, \u5de6\u5716\u662f\u6b63\u5728\u8dd1\u7684\u60c5\u6cc1, \u53f3\u5716\u662f\u6211\u5011\u6709\u7684\u8d77\u8df3\u52d5\u756b.<br>\u7559\u610f\u5de6\u53f3\u817f\u662f\u525b\u597d\u76f8\u53cd\u7684, \u90a3\u9ebc\u5728 Animator \u9700\u8981\u5207\u63db\u52d5\u756b (Blending) \u7684\u6642\u5019\u5c31\u6703\u6709\u4e00\u6bb5\u5f88\u5feb\u7684\u817f\u8173\u4ea4\u63db\u7684\u52d5\u4f5c.<br>\u5728\u5927\u5f62\u904a\u6232\u88fd\u4f5c\u4e2d\u662f\u5c6c\u65bc glitch \u7684\u5b58\u5728.<\/p>\n\n\n\n<p>\u7531\u65bc Untiy3D \u6c92\u6709\u5e6b\u5fd9\u7b97 foot phase \u4e5f\u6c92\u6709\u4efb\u4f55 AI \u8f14\u52a9, \u6240\u4ee5\u8f49\u6642\u53ea\u80fd\u81ea\u5df1\u628a\u52d5\u756b\u90fd\u5206\u6210 \u5de6\u53f3\u5169\u7a2e\u7684\u60c5\u6cc1\u7136\u5f8c\u518d\u63a5\u99c1\u597d<br>(\u8f9b\u82e6\u7684\u5de5\u4f5c&#8230;&#8230;)<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"956\" height=\"402\" src=\"https:\/\/www.clonefactor.com\/wordpress\/wp-content\/uploads\/2020\/12\/Pasted.png\" alt=\"\" class=\"wp-image-2331\" srcset=\"https:\/\/www.clonefactor.com\/wordpress\/wp-content\/uploads\/2020\/12\/Pasted.png 956w, https:\/\/www.clonefactor.com\/wordpress\/wp-content\/uploads\/2020\/12\/Pasted-300x126.png 300w, https:\/\/www.clonefactor.com\/wordpress\/wp-content\/uploads\/2020\/12\/Pasted-768x323.png 768w, https:\/\/www.clonefactor.com\/wordpress\/wp-content\/uploads\/2020\/12\/Pasted-359x151.png 359w\" sizes=\"auto, (max-width: 956px) 100vw, 956px\" \/><\/figure>\n\n\n\n<p>\u4ee5\u5f80\u7528 Unity3D \u6700\u521d\u5beb\u597d\u7684 LegCycle (\u4f9d\u5f71\u7247\u6642\u9593\u4f30\u7b97)\u52c9\u5f37\u5145\u7576\u4e00\u500b\u6307\u6a19, \u53ef\u662f\u7d93\u5e38\u51fa\u5dee\u932f.<br>\u6240\u4ee5\u6c7a\u5b9a\u81ea\u5df1\u7528\u4e09\u7dad\u4f86\u7b97\u4e00\u500b.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class LegCycleSMB : StateMachineBehaviour\n{\n\t[Header(\"Animator\")]\n\t[SerializeField] string LegCycle = \"LegCycle\";\n\t[Tooltip(\"Damping time for switching leg\")]\n\t[Range(0f, 1f)] public float m_LegCycleDampTime = .3f;\n\n\tprivate Transform m_LeftFoot = null;\n\tprivate Transform m_RightFoot = null;\n\tprivate Transform m_Root = null;\n\n\tpublic override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller)\n\t=> FetchBone(animator);\n\tpublic override void OnStateMachineEnter(Animator animator, int stateMachinePathHash, AnimatorControllerPlayable controller)\n\t=> FetchBone(animator);\n\tprivate void FetchBone(Animator animator)\n\t{\n\t\tif (ReferenceEquals(null, m_Root))\n\t\t{\n\t\t\tm_Root = animator.transform;\n\t\t\tm_LeftFoot = animator.GetBoneTransform(HumanBodyBones.LeftFoot);\n\t\t\tm_RightFoot = animator.GetBoneTransform(HumanBodyBones.RightFoot);\n\t\t}\n\t}\n\n\tpublic override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)\n\t{\n\t\t\/\/ \u4ee5 m_Root \u53d6\u5f97\u5de6\u53f3\u8173\u5728 Local space \u7684\u4e09\u7dad\u5750\u6a19.\n\t\tVector3 left = m_Root.InverseTransformPoint(m_LeftFoot.position);\n\t\tVector3 right = m_Root.InverseTransformPoint(m_RightFoot.position);\n\t\t\/\/ \u7531\u5de6 -> \u53f3\u8db3\u69cb\u6210 vector\n\t\tVector3 vector = right - left;\n\t\tvector.y = 0f;\n\t\t\/\/ \u7528\u4eba\u7269\u7684\u6b63\u524d\u65b9\u53ca\u8a72 vector \u7b97\u51fa vector dot, \u4f86\u5224\u65b7\u524d\u5f8c\u8db3.\n\t\tfloat dot = Vector3.Dot(vector.normalized, Vector3.forward);\n\n\t\t\/\/ Because usually within -0.7~0.7 range.\n\t\tfloat bias = Mathf.Clamp(dot * 2f, -1f, 1f);\n\n\t\t\/\/ \u5de6\u8db3\u5728\u524d\u4ee5 -1 \u8868\u793a,\n\t\t\/\/ \u53f3\u8db3\u5728\u524d\u4ee5 1 \u8868\u793a.\n\t\tanimator.SetFloat(LegCycle, bias, m_LegCycleDampTime, Time.deltaTime);\n\t}\n}<\/pre>\n\n\n\n<p>\u91cd\u9ede\u5728\u65bc OnStateUpdate() \u88e1\u9762.<br>\u76f4\u63a5\u4ee5 m_Root \u53d6\u5f97\u5de6\u53f3\u8173\u5728 Local space \u7684\u4e09\u7dad\u5750\u6a19. \u7b97\u51fa\u5411\u91cf\u4e26\u6295\u5f71\u5230\u5730\u9762 (\u53d6\u6d88 Y \u8ef8),<br>\u4e26\u4ee5\u4e4b\u8207\u6b63\u524d\u65b9\u7528 Vector dot \u9032\u884c\u6bd4\u8f03\u4f86\u53d6\u503c.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/docs.unity3d.com\/2019.3\/Documentation\/uploads\/Main\/CosineValues.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>\u53c3\u8003 : <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.unity3d.com\/2019.3\/Documentation\/Manual\/UnderstandingVectorArithmetic.html\" target=\"_blank\">https:\/\/docs.unity3d.com\/2019.3\/Documentation\/Manual\/UnderstandingVectorArithmetic.html<\/a><br>\u7531\u6b64\u53ef\u4ee5\u5f97\u77e5\u5de6\u53f3\u8db3, \u90a3\u4e00\u53ea\u5728\u4eba\u7269\u8eab\u524d\u65b9.<\/p>\n\n\n\n<p>\u9019\u908a\u6211\u5011\u52a0\u4e86\u4e00\u9ede Bias, \u56e0\u70ba\u8173\u5728\u8dd1\u52d5\u6642\u5927\u90e8\u4efd\u6642\u9593\u53ea\u662f\u5728 -45~45 \u5ea6\u7684\u7bc4\u570d\u6d3b\u52d5 (\u5c0d\u61c9\u8eab\u9ad4\u4e2d\u5fc3\u9ede).<br>\u6240\u4ee5\u7528\u4e00\u5957\u7c21\u55ae\u7684\u6578\u5b78\u52a0\u6e1b\u4e00\u4e0b\u53d6\u5f97 -1~1 \u7684\u503c\u65b9\u4fbf\u904b\u7b97.<br>\u4e4b\u5f8c\u5c31\u56de\u5230 Animator \u70ba\u4e0d\u540c\u7684 state \u8a2d\u5b9a\u597d\u5de6\u53f3\u8173\u7684 Blending \u7684\u60c5\u6cc1.<\/p>\n\n\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"906\" height=\"1014\" src=\"https:\/\/www.clonefactor.com\/wordpress\/wp-content\/uploads\/2020\/12\/Pasted-1.png\" alt=\"AnimatorBlendLR\" class=\"wp-image-2335\" srcset=\"https:\/\/www.clonefactor.com\/wordpress\/wp-content\/uploads\/2020\/12\/Pasted-1.png 906w, https:\/\/www.clonefactor.com\/wordpress\/wp-content\/uploads\/2020\/12\/Pasted-1-268x300.png 268w, https:\/\/www.clonefactor.com\/wordpress\/wp-content\/uploads\/2020\/12\/Pasted-1-768x860.png 768w\" sizes=\"auto, (max-width: 906px) 100vw, 906px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>\u5728\u5236\u4f5c Animator \u72c0\u614b\u6a5f\u6642\u5019, \u7d93\u5e38\u9700\u8981\u5230\u5224\u65b7\u73fe\u5728\u4eba\u578b\u7684\u5de6\u53f3\u8173\u7684\u4f4d\u7f6e.\u70ba\u751a\u9ebc\u8981\u7b97\u51fa\u7576\u4e0b\u7684\u817f\u90e8 &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[105,11],"tags":[116,117],"class_list":["post-2330","post","type-post","status-publish","format-standard","hentry","category-animator-","category-unity3d","tag-animator","tag-smb"],"_links":{"self":[{"href":"https:\/\/www.clonefactor.com\/wordpress\/wp-json\/wp\/v2\/posts\/2330","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.clonefactor.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.clonefactor.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.clonefactor.com\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.clonefactor.com\/wordpress\/wp-json\/wp\/v2\/comments?post=2330"}],"version-history":[{"count":3,"href":"https:\/\/www.clonefactor.com\/wordpress\/wp-json\/wp\/v2\/posts\/2330\/revisions"}],"predecessor-version":[{"id":2337,"href":"https:\/\/www.clonefactor.com\/wordpress\/wp-json\/wp\/v2\/posts\/2330\/revisions\/2337"}],"wp:attachment":[{"href":"https:\/\/www.clonefactor.com\/wordpress\/wp-json\/wp\/v2\/media?parent=2330"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.clonefactor.com\/wordpress\/wp-json\/wp\/v2\/categories?post=2330"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.clonefactor.com\/wordpress\/wp-json\/wp\/v2\/tags?post=2330"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}