2016-06-27 4 views
0

Runnerオブジェクトが衝突したときにDOWN(onCollisonEnter)と衝突終了時にUPを生成したプラットフォームプレハブをアニメーション化しようとしています(プラットフォームオブジェクト自体がその位置が変化するため空です)。Unity - プラットフォームをアニメーション化する方法は、Lerpを使用して衝突の入力と終了を上下に移動しますか?

私はUnity, C# - cannot make object move down from current y position ONCE on collision enter? verbatim-ここに私の古い質問に与えられた答えを踏襲しているが、監督としての私のアニメーターでこれを持つにもかかわらず、仕事にアニメーターを使ってアニメーションを取得することはできません。答え

enter image description here

一人私はLerpを使ってコードを使ってプラットフォームのプレハブを完全にアニメーション化することを提案しました。私はLerpを研究しましたが、Down/Idle Down(プラットフォームを停止させる)とUp/Idle Upのための2つの別々の状態が必要なので、私はこれを行う方法を知らない。

Lerpをプログラムで使用してこの効果を達成するにはどうすればよいですか?私が行っている効果を達成することは可能ですか?

ERROR:

enter image description here

編集:私は(デキューその後、エンキュー)私のプラットフォームを起動する方法

nextPosition += new Vector3 (
      Random.Range (minGap.x, maxGap.x) + scale.x, 
      Random.Range (minGap.y, maxGap.y), 
      Random.Range (minGap.z, maxGap.z)); 


     Transform o = objectQueue.Dequeue(); 
     o.localScale = scale; 
     o.localPosition = position; 
     //o.localEulerAngles = rotation; 
     o.gameObject.SetActive (true); 

     int materialIndex = Random.Range(0, materials.Length); 
     o.GetComponent<Renderer>().material = materials[materialIndex]; 
     o.GetComponent<Collider>().material = noFrictionMaterial; 

     platform newScript = new o.GetComponent<platform>(); //getting an error here when I tried to implement your code 

     objectQueue.Enqueue (o); 

     if(nextPosition.y < minY){ 
      nextPosition.y = minY + maxGap.y; 
     } 
     else if(nextPosition.y > maxY){ 
      nextPosition.y = maxY - maxGap.y; 
     } 

これは、ベクトルは常に、どのようなIべきものですもともと開始時に設定してください(

up = new Vector3 (transform.position.x, transform.position.y, transform.position.z); 
     down = new Vector3 (transform.position.x, transform.position.y-2f, transform.position.z); 

プラットフォームは実際には生成されないので、エラーは本当ですか?手伝って頂けますか?

+0

「Lerp」で上下に移動しますか?たとえば、上下にジャンプします。あなたがしようとしていることを正確に知ることは良いことです。 – Programmer

答えて

1

これはあなたのために働く必要があります。

using UnityEngine; 
using System.Collections; 

public class Collision : MonoBehaviour { 

    public Vector3 up, down; 
    public bool isUp = false; 
    public float speed = 5f; 

    float startTime, 
     length; 
    bool isMoving = false; 

    void Start() { 
     //initialise the platform to a position 
     if (isUp) transform.position = up; 
     else transform.position = down; 

     length = Vector3.Distance(up, down); 
    } 

    void Update() 
    { 
     if (isUp) 
     { 
      //move Down 
      transform.position = Vector3.Lerp(up, down, ((Time.time - startTime) * speed)/length); 
     } 
     else 
     { 
      //move Up 
      transform.position = Vector3.Lerp(down, up, ((Time.time - startTime) * speed)/length); 
     } 
    } 

    //move down 
    void OnCollisionEnter(Collision col) 
    { 
     if (!isMoving) 
     { 
      startTime = Time.time; 
      isMoving = true; 
     } 
    } 

    //move up 
    void OnCollisionExit(Collision col) 
    { 
     if (!isMoving) 
     { 
      startTime = Time.time; 
      isMoving = true; 
     } 
    } 
} 

あなたはそれが再び動くことができるように、それは底になるまで「ランナー」はプラットフォームにとどまることを確認することさに注意しなければならない事。あなたはそれがあなたのために働いていない別のブールに関係なくバックアップを移動するようにチェックを追加することができます。ホープは役立ちます:)

EDIT(線形補間のために短い)

何lerpない時間コンポーネント(1から0)の進行に基づいて、2つのベクトル間の点を選択しています。したがって、プラットフォームが上下に移動するには、開始点と終了点が必要です。この場合は、上下に移動します(上の位置まで下に移動します)。

エラーを発生させずに新しいプラットフォームを作成する場合は、作成した後にこれらの値を設定して、すべてが正しく動作するようにする必要があります(任意の位置から飛び跳ねると、lerpの最初のステップで積極的に飛びます)。例:

//after instantiating the new platform object 
scriptName newObject = newGameobject.GetComponent<scriptName>(); 
newObject.up = (up Vector); 
newObject.down = (down Vector); 
+0

ありがとう、ありがとうございます。しかし、私はあなたのコードを実装しました。エラー(問題のスクリーンショットを含む)を取得しています。ランナーがヒットしたときに、transform.positionの割り当てが無効で、プレハブが消えます。私は間違って何をしていますか? – skyguy

+0

新しいプラットフォームを作成するときに、プラットフォームが移動しなければならない位置を設定しないので、開始コードの位置に初期化しようとすると失敗し、エラーがスローされます。あなたがそれらを作成するために使用するスクリプトでスクリプトを取得し、上下のポイントを設定します。 – user3797758

+0

開始位置を設定していないということを意味しますか?あなたは例を挙げることができますか?アップデートでセットアップを試してみましたが、動作していません – skyguy

関連する問題