升降平台无法正常工作

时间:2015-06-26 08:57:00

标签: unity3d

我想在我的游戏中制作一些升降平台,所以如果平台发生故障,角色就无法完成它。我已经为它编写了一个脚本,但出于某种原因,它提升了#34;没有按预期工作。它不会回到它的起始位置,但它会稍微低一点。由于某种原因,它不会顺利地进入它应该的地方,只是"传送"那里完成了。我将Time.deltaTime与const相乘会有所帮助,但它是一样的。

这是我的代码,任何帮助将不胜感激:

public class LiftingPlatform : MonoBehaviour {
private Transform lift;

private bool isCanBeLifted;
private float timeToLift;
public float timeNeededToLift = 5f;

private Vector3 startPos;
private Vector3 downPos;
private Vector3 shouldPos;

private bool isDown;

public GameObject[] collidingWalls;


// Use this for initialization
void Start () {
    lift = transform;

    isCanBeLifted = true;
    timeToLift = 0f;

    isDown = false;

    startPos = transform.position;

    downPos = new Vector3(startPos.x, startPos.y - 5f, startPos.z);
}

// Update is called once per frame
void Update () {
    timeToLift += Time.deltaTime;

    if (timeToLift >= timeNeededToLift) {
        if (isCanBeLifted) {
            if (isDown) {
                shouldPos = Vector3.Lerp(startPos, downPos, Time.deltaTime * 10);
                lift.position = new Vector3(shouldPos.x, shouldPos.y, shouldPos.z);
                isDown = true;
            }
            else if (!isDown) {
                shouldPos = Vector3.Lerp(downPos, new Vector3(startPos.x, startPos.y, startPos.z), Time.deltaTime * 10);
                lift.position = new Vector3(shouldPos.x, shouldPos.y, shouldPos.z);
                isDown = false;

            }
        }
        timeToLift = 0;

    }


    if (!isDown) {
        for (int i = 0; i < collidingWalls.Length; i++) {
            collidingWalls[i].SetActive(true);
        }

    }

    else if (isDown) {
        for (int i = 0; i < collidingWalls.Length; i++) {
            collidingWalls[i].SetActive(false);
        }
    }

}

void OnTriggerEnter(Collider collider) {
    if (collider.tag == "Player" || collider.tag == "Enemy") {
        isCanBeLifted = false;
    }
}

void OnTriggerExit(Collider collider) {
    if (collider.tag == "Player" || collider.tag == "Enemy") {
        isCanBeLifted = true;
    }
    }
}

这些升降平台是另一个平台物体的孩子。

1 个答案:

答案 0 :(得分:1)

看起来你每帧都在更新对象的位置。您只检查通过的总时间是否大于提升所需的时间,然后将位置更新为取决于增量时间的值(使用Vector3.Lerp功能)。

我要做的是在更新步骤中,如果timeToLift大于timeNeededToLift,则从前者中减去后者并反转isDown的值。然后,在Vector3.Lerp中,制作第三个参数(timeToLift / timeNeededToLift)而不是(Time.deltaTime * 10)。你可以尝试一下,看看它是否有效吗?

Vector3.Lerp的第三个参数是&#34;混合因子&#34;在两个向量之间,0是第一个向量,1是第二个,其间是0.5。如果总时间大于提升所需的时间,但增量时间不大于1,它将使用小于1的混合因子得到平台的位置,从而产生一个没有提升的平台完全移动。