im试图以2分之间的统一移动对象,而目前它有点奇怪,我读了文档,它说对象开始点是(0,0,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);
}
对象不会殖民并在终点返回它只是停止循环,再也不会回来了,我该如何纠正这两个问题?
如果您的对象具有对撞机,我建议您通过其刚性体而不是转换移动它,以避免潜在的碰撞问题。尝试以下操作:
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));
}
在这里,您可以更好地控制旅行距离和速度。实际上,我没有得到您面临的问题。但是不要在这里和尝试中忘记,您正在直接修改对象的位置,而不是添加力或否则。
希望对您有帮助。
我认为您只是误解了Mathf.PingPong
方法的工作方式:
- 第一个参数 t 是您要在 0 和给定的 length 之间"夹紧"的值
Time.time
像您一样,因为此值会随着时间的推移而增加,因此会永久振荡。如果要增加/降低振荡速度,则必须乘以它。 -
第二个参数长度是"夹具"的最大值:如果您想增加/降低距离(在您的情况下),则将其设置为 0并将整个
Mathf.PingPong(...)
乘以一个值或直接给它提供想要的值(这两个实现都会有不同的效果。 -
Mathf.PingPong(Time.time * speed, 1.0f) * value
:速度将影响振荡速度/值将影响达到的最大值以及完成振荡的速度/时间(来回来回)将保持与 value 更改并减小为 speed 增加 -
Mathf.PingPong(Time.time * speed, value)
:速度会影响振荡速度/值将影响达到的最大值,但不会增加完成振荡的速度/时间(来回)如值增加并减少 speed 增加
关于您的其他问题:
如果要在 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
。