为什么我不能让背景中的山脉以视差方式移动?

Why can't I make the mountains in the background move in a parallax fashion?

所以,我想让背景随着球员特朗普而移动。我该怎么做?

var trump : Rigidbody2D;
var mountain = GetComponent(Rigidbody2D);

function fixedUpdate() {
    mountain.position.x = trump.position.x * 2;
    mountain.position.y = trump.position.y * 2;
    if (mountain.position.y <= 0) {
        mountain.velocity.y = 0;
    }

}

我认为您的山脉不需要 RigidBody 组件 - 这些组件适用于执行碰撞并与游戏中的物理属性相关的对象。

在场景中移动游戏对象的正常过程是游戏对象的变换组件,它有一个位置 属性 您可以修改。

请原谅 C#。

[SerializeField] private Transform _mountainRoot;
[SerializeField] private Rigidbody2D _trumpBody;

[SerializeField, Range(0f, 1f)] private float _parallaxFactor = 0.75f;

private Vector2 _lastTrumpPos;

private void Update()
{
    // get the amount Trump moved since last update
    float deltaTrumpPosX = _trumpBody.position.x - _lastTrumpPos.x;

    // move the mountains by a factor of this movement 
    _mountainRoot.transform.Translate(deltaTrumpPosX * _parallaxFactor, 0f, 0f);

    // cache position value to use on next update cycle
    _lastTrumpPos = _trumpBody.position;
}

在这里,您将山脉的变换作为您想要操纵其位置的对象,并从您的角色中获取 Rigidbody2D。此外,您采用正常值(0 到 1,将其视为 0 到 100 之间的百分比)来缩放视差效果。

在此 Update() 循环中,我们首先找出自上次更新后角色移动了多少。我们将它的当前位置与我们在上次更新期间记录它的位置进行比较,然后减去,留下 difference/delta.

然后我们将这个增量值和我们的比例因子应用到山脉。 Transform.Translate()是一个修改位置的函数,在本例中我们只想修改X/horizontal值。

最后,我们记录角色在世界中的位置 覆盖之前的值 - 所以我们可以用它来计算下一次更新的增量。