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)
最后,底部代码用CW
和CCW
键在循环中旋转索引,而不是将键字母放在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);
}
我是编码新手,正想弄清楚我的相机交换脚本。我有 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)
最后,底部代码用CW
和CCW
键在循环中旋转索引,而不是将键字母放在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);
}