5-10 摄像机旋转控制

  在上一章中,我们完成了摄像机移动控制的功能,并为摄像机的移动范围作出了限制。在这一章中我们将完成摄像机旋转控制的相关功能。
  摄像机的旋转并不像移动那样与视距有一定的关联性,所以只需要创建一个rotationSpeed变量即可,默认值为180。在Update中通过检测Rotation的输入增量,来控制旋转角度。代码如下:

HexMapCamera.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//camera的旋转速率
public float rotationSpeed;



private void Update()
{


//检测 旋转 按键按下
//默认在project settings -> input 中没有Rotation输入检测,需要添加
float rotationDelta = Input.GetAxis("Rotation");
if (rotationDelta != 0f)
{
AdjustRotation(rotationDelta);
}
}



/// <summary>
/// 控制camera旋转
/// </summary>
/// <param name="delta">旋转输入增量</param>
private void AdjustRotation(float delta)
{
}

  代码编译完成后,将rotationSpeed初始值设置为180,如下图:

  这里需要注意,在默认的输入配置中并没有Rotation相关配置,我们必须在 Project Settings 面板的 Input Manager选项卡中添加Rotation相关配置。这里我们使用 Q 和 E、英文句号和逗号来作为按键输入。配置如下图所示:

  与控制摄像机俯仰角类似,我们横向旋转摄像机,其实是在旋转Hex Map Camera对象。通过时间增量计算出旋转角度,再对摄像机进行旋转即可。代码如下:

HexMapCamera.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
//用于记录旋转角度
private float rotationAngle;



private void AdjustRotation(float delta)
{
//通过时间增量获取旋转角度
rotationAngle += delta * rotationSpeed * Time.deltaTime;

//旋转根节点物体即可达到旋转camera视角的效果
transform.localRotation = Quaternion.Euler(0f, rotationAngle, 0f);
}

  因为旋转一圈是360度,所以我们要将旋转角度的范围控制在0到360度之间。代码如下:

HexMapCamera.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void AdjustRotation(float delta)
{
rotationAngle += delta * rotationSpeed * Time.deltaTime;

//将旋转角度控制在0-360之间
if (rotationAngle < 0f)
{
rotationAngle += 360f;
}
else if (rotationAngle >= 360f)
{
rotationAngle -= 360f;
}

transform.localRotation = Quaternion.Euler(0f, rotationAngle, 0f);
}

  代码完成后,我们就可以通过键盘Q和E键对视角进行旋转了。但是还有一个问题,当我们旋转了视角之后,摄像机的方向并没有改变,例如我们将视角旋转180度之后,按下W键本应该向前移动,却在向后移动。所以我们要在摄像机旋转的时候,重新计算摄像机的移动方向。代码如下:

HexMapCamera.cs
1
2
3
4
5
6
7
8
9
private void AdjustPosition(float xDelta, float zDelta)
{


//camera的移动方向
Vector3 direction = transform.localRotation * new Vector3(xDelta, 0f, zDelta).normalized;


}

  至此,我们就完成了摄像机的旋转、移动与视距控制。在对摄像机的视角控制时,我们并未直接对Main Camera物体进行操作,而是将旋转、移动、视距这些操作分别对应了3个不同的对象,保证了在进行旋转或位移时这些对象的变化不会互相影响。在下一章中,我们将对现有的地图编辑器功能进行拓展,为其增加一些新的功能,以适应现在尺寸更大的地图。

Github代码