8个定向相机的相机切换脚本?

Camera switching script for 8 directional cameras?

我是编码新手,正想弄清楚我的相机交换脚本。我有 8 个 Cinemachine 虚拟摄像机围绕播放器定位,每个方向(N、NE、E、SE、S、SW、W、NW)围绕 Y 轴以 45 度为增量。我的计划是使用“Q”和“E”键通过每个摄像机进行转换,以创建围绕玩家的完整旋转,但 8 个摄像机的视角是固定的。

我在 State Drive 和动画师中设置了 8 个摄像头。我希望“Q”循环通过摄像机以围绕玩家创建逆时针旋转,而“E”顺时针旋转。

[

如果你用过Cinemachine,你肯定对State Driven Camera很熟悉。此功能可以通过 Animator 切换虚拟相机。例如,在创建了一个从 Cinemachine 菜单驱动的状态后,我将三个具有以下名称的虚拟摄像机放入其中,并将每个摄像机调整到所需的角度。


Cinemachine 状态驱动的摄像机设置

在底部,您将看到 State Driver Camera 组件,用于激活虚拟相机、创建动画器并将其放置在 Animated Target 中。此摄像机自动检测动画器状态并根据不断变化的状态移动摄像机:

我如下所示设置动画器并设置状态的名称以及参数以使其更容易。


切换相机脚本

最后使用下面的代码,参考按键修改参数,就可以看到相机的变化了。

public Animator stateDrivenAnimator; // fill state driven animator here

public List<KeyCode> KeyCodes = new List<KeyCode>() // some keys for example
{
    KeyCode.Q,
    KeyCode.W,
    KeyCode.E
};
public void Update()
{
    KeyCodes.ForEach(k => { if (Input.GetKeyDown(k)) stateDrivenAnimator.SetTrigger(k.ToString()); });
}

顺时针和逆时针旋转

为此,最好在 Index 中定义相机旋转过程。只定义一个 Index 参数而不是 Triggers 就足够了,并且按照图像的顺序按旋转周期调节每个状态。

  • (N == 0)
  • (NE == 1)
  • (E == 2)
  • (SE == 3)
  • (S == 4)
  • (SW == 5)
  • (W == 6)
  • (西北 == 7)

最后,底部代码用CWCCW键在循环中旋转索引,而不是将键字母放在Trigger中,并且相机根据设置索引。

public CinemachineStateDrivenCamera stateDriven; // Get state-drive here

public KeyCode CW;
public KeyCode CCW;

private int index;

public void Update()
{
    if (!Input.GetKeyDown(CW) && !Input.GetKeyDown(CCW)) return;
    var animator = stateDriven.m_AnimatedTarget;
    var childCount = stateDriven.transform.childCount;
    
    if (Input.GetKeyDown(CW)) index = ++index % childCount;
    else if (Input.GetKeyDown(CCW)) index = (index == 0) ? childCount - 1 : --index;
    
    animator.SetInteger("Index", index);
}