Unity 安卓上鼠标旋转物体 unity鼠标旋转视角_缩放


在写这篇文章前,我也是刚刚学习unity不久。看了很多的教程,但是在国内的网站上,没有看到制作RTS,或者说一个简单的战斗模拟器的教程,所以作者打算一边自学,一边把自己学习的过程写出来,希望可以帮助到一部分人。

这篇教程以及我完成的成品都是很简单的很简陋的部分,如果有问题也希望大佬们可以指正。O(∩_∩)O。

第一篇文章就先介绍如何控制游戏内的镜头,移动镜头的方法类似全面战争,wasd平移,鼠标滚轮缩放。

1.打开UNITY,首先插入一个3D object:plane作为地面,便于观察。


Unity 安卓上鼠标旋转物体 unity鼠标旋转视角_Time_02


2.在Assets文件夹中新建Scripts文件夹,然后右键新建C# script文件,命名为CameraController。把它拖到Hierarchy中的main camera上,为摄像头上添加Script Component。


Unity 安卓上鼠标旋转物体 unity鼠标旋转视角_Unity 安卓上鼠标旋转物体_03


3.代码部分

首先定义三个变量,分别是wasd方向的moveSpeed,鼠标滚轮缩放的zoomSpeed,还有按住鼠标中键后旋转镜头的rotateSpeed。


private float moveSpeed = 10.0f;
    private float zoomSpeed = 200.0f;
    private float rotateSpeed = 200.0f;


在update()函数中,通过Input.GetAxis()函数获取鼠标的输入。


void Update()
    {       
        float horizontalInput = Input.GetAxis("Horizontal");
        float verticalInput = Input.GetAxis("Vertical");
        float scrollInput = -Input.GetAxis("Mouse ScrollWheel");
     }


然后计算前后左右,上下缩放的位移


void Update()
    {
        //..............
        Vector3 forwardMove = moveSpeed * transform.forward * verticalInput * Time.deltaTime * transform.position.y;
        forwardMove.y = 0;
        Vector3 rightMove = moveSpeed * transform.right * horizontalInput * Time.deltaTime * transform.position.y;
        Vector3 upMove = new Vector3(0, scrollInput * zoomSpeed * Time.deltaTime * Mathf.Sqrt(transform.position.y), 0);
     }


将三个位移相加,作为最终的位移


void Update()
    {
        //..............
        Vector3 move = forwardMove + rightMove + upMove;
        transform.position += move;     
     }


完成这一步,已经可以通过wads来平移摄像头,鼠标滚来来缩放镜头了。但还需要实现按住鼠标中键旋转镜头。

首先定义rotationX和rotationY变量,获取camera初始的rotation变量。


private float rotationX = 0;
    private float rotationY = 0;
    // Start is called before the first frame update
    void Start()
    {
        Vector3 rotation = transform.eulerAngles;
        rotationX = rotation.x;
        rotationY = rotation.y;
    }


在鼠标中键按下后,获取鼠标在Screen上X, Y的位移,然后通过RotateCamera函数计算rotate。


void Update()
    {
       //.................................
       if (Input.GetMouseButton(2))
        {
            float mouseX = Input.GetAxis("Mouse X");
            float mouseY = -Input.GetAxis("Mouse Y");
            RotateCamera(mouseX, mouseY);
        }

    }


RotateCamera函数实现


void RotateCamera(float mouseX, float mouseY)
    {
        //mouseX的位移影响的是y轴的旋转
        //mouseY的位移影响的是x轴的旋转
        rotationY += mouseX * rotateSpeed * Time.deltaTime;
        rotationX += mouseY * rotateSpeed * Time.deltaTime;

        transform.rotation = Quaternion.Euler(rotationX, rotationY, 0.0f);
    }


然后运行游戏,就可以控制游戏内的镜头了。当然,到这一步还需要一定的完善,那就是相机可能会太高,或者落到plane平面下方,所以需要一个高度限制。把下面的函数放在改变camera transform.position的上方。


private float minHeight = 5;
    private float maxHeight = 40;
    void Update()
    {
        //.........................
        //确保vertical方向的位移不会超过上下界限
        if (transform.position.y > maxHeight && upMove.y > 0) upMove.y = 0;
        else if (transform.position.y < minHeight && upMove.y < 0) upMove.y = 0;
        if (transform.position.y + upMove.y > maxHeight) upMove.y = maxHeight - transform.position.y;
        else if (transform.position.y + upMove.y < minHeight) upMove.y = minHeight - transform.position.y;
    }


4.完成

运行就可以通过wasd前后左右移动摄像头,鼠标滚轮上下缩放摄像头了,一个类似total war的相机控制函数就完成了!

参考视频:Unity RTS - Camera Tutorial