在 x 和 z 为静态时,沿 y 方向将相机连接到播放器

Attach camera to player in the y direction while x and z are static

我正在编写一个 2D 平台游戏,我正在努力让摄像机跟随玩家,除非玩家靠近关卡边缘,在这种情况下,摄像机将保持在一个位置,直到玩家再次离开关卡边缘。相当标准的东西。

我通过在关卡边缘附近放置一个触发区域来实现这一点,一旦玩家进入触发区域,摄像机将停留在一个位置。它运行良好,除了无论玩家做什么相机都保持静止。如果玩家试图 运行 侧面,我希望它在 x 方向保持静止,但如果玩家跳跃,我希望它在 y 方向跟随玩家。

这使用了两个脚本。这是播放器上的代码:

public class Eleni_Controller : MonoBehaviour {

public GameObject _mainCamera; // assigned in inspector
public Vector3 cameraEdgeRight = new Vector3(0,0,0); // position assigned in inspector
public Vector3 cameraEdgeLeft = new Vector3(0, 0, 0); // position assigned in inspector
public bool atEdge = false;

void OnTriggerEnter2D(Collider2D col)
{
    if (col.gameObject.name == "camera_edge_trigger_right")
    {
        _mainCamera.transform.position = cameraEdgeRight;
        atEdge = true;
    }
    if (col.gameObject.name == "camera_edge_trigger_left")
    {
        _mainCamera.transform.position = cameraEdgeLeft;
        atEdge = true;
    }
}
void OnTriggerExit2D(Collider2D col)
{
    if (col.gameObject.name == "camera_edge_trigger_right" || col.gameObject.name == "camera_edge_trigger_left")
    {
        atEdge = false;
    } 
}

这里是主摄像头的代码:

public class Camera_Behaviour : MonoBehaviour {

public Vector3 cameraPositionDefault = new Vector3(0, 4, -10);
public GameObject eleni; // player object, assigned in inspector
private Eleni_Controller eleniController; // script controlling player
private Transform playerPosition;

void Start()
{
    eleniController = eleni.GetComponent<Eleni_Controller>();
    playerPosition = eleni.transform; 
}

void LateUpdate()
{
    if (eleniController.atEdge == false) // if player in not close to either egde
    {
        transform.position = playerPosition.TransformPoint(cameraPositionDefault); // sets camera's position to player's position
    }  
}

我不知道如何编程才能让所有这些只影响 x,但仍会跟随玩家的 y 位置。

此外,如果有更有效的编程方法,我很想听听!谢谢!

也许看看 Cinemachine built-in 组件并设置两个带混合控制的相机

我最终通过在后期更新中添加一个新的 vector3 来修复它,它分别定义了 x、y 和 z 值,并添加了一个“else”语句以在玩家处于边缘时使用。

void LateUpdate()
{
    Vector3 cameraPositionEdge = new Vector3(transform.position.x, playerPosition.position.y + 1.6f, transform.position.z);

    if (eleniController.atEdge == false) // if player in not close to either egde
    {
        transform.position = playerPosition.TransformPoint(cameraPositionDefault); // sets camera's position to player's position
    }
    else
    {
        transform.position = cameraPositionEdge;
    }
}