在 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;
}
}
我正在编写一个 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;
}
}