控制2点之间的开始和结束点对象

时间:2016-11-28 11:24:07

标签: c# unity3d unity5

我试图在2点之间移动一个对象,并且此刻它有点奇怪,我读了文档,它说对象开始点是(0,0,0)所以我的对象在我的下面我在那里的其他网格,以及我实际可以控制的终点,在我的情况下它是10,我希望对象在1.5到10之间移动(不是0到10) 我有这个

void Update () {
    transform.position = new Vector3(transform.position.x,Mathf.PingPong(Time.time,10.0f), transform.position.z);
}

当我尝试将速度放在球上时:

void Update () {
    transform.position = new Vector3(transform.position.x,Mathf.PingPong(Time.time,10.0f) * 10, transform.position.z);
}

对象没有整理并且在结束时返回它只是停止循环并且从未回来如何纠正这2个问题?

2 个答案:

答案 0 :(得分:1)

如果你的对象有一个对撞机,我建议你通过它的Rigidbody而不是它的Transform来移动它,以避免潜在的碰撞问题。试试这个:

public float MinY = 1.5f; // y position of start point
public float MaxY = 10f; // y position of end point
public float PingPongTime = 1f; // how much time to wait before reverse
public Rigidbody rb; // reference to the rigidbody

void Update()
{
     //get a value between 0 and 1
     float normalizedTime = Mathf.PingPong(Time.time, PingPongTime) / PingPongTime;
     //then multiply it by the delta between start and end point, and add start point to the result
     float yPosition = normalizedTime * (MaxY - MinY) + MinY;
     //finally update position using rigidbody 
     rb.MovePosition(new Vector3(rb.position.x, yPosition, rb.position.z));
}

在这里,您可以更好地控制行程距离和速度。 实际上我并没有确切地知道你遇到的问题。但是不要忘记这里和你的尝试,你是在直接修改物体的位置,而不是增加力量。

希望对你有所帮助。

答案 1 :(得分:1)

我认为你只是误解了Mathf.PingPong方法的工作方式:

  • 第一个参数 t 是您要在 0 和给定长度之间“钳制”的值:这是您要放置的你所做的Time.time因为这个值会随着时间的推移而增加,因此会不断振荡。如果你想增加/减少振荡速度,你必须乘以它。
  • 第二个参数长度是“clamp”的最大值:如果你想增加/减少距离(在你的情况下)你要么设置为 0 并将整个Mathf.PingPong(...)乘以一个值或直接给它想要的值(两种实现都会产生不同的效果。

  • Mathf.PingPong(Time.time * speed, 1.0f) * value速度会影响振荡速度/ 会影响达到的最大值和完成振荡的速度/时间(来回)将保持与更改相同,并随着速度增加而减少

  • Mathf.PingPong(Time.time * speed, value)速度会影响振荡速度/ 会影响达到的最大值但不会影响完成振荡的速度/时间(返回和随着的增加和减少,随着速度的增加而增加

关于您的其他问题:

如果你想在 1.5 10 之间移动你的对象,你必须写下这样的东西: transform.position = new Vector3(transform.position.x, 1.5f + Mathf.PingPong(Time.time, 10.0f - 1.5f), transform.position.z);

此外,如果您想要检测碰撞,请避免手动设置位置,因为它会弄乱物理并导致奇怪的行为。在保持物理工作的同时移动物体的最佳方法是@Heldap使用Rigidbody.MovePosition说。