目前正在自学unity,打算一边学习,一边试着自己写一个rts的war gaming。
在进入正式的游戏之前,需要先制作游戏内的相机,控制镜头。
1.先插入一个Terrain object作为地面。方便观察摄像头的移动
2.在Scripts文件夹中新建C# script文件,命名为CameraMoveController。把它拖到main camera上,在摄像头上添加Script Component。
3.代码部分
1.定义三个变量
private float speed = 10.0f;
private float zoomSpeed = 600.0f;
private float rotateSpeed = 70f;
然后通过Input.GetAsix()获取wasd和鼠标滚轮的输入。
void Update()
{
float horizontalInput = transform.position.y * Input.GetAxis("Horizontal");
float verticalInput = transform.position.y * Input.GetAxis("Vertical");
float scrollInput = -Mathf.Log(transform.position.y) * Input.GetAxis("Mouse ScrollWheel");
}
计算相机forward,right,vertical三个方向的位移
void Update()
{
//.......
Vector3 forwardMove = transform.forward;
forwardMove.y = 0;
forwardMove.Normalize();
forwardMove *= verticalInput * speed * Time.deltaTime;
Vector3 verticalMove = new Vector3(0, scrollInput * zoomSpeed * Time.deltaTime, 0);
Vector3 rightMove = transform.right * horizontalInput * speed * Time.deltaTime;
}
在将三个Vector3相加,作为相机最后的位移
void Update()
{
//.......
Vector3 move = verticalMove + forwardMove + rightMove;
transform.position += move;
}
这个时候运行就可以移动Camera了,但我们还希望摄像头可以左右上下旋转。
2.让Camera可以旋转
现在start中获取相机的rotation角度
void Start()
{
Vector3 rot = transform.eulerAngles;
rotationX = rot.x;
rotationY = rot.y;
}
我们希望按下鼠标中键的时候可以旋转摄像头,还是通过Input.GetAxis()函数获取鼠标的在x和y方向上的位移。
void Update()
{
if (Input.GetMouseButton(2))
{
float mouseX = Input.GetAxis("Mouse X");
float mouseY = -Input.GetAxis("Mouse Y");
RotateCamera(mouseX, mouseY);
}
}
获得位移后,很容易就可以计算出我们需要旋转的方向。
void RotateCamera(float mouseX, float mouseY)
{
rotationY += mouseX * rotateSpeed * 0.02f;
rotationX += mouseY * rotateSpeed * 0.02f;
transform.rotation = Quaternion.Euler(rotationX, rotationY, 0.0f);
}
4.完成
运行就可以通过wasd前后左右移动摄像头,鼠标滚轮上下缩放摄像头了。有点像total war的。还可以加入minHeight,maxHeight来限制缩放的极限。参考视屏:Unity RTS - Camera Tutorial