2016-11-12 5 views
0

オブジェクトを元の位置から少し高めの位置にゆっくりと移動したいが、このコードは、オブジェクトが最も高い位置に瞬時に移動する。 f。別のコードの中でLiftObj()を呼び出すのは1回だけで、liftOffsetに達するまで実行します。このコードで何が問題になっていますか?非常に低速でもオブジェクトが新しい位置に即座に移動する

void LiftObj(GameObject Obj) { 

    float origianlPos = Obj.transform.position.y; 
    while (Obj.transform.position.y < origianlPos + liftOffset) { 
     Obj.transform.position += Vector3.up * 0.0001f; 
     float newPos = Obj.transform.position.y; 
     newPos = Mathf.Clamp (newPos, newPos, newPos + liftOffset); 
     Obj.transform.position += Vector3.up * 0.0001f; 
    } 
+0

明らかにヘルプを求めているのは、私がC#またはUnityの専門家ではないということです。あなたが私よりも優れたコードを提案しているということを指摘するのではなく、はるかに良いでしょう。 – CarloCupp

答えて

1

が、私は0.0001fのように本当に遅い速度を使用する場合、このコードはさえ 最も高い位置に瞬時にオブジェクトを移動させます。

あなたは全く待っていません。あなたの変数がどれほど低いかに関わらず、whileループはできるだけ早く実行されます。コルーチン関数でこれを実行してから、キーワードyield return nullで待ってください。その後、

IEnumerator LiftObj(GameObject Obj) 
{ 

    float origianlPos = Obj.transform.position.y; 
    while (Obj.transform.position.y < origianlPos + liftOffset) 
    { 
     Obj.transform.position += Vector3.up * 0.0001f; 
     float newPos = Obj.transform.position.y; 
     newPos = Mathf.Clamp(newPos, newPos, newPos + liftOffset); 
     Obj.transform.position += Vector3.up * 0.0001f; 
     yield return null; 
    } 
    Debug.Log("Done Moving Up!"); 
} 

とそれを動かす:あなたはTime.deltaが欠落しているため

StartCoroutine(LiftObj(myGameObject)); 

期待どおりに動作することをしてもわからないので、動きがスムーズではないかもしれません。 4秒でVector3(0, 5, 0)に現在myGameObject位置から

IEnumerator LiftObj(GameObject playerToMove, Vector3 toPoint, float byTime) 
{ 
    Vector3 fromPoint = playerToMove.transform.position; 

    float counter = 0; 

    while (counter < byTime) 
    { 
     counter += Time.deltaTime; 
     playerToMove.transform.position = Vector3.Lerp(fromPoint, toPoint, counter/byTime); 
     yield return null; 
    } 
} 

移動:あなたがしたいすべてが一つの位置からの移動は、別の残業にある場合は、以下のサンプルコードを使用

StartCoroutine(LiftObj(myGameObject, new Vector3(0, 5, 0), 4)); 
+0

最初のコードは正常に動作しますが、低速を例にして動作するかどうかを確認しました。私は今、リフトスピード* Time.deltaTime – CarloCupp

+0

素晴らしいを使用します。そのコードのバグをよく知っていませんでした。 – Programmer

0

をあなたが使用していますwhileは間違った場所にループします。

Whileループは、文が真である限り、1つのフレームで実行を続けます。 これは、マグニチュード乗数がどれほど低い(0.001f)かにかかわらず、ターゲットに到達するために同じフレーム内でより多くの反復をとることを意味します。

オブジェクトがまだ目標に達しているかどうか、および変換が適用されていないかどうかを確認する必要があります。

関連する問題