2016-11-28 15 views
0

imは2点間でオブジェクトを1つに動かそうとしていますが、現時点では奇妙なことに、ドキュメントを読んで、オブジェクトの始点が(0,0 、0)私のオブジェクトは私がそこに持っている私の他のメッシュの下に行き、私が実際にコントロールできるエンドポイントは10で、私はオブジェクトを1.5から10(0から10ではない)に移動したい。 私は、このやってボールの速度を置くしようとしたとき、私はこの2点間のコントロールの開始点と終了点オブジェクト

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つの問題を修正できますか?

答えて

1

オブジェクトにコライダーがある場合、衝突の可能性のある問題を回避するために、トランスフォームではなくリジッドボディで移動することをお勧めします。これを試してみてください:

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)); 
} 

ここでは、移動距離とスピードをより適切に制御できます。 実際、私はあなたが直面した問題が何であるかを正確には知りませんでした。しかし、ここで、あなたの試行では、力の追加などではなく、オブジェクトの位置を直接修正していることを忘れないでください。

希望はあなたを助けます。

+0

素晴らしいD –

1

私はあなたが単にMathf.PingPong方法がどのように動作するかを誤解だと思う:

  • 最初の引数をトンはあなたがと与えられたの間で「クランプ」する値である:これはだったあなたですこの値は時間が経つにつれて増加するため、永久に振動するので、Time.timeを入力してください。振動速度を増減させたい場合は、それを増やす必要があります。
  • 第二引数は「クランプ」の最大値である:あなたが(あなたのケースで)距離を減少/増加させたい場合は、どちらか持っているにそれを設定し、その値によって全体Mathf.PingPong(...)を掛けますまたは直接それに必要な値を与えることができます(どちらの実装も異なる効果を持ちます)。

  • Mathf.PingPong(Time.time * speed, 1.0f) * valueスピードが振動速度に影響します/ に達し、最大値に影響を及ぼし、振動(前後に)を完了するための速度/時間が変更と減少値と同じままになります速度など増加

  • Mathf.PingPong(Time.time * speed, value)スピード達し、最大値ではなく、スピード/トンに影響する振動の速度/ に影響を与えますIME振動(前後には)値としてあなたの他の問題についてスピード増加

として増加と減少を増加します完了するために:

あなたは1.5の間、あなたのオブジェクトを移動したい場合のように書く必要があります。 transform.position = new Vector3(transform.position.x, 1.5f + Mathf.PingPong(Time.time, 10.0f - 1.5f), transform.position.z);

また、衝突を検出したい場合は、手動で位置を設定しないでください。物理的に混乱し、奇妙な動作が発生するためです。物理的な作業をしながらあなたのオブジェクトを移動する最善の方法は、@HeldapがRigidbody.MovePositionを使って言ったように行うことです。

関連する問題