【问题标题】:Unity: Have Camera scroll and not jump to a certain positionUnity:让相机滚动而不跳转到某个位置
【发布时间】:2019-02-05 19:34:53
【问题描述】:

在我的小平台游戏中,我有一个可以跳跃的角色。如果他跳得足够高,相机应该也跟着角色向上。如果他不够高,相机将停留在其 Y 轴上并且仅通过 X 轴跟随玩家。我是这样实现的:

void FixedUpdate()
{
    float posX = Mathf.SmoothDamp(transform.position.x, player.transform.position.x, ref velocty.x, smoothTimeX);
    float posY = Mathf.SmoothDamp(transform.position.y, (player.transform.position.y + OffSetY), ref velocty.y, smoothTimeY);

    if(player.transform.position.y > heightOfPlayerForCamFollow) // change camera hight only when player has reached certain height level
    {
        transform.position = new Vector3(posX, posY, transform.position.z);
    }
    else
    {
        transform.position = new Vector3(posX, 0, transform.position.z);
    }


}

但是,现在,一旦玩家达到一定的跳跃高度,相机就会跳转到玩家的位置,而不是跟随他。仅仅因为我给它玩家 Y 位置的事实。我将如何调整我的代码以使相机跟随而不是传送到玩家?

谢谢你:)

【问题讨论】:

  • 嗯,你无法用这个逻辑来实现这一点。因为您通过检查位置来检查玩家跳得多高。也许你可以改变你的逻辑。你的玩家是如何跳跃的?用户应该怎么做才能跳得足够高并按住space 键或其他东西?
  • 没错,就是按住空格键。我可能会使用在天空中的高点进行碰撞检测,但这真的会改变什么吗?
  • 在我看来,你必须已经决定何时按下空格键,玩家是否会跳得足够高,而不是在玩家到达某个目的地时。然后你可以lerp到该位置。

标签: unity3d


【解决方案1】:

在我看来,最好的方法是将条件句移到不同的地方。您可以根据 if 设置目标 Y 值,但无论如何都要使用 smoothdamp 进行插值,因此它会平滑地返回 0(或任何您的基值)

void FixedUpdate()
{
    float posX = Mathf.SmoothDamp(transform.position.x, player.transform.position.x, ref velocty.x, smoothTimeX);
    float yTarget=0;
    if(player.transform.position.y > heightOfPlayerForCamFollow) 
         yTarget=(player.transform.position.y + OffSetY) 
     else 
        yTarget=0;
    float posY =Mathf.SmoothDamp(transform.position.y, yTarget, ref velocty.y, smoothTimeY);
    transform.position = new Vector3(posX, posY, transform.position.z);


}

【讨论】:

  • 嘿,谢谢。这做到了我的要求。然而,这是我的错——即使玩家在天空中的高处,摄像机现在也能将玩家保持在其中心。这会导致相机以极快的速度向上移动以将玩家保持在中心。不过,我真正想要的是,一旦相机向上跟随,让玩家不在中心位置,而是在更远的位置。这样玩家,只要他在高度限制内,就保持在屏幕的顶部,然后,一旦相机再次下降,玩家就会回到中心。你能再帮我一次吗? :)
  • 这不是 OffsetY 在做什么吗?你也可以尝试稍微增加你的smoothTimeY - 有时小幅增加会使运动更加平滑。也许让 offsetY 接近或等于 heightOfPlayerForCamFollow 可以完成这项工作?我还没有实际测试过代码,所以虽然我很高兴它可以工作,但我不知道如何改进它
  • offsetY 是为了让玩家不完全居中,而是稍微往下一点。但是一旦玩家在空中,可能会改变 offsetY。让我试试……
  • 太棒了。改变 offsetY (我使用它的方式与你不同)但这完全成功了。非常感谢!
【解决方案2】:

这应该可以解决问题:

void FixedUpdate()
{

    float prevY = transform.position.y;

    float step = followSpeed * Time.deltaTime;  // need to set followSpeed
        transform.position = Vector3.MoveTowards(transform.position, player.transform.position, step));

    if (player.transform.position.y < heightOfPlayerForCamFollow) {
        transform.position = new Vector3(transform.position.x, prevY, transform.position.z);
    }
}

【讨论】:

  • 嘿,听起来不错。但是有一个问题:相机现在跟随玩家向上,但是一旦玩家跌落并到达最小位置,相机就会跳到地面。但是ofc我需要它也向下移动而不是向下跳过..但几乎就在那里! :))
  • 谢谢。但是这段代码导致了一些奇怪的结果:相机跟随玩家向上但仍然向下跳跃。一旦我重复了几次,相机就会出错并开始完全拍摄屏幕外的其他地方......虽然不能告诉你为什么......:P
  • 现在试试,我忽略了 y 平滑。
  • 抱歉,但它仍然没有跟随玩家倒退……只是传送下来。起来很好:)
  • 感谢您的努力,但相机仍然出现故障并自行移动。这可能是我的错,但另一个人给出了完美的答案。由于您的帮助,我会投票。谢谢我的朋友:)
【解决方案3】:

将您的transform.position = new Vector3(posX, posY, transform.position.z); 更改为目标位置,而不是将其设置为摄像机位置。然后不断 LERP 你的相机的 Y 位置朝向这个 Y 位置。

所以在某种伪代码中:

if(camera.pos.y = target.pos.y)
skip
else
camera.pos.y.MoveTowards(target.pos.y, 10%)

https://docs.unity3d.com/ScriptReference/Mathf.Lerp.html 提供了一个很好的函数来在两个值之间进行插值。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    相关资源
    最近更新 更多