{"id":1235,"date":"2017-08-26T17:44:13","date_gmt":"2017-08-26T09:44:13","guid":{"rendered":"http:\/\/39.100.100.179\/?p=1235"},"modified":"2017-08-27T22:04:39","modified_gmt":"2017-08-27T14:04:39","slug":"%e5%88%b6%e4%bd%9c%e5%a4%a7%e5%9e%8bmmo%e9%a1%b9%e7%9b%ae%e4%b8%ad%e7%9a%84%e7%9b%b8%e6%9c%ba%e6%93%8d%e4%bd%9c","status":"publish","type":"post","link":"http:\/\/www.u3d8.com\/?p=1235","title":{"rendered":"\u5236\u4f5c\u5927\u578bMMO\u9879\u76ee\u4e2d\u7684\u76f8\u673a\u89c6\u89d2\u64cd\u4f5c"},"content":{"rendered":"<p>\u4eca\u5929\u95f2\u4e0b\u6765\u7ed9\u5927\u5bb6\u5b9e\u73b0\u4e2a\u5927\u578bMMORPG\u9879\u76ee\u4e2d\u90fd\u4f1a\u7528\u5230\u7684\u529f\u80fd<\/p>\n<p>1.\u76f8\u673a\u8ddf\u968f\u73a9\u5bb6<\/p>\n<p>2.\u5de6\u53f3\u6ed1\u52a8\u5c4f\u5e55 \u65cb\u8f6c\u76f8\u673a<\/p>\n<p>3.\u4e0a\u4e0b\u6ed1\u52a8\u5c4f\u5e55\u6216\u4f7f\u7528\u9f20\u6807\u6eda\u8f6e \u7f29\u653e\u76f8\u673a\u53ca\u8c03\u6574\u76f8\u673a\u89c6\u91ce<\/p>\n<p>\u4e0a\u6548\u679c\u56fe\uff1a<\/p>\n<p><a href=\"http:\/\/www.u3d8.com\/wp-content\/uploads\/2017\/08\/CameraOperate3.gif\" data-lightbox=\"image_lg\"><img title=\"\u5236\u4f5c\u5927\u578bMMO\u9879\u76ee\u4e2d\u7684\u76f8\u673a\u89c6\u89d2\u64cd\u4f5c - \u7b2c1\u5f20  | u3d8\u6280\u672f\u5206\u4eab\" alt=\"\u5236\u4f5c\u5927\u578bMMO\u9879\u76ee\u4e2d\u7684\u76f8\u673a\u89c6\u89d2\u64cd\u4f5c - \u7b2c1\u5f20  | u3d8\u6280\u672f\u5206\u4eab\"  loading=\"lazy\" class=\"aligncenter size-full wp-image-1236\"  data-src=\"http:\/\/www.u3d8.com\/wp-content\/uploads\/2017\/08\/CameraOperate3.gif\" width=\"958\" height=\"532\" \/><\/a><\/p>\n<p>\u89d2\u8272\u79fb\u52a8\u811a\u672c\uff1a<\/p>\n<pre class=\"lang:c# decode:true \">using UnityEngine;\r\nusing System.Collections;\r\n\r\npublic class MoveController : MonoBehaviour {\r\n\r\n    Transform camera;\r\n\r\n    Animator ani;\r\n\r\n    NavMeshAgent nav;\r\n\r\n    float h, v;\r\n\r\n    Vector3 moveVec;\r\n\r\n    \/\/ Use this for initialization\r\n    void Start () {\r\n\r\n        camera = Camera.main.transform;\r\n        ani = GetComponent&lt;Animator&gt;();\r\n        nav = GetComponent&lt;NavMeshAgent&gt;();\r\n\r\n    }\r\n\t\r\n\t\/\/ Update is called once per frame\r\n\tvoid Update () {\r\n\r\n        h = Input.GetAxis(\"Horizontal\");\r\n        v = Input.GetAxis(\"Vertical\");\r\n        moveVec = new Vector3(h, 0, v);\r\n\r\n        if (h != 0 || v != 0)\r\n        {\r\n            ani.SetBool(\"Run\", true);\r\n            \/\/ \u6839\u636e\u6444\u50cf\u673a\u65b9\u5411 \u8fdb\u884c\u79fb\u52a8\r\n            moveVec = Quaternion.Euler(0, camera.eulerAngles.y, 0) * moveVec;\r\n            nav.Move(moveVec * Time.deltaTime * 5);\r\n            RotatePlayer();\r\n        }\r\n        else\r\n        {\r\n            ani.SetBool(\"Run\", false);\r\n        }\r\n\t}\r\n\r\n    private void RotatePlayer()\r\n    {\r\n        Vector3 vec = Quaternion.Euler(0, 0, 0) * moveVec;\r\n        Quaternion qua = Quaternion.LookRotation(vec);\r\n        transform.rotation = Quaternion.Lerp(transform.rotation, qua, Time.deltaTime * 100);\r\n    }\r\n}<\/pre>\n<p>\u76f8\u673a\u63a7\u5236\u811a\u672c\uff1a<\/p>\n<pre class=\"lang:c# decode:true \">using UnityEngine;\r\n\r\npublic class ThirdCamera : MonoBehaviour\r\n{\r\n    public Transform target = null;     \/\/ \u76ee\u6807\u73a9\u5bb6\r\n    [SerializeField]\r\n    [Range(0, 360)]\r\n    float horizontalAngle = 270f;      \/\/ \u6c34\u5e73\u89d2\u5ea6\r\n    [SerializeField]\r\n    [Range(0, 20)]\r\n    float initialHeight = 2f;    \/\/ \u4eba\u7269\u5728\u89c6\u91ce\u5185\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u8bbe\u7f6e\r\n\r\n    [SerializeField]\r\n    [Range(10, 90)]\r\n    float initialAngle = 40f;   \/\/ \u521d\u59cb\u4fef\u89c6\u89d2\u5ea6\r\n    [SerializeField]\r\n    [Range(10, 90)]\r\n    float maxAngle = 50f;     \/\/ \u6700\u9ad8\u4fef\u89c6\u89d2\u5ea6\r\n    [SerializeField]\r\n    [Range(10, 90)]\r\n    float minAngle = 35f;     \/\/ \u6700\u4f4e\u4fef\u89c6\u89d2\u5ea6\r\n\r\n    float initialDistance;    \/\/ \u521d\u59cb\u5316\u76f8\u673a\u4e0e\u73a9\u5bb6\u7684\u8ddd\u79bb \u6839\u636e\u89d2\u5ea6\u8ba1\u7b97\r\n    [SerializeField]\r\n    [Range(1, 100)]\r\n    float maxDistance = 20f;        \/\/ \u76f8\u673a\u8ddd\u79bb\u73a9\u5bb6\u6700\u5927\u8ddd\u79bb\r\n    [SerializeField]\r\n    [Range(1, 100)]\r\n    float minDistance = 5f;        \/\/ \u76f8\u673a\u8ddd\u79bb\u73a9\u5bb6\u6700\u5c0f\u8ddd\u79bb\r\n\r\n    [SerializeField]\r\n    [Range(1, 100)]\r\n    float zoomSpeed = 50;       \/\/ \u7f29\u653e\u901f\u5ea6\r\n\r\n    [SerializeField]\r\n    [Range(1f, 200)]\r\n    float swipeSpeed = 50;      \/\/ \u5de6\u53f3\u6ed1\u52a8\u901f\u5ea6\r\n\r\n    float scrollWheel;        \/\/ \u8bb0\u5f55\u6eda\u8f6e\u6570\u503c\r\n    float tempAngle;          \/\/ \u4e34\u65f6\u5b58\u50a8\u6444\u50cf\u673a\u7684\u521d\u59cb\u89d2\u5ea6\r\n    Vector3 tempVector = new Vector3();\r\n\r\n    void Start()\r\n    {\r\n        InitCamera();\r\n    }\r\n\r\n    void Update()\r\n    {\r\n        ZoomCamera();\r\n        SwipeScreen();\r\n    }    \r\n\r\n    void LateUpdate()\r\n    {\r\n        FollowPlayer();\r\n        RotateCamera();\r\n    }\r\n\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ \u521d\u59cb\u5316 \u76f8\u673a\u4e0e\u73a9\u5bb6\u8ddd\u79bb\r\n    \/\/\/ &lt;\/summary&gt;\r\n    void InitCamera()\r\n    {\r\n        tempAngle = initialAngle;\r\n\r\n        initialDistance = Mathf.Sqrt((initialAngle - minAngle) \/ Calculate()) + minDistance;\r\n\r\n        initialDistance = Mathf.Clamp(initialDistance, minDistance, maxDistance);\r\n\r\n    }\r\n\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ \u76f8\u673a\u8ddf\u968f\u73a9\u5bb6\r\n    \/\/\/ &lt;\/summary&gt;\r\n    void FollowPlayer()\r\n    {\r\n        float upRidus = Mathf.Deg2Rad * initialAngle;\r\n        float flatRidus = Mathf.Deg2Rad * horizontalAngle;\r\n\r\n        float x = initialDistance * Mathf.Cos(upRidus) * Mathf.Cos(flatRidus);\r\n        float z = initialDistance * Mathf.Cos(upRidus) * Mathf.Sin(flatRidus);\r\n        float y = initialDistance * Mathf.Sin(upRidus);\r\n\r\n        transform.position = Vector3.zero;\r\n        tempVector.Set(x, y, z);\r\n        tempVector = tempVector + target.position;\r\n        transform.position = tempVector;\r\n        tempVector.Set(target.position.x, target.position.y + initialHeight, target.position.z);\r\n\r\n        transform.LookAt(tempVector);\r\n    }\r\n\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ \u7f29\u653e\u76f8\u673a\u4e0e\u73a9\u5bb6\u8ddd\u79bb\r\n    \/\/\/ &lt;\/summary&gt;\r\n    void ZoomCamera()\r\n    {\r\n        scrollWheel = GetZoomValue();\r\n        if (scrollWheel != 0)\r\n        {\r\n            tempAngle = initialAngle - scrollWheel * 2 * (maxAngle - minAngle);\r\n            tempAngle = Mathf.Clamp(tempAngle, minAngle, maxAngle);\r\n        }\r\n\r\n        if (tempAngle != initialAngle)\r\n        {\r\n            initialAngle = Mathf.Lerp(initialAngle, tempAngle, Time.deltaTime * 10);\r\n\r\n            initialDistance = Mathf.Sqrt((initialAngle - minAngle) \/ Calculate()) + minDistance;\r\n\r\n            initialDistance = Mathf.Clamp(initialDistance, minDistance, maxDistance);\r\n        }\r\n    }\r\n\r\n    float Calculate()\r\n    {\r\n        float dis = maxDistance - minDistance;\r\n        float ang = maxAngle - minAngle;\r\n        float line = ang \/ (dis * dis);\r\n        return line;\r\n    }\r\n\r\n    bool isMousePress = false;\r\n    Vector2 oldMousePos;\r\n    Vector2 newMousePos;\r\n    Vector2 mousePosOffset;\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ \u6ed1\u52a8\u5c4f\u5e55 \u65cb\u8f6c\u76f8\u673a\u548c\u7f29\u653e\u89c6\u91ce\r\n    \/\/\/ &lt;\/summary&gt;\r\n    public void SwipeScreen()\r\n    {\r\n        if (Input.GetMouseButtonDown(0))\r\n        {\r\n            oldMousePos = Vector2.zero;\r\n            isMousePress = true;\r\n        }\r\n        else if(Input.GetMouseButtonUp(0))\r\n        {\r\n            mousePosOffset = Vector2.zero;\r\n            isMousePress = false;\r\n        }\r\n        if (!isMousePress)\r\n            return;\r\n\r\n        newMousePos = Input.mousePosition;\r\n        if(oldMousePos != Vector2.zero)\r\n        {\r\n            mousePosOffset = newMousePos - oldMousePos;\r\n        }\r\n        oldMousePos = newMousePos;\r\n    }\r\n\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ \u83b7\u53d6\u7f29\u653e\u89c6\u91ce\u6570\u503c  1.\u9f20\u6807\u6eda\u8f6e 2.\u5c4f\u5e55\u4e0a\u4e0b\u6ed1\u52a8\r\n    \/\/\/ &lt;\/summary&gt;\r\n    \/\/\/ &lt;returns&gt;&lt;\/returns&gt;\r\n    float GetZoomValue()\r\n    {\r\n        float zoomValue = 0;\r\n        \/\/ \u4f7f\u7528\u9f20\u6807\u6eda\u8f6e\r\n        if (Input.GetAxis(\"Mouse ScrollWheel\") != 0)\r\n        {\r\n            zoomValue = Input.GetAxis(\"Mouse ScrollWheel\");\r\n        }\r\n        else if (mousePosOffset != Vector2.zero)\r\n        {\r\n            zoomValue = mousePosOffset.y * Time.deltaTime * zoomSpeed * 0.01f;\r\n        }\r\n\r\n        return zoomValue;\r\n    }\r\n\r\n    float xVelocity = 0;\r\n    \/\/\/ &lt;summary&gt;\r\n    \/\/\/ \u65cb\u8f6c\u76f8\u673a\r\n    \/\/\/ &lt;\/summary&gt;\r\n    void RotateCamera()\r\n    {\r\n        horizontalAngle = Mathf.SmoothDamp(horizontalAngle, horizontalAngle + mousePosOffset.x * Time.deltaTime * swipeSpeed, ref xVelocity, 0.1f);\r\n    }\r\n}<\/pre>\n<p>\u76f8\u673a\u53c2\u6570\u5df2\u6d4b\u8bd5\u53c2\u8003\u503c\uff1a<\/p>\n<p><a href=\"http:\/\/www.u3d8.com\/wp-content\/uploads\/2017\/08\/QQ\u622a\u56fe20170826173704.png\" data-lightbox=\"image_lg\"><img title=\"\u5236\u4f5c\u5927\u578bMMO\u9879\u76ee\u4e2d\u7684\u76f8\u673a\u89c6\u89d2\u64cd\u4f5c - \u7b2c2\u5f20  | u3d8\u6280\u672f\u5206\u4eab\" alt=\"\u5236\u4f5c\u5927\u578bMMO\u9879\u76ee\u4e2d\u7684\u76f8\u673a\u89c6\u89d2\u64cd\u4f5c - \u7b2c2\u5f20  | u3d8\u6280\u672f\u5206\u4eab\"  loading=\"lazy\" class=\"aligncenter size-full wp-image-1237\"  data-src=\"http:\/\/www.u3d8.com\/wp-content\/uploads\/2017\/08\/QQ\u622a\u56fe20170826173704.png\" width=\"372\" height=\"248\" srcset=\"http:\/\/www.u3d8.com\/wp-content\/uploads\/2017\/08\/QQ\u622a\u56fe20170826173704.png 372w, http:\/\/www.u3d8.com\/wp-content\/uploads\/2017\/08\/QQ\u622a\u56fe20170826173704-300x200.png 300w\" sizes=\"(max-width: 372px) 100vw, 372px\" \/><\/a><\/p>\n<p>\u9879\u76ee\u4f7f\u7528\u7248\u672c\uff1aUnity5.3.4 GitHub\u4e0b\u8f7d\u5730\u5740\uff1a<\/p>\n<p><a href=\"https:\/\/github.com\/654306663\/CameraOperate\" target=\"_blank\">https:\/\/github.com\/654306663\/CameraOperate<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4eca\u5929\u95f2\u4e0b\u6765\u7ed9\u5927\u5bb6\u5b9e\u73b0\u4e2a\u5927\u578bMMORPG\u9879\u76ee\u4e2d\u90fd\u4f1a\u7528\u5230\u7684\u529f\u80fd 1.\u76f8\u673a\u8ddf\u968f\u73a9\u5bb6 2 &hellip; <a href=\"http:\/\/www.u3d8.com\/?p=1235\">\u7ee7\u7eed\u9605\u8bfb <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[23],"tags":[279,276,278,277],"_links":{"self":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts\/1235"}],"collection":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1235"}],"version-history":[{"count":6,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts\/1235\/revisions"}],"predecessor-version":[{"id":1243,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts\/1235\/revisions\/1243"}],"wp:attachment":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1235"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1235"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1235"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}