在写这篇文章前,我也是刚刚学习unity不久。看了很多的教程,但是在国内的网站上,没有看到制作RTS,或者说一个简单的战斗模拟器的教程,所以作者打算一边自学,一边把自己学习的过程写出来,希望可以帮助到一部分人。
这篇教程以及我完成的成品都是很简单的很简陋的部分,如果有问题也希望大佬们可以指正。O(∩_∩)O。
第一篇文章就先介绍如何控制游戏内的镜头,移动镜头的方法类似全面战争,wasd平移,鼠标滚轮缩放。
1.打开UNITY,首先插入一个3D object:plane作为地面,便于观察。
2.在Assets文件夹中新建Scripts文件夹,然后右键新建C# script文件,命名为CameraController。把它拖到Hierarchy中的main camera上,为摄像头上添加Script Component。
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