【问题标题】:How can I get my camera to stop following my player when I jump on the Y axis in Unity?当我在 Unity 的 Y 轴上跳跃时,如何让我的相机停止跟随我的玩家?
【发布时间】:2019-12-19 04:27:58
【问题描述】:

真的很快。我正在制作一个 2D 游戏,我的玩家沿着 Y 轴向下移动。没有什么能让播放器恢复正常,所以我想将我的相机锁定在播放器上。当我的玩家跳跃时,相机会跟随,这基本上是我想要阻止的,但我似乎无法找到一个“简单”的解决方案。如果有人可以帮助我,请提前感谢!'

  public Transform target;

  public bool X, Y, Z;

  public float XOffset, YOffset, ZOffset;

  void Update()
  {
        transform.position = new Vector3(
            (X ? target.position.x + XOffset : transform.position.x),
            (Y ? target.position.y + YOffset : transform.position.y),
            (Z ? target.position.z + ZOffset : transform.position.z));

  }

【问题讨论】:

  • 您需要提供一些可用于帮助您解决问题的最少代码。
  • 尝试在跳跃时执行某种类型的“禁用 y 轴”但一直没有工作。需要一种更清洁的方法来实现这一目标
  • 您能解释一下Nothing brings the player back upWhen my player jumps 之间的联系吗...所以跳跃不会让玩家恢复...?
  • 这是一个 2D 滑雪游戏,所以要创建跳跃的错觉,玩家会在 Y 轴上略微向上移动,但实际上从未向上移动(至少超过一秒)如果这有意义的话。
  • 你之前不是问过同样的问题吗stackoverflow.com/a/59411066/687262

标签: c# unity3d camera 2d


【解决方案1】:

Y 为真时,使y 分量为当前y 位置和目标的y 位置加上偏移量的最小值。

public Transform target;

public bool X, Y, Z;

public float XOffset, YOffset, ZOffset;

void Update() 
{ 
    Vector3 targetPos = target.position;
    Vector3 currentPos = transform.position;

    transform.position = new Vector3(
            X ? targetPos.x + XOffset : currentPos.x, 
            Y ? Mathf.Min(currentPos.y, targetPos.y + YOffset) : currentPos.y,
            Z ? targetPos.z + ZOffset : currentPos.z);
}

【讨论】:

    【解决方案2】:

    您可以存储相机的最后一次变换位置并检查它是否高于以前。然后你可以根据它改变Y值。

    using UnityEngine;
    
    public class CameraFollow : MonoBehaviour
    {
        Vector3 LastCameraPosition = Vector3.positiveInfinity;
    
        public Transform target;
    
        public bool X, Y, Z;
    
        public float XOffset, YOffset, ZOffset;
    
        void Update()
        {
    
            if (target.position.y < LastCameraPosition.y)
            {
                LastCameraPosition = target.position;
                Y = true;
            }
            else
            {
                Y = false;
            }
    
            transform.position = new Vector3(
           (X ? target.position.x + XOffset : transform.position.x),
           (Y ? target.position.y + YOffset : transform.position.y),
           (Z ? target.position.z + ZOffset : transform.position.z));
        }
    }
    

    【讨论】:

    • 这也行得通。也非常感谢您的宝贵时间。
    • 很高兴我们提供了帮助。 Ruzihm 的方法效率更高。你应该使用他的算法。 :)
    【解决方案3】:

    另一种方法是在玩家在地面上的每一帧更新一个 gounded_y 变量,并将其用作摄像机 y 的最小值或最大值(取决于方向)。 这样,如果玩家在跳跃后跌倒,凸轮将跟随,但在跳跃期间永远不会向上跟随。

    【讨论】:

    • 除非他撞到更高的飞机,否则他会再次被停飞。您需要检查最后一个 grounded_y 变量是否小于新变量。
    【解决方案4】:

    如果您的播放器总是向下移动,您可以在相机更新中添加条件

    if(character.transform.position.y < camera.transform.position.y){
        camera.transform.position = new Vector3(
                character.position.x + XOffset,
                character.position.y + YOffset,
                character.position.z + ZOffset);
    }
    

    当然在这种情况下,相机不允许成为玩家的子对象

    【讨论】:

    • 这仍然允许相机在玩家跳跃时在 Y 轴上向上移动(这是我试图避免的)
    • @Evan 怎么样?只有当玩家位置低于最后一个相机位置时,您才会更新相机的变换
    • 叹了口气,刚试了一下,跳跃的时候镜头还是跟着玩家。
    • @Ruzihm 这在他的问题中并不明显,当我写下答案时,他还没有在 cmets 中解决这个问题。我的意思是他写了“当我的玩家跳跃时,相机会跟随,这基本上是我想要阻止的”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多