在开发过程中,完成了鼠标控制物体旋转之后发现点小BUG,因为物体720度旋转需要“Mouse X”和“Mouse Y”一起执行,为了使旋转的效果更为舒服使用了Rotate函数进行实现,但是相应的问题就出现了,Rotate是旋转函数,说明在执行控制物体旋转的时候物体是会一直进行旋转的,包括鼠标此时没有移动的时候或者在鼠标移动的时候,都会出现有物体自转的异常现象,我对解决这个小BUG的具体思路是:

当鼠标进行拖拽时,执行物体旋转功能,当鼠标位置不改变时不进行物体旋转功能,也就是说,鼠标在按下时,要再加一层判断,判断当前鼠标位置是否有移动,如果有即证明当前是在进行物体旋转,如果没有证明当前是在查看当前视角的物体,基于这个思路,完整的代码如下:

Vector3 v3;
    bool isRotate;
    Vector2 beforMousePos;
    Vector2 currentMousePos;
    
    public void Start()
    {
        beforMousePos = Input.mousePosition;
        currentMousePos = Input.mousePosition;
    }

    private void OnMouseDrag()
    {
        isRotate = true;
        v3 = new Vector3(Time.deltaTime * 200 * Input.GetAxis("Mouse Y"), -Time.deltaTime * 200 * Input.GetAxis("Mouse X"), RobotDemoModel.Robot.transform.rotation.z);
        
    }

    private void OnMouseUp()
    {
        isRotate = false;
    }
   
    private void Update()
    {
        currentMousePos = Input.mousePosition;
        if (Vector2.Distance(currentMousePos,beforMousePos)>10.0f)
        {
            beforMousePos = currentMousePos;
            //print("Mouse Move");
            if (isRotate)
            {
                RobotDemoModel.Robot.transform.Rotate(v3, Space.World);
            }
        }
        //print("Mouse Stop");
        
        
    }

Over!


在开发中使用上面的脚本发现基本要求满足  但是有还是有不舒服的地方,持续旋转会感觉很难受,简单讲就是旋转容易但是你想继续旋转会原来的样子和位置就很不舒服了,所以,改变思路,转物体不如直接转摄像头,让摄像头围着物体旋转这样执行起来会舒服很多,话不多少,代码奉上:

float mouse_x = Input.GetAxis("Mouse X");
    float mouse_y = Input.GetAxis("Mouse Y");
    
    //核心脚本是下面这两句
    //围绕旋转的话和Z轴是无关的,只是围绕物体的X和Y轴进行旋转所以
    //这里有个小点,围绕物体左右旋转使用的是Vector3.up,但是上下旋转使用的是transform.      
    //right,也就是摄像机本身的左右。这样的旋转效果比较好
    transform.RotateAround(tarObj.transform.position,Vector3.up,mouse_x * speed);
    transform.RotateAround(tarObj.transform.position,transform.right,mouse_y * speed);



    //这个是移动摄像机位置,也就是视角的变换
    //因为这个移动和z轴也没有关系,所以选定的就是Up和Left,这里要使用Vector3,用transform的话移动起来就是根据摄像机的XY移动并不是屏幕的XY
    transform.Translate(Vector3.left * (mouse_x * moveSpeed) * Time.deltaTime);  
    transform.Translate(Vector3.up * (mouse_y * moveSpeed) * Time.deltaTime);


    //这个就是摄像机的缩放了
    //Mouse ScrollWheel的取值范围是在+0.3f - -0.3f之间
    if(Input.GetAxis("Mouse ScrollWheel") > 0)
        transform.Translate(Vector3.forward * scrollSpeed);
    if(Input.GetAxis("Mouse ScrollWheel") < 0)
        transform.Translate(Vector3.forward * -scrollSpeed);

 Over!