2016-06-27 5 views
0

Я пытаюсь анимировать сборку платформы, которая порождена (сам объект платформы находится в пределах пустого, потому что изменяется его положение) DOWN, когда объект Runner сталкивается с ним (onCollisonEnter) и UP при удалении столкновения.Unity - Как оживить платформу двигаться вверх и вниз по столкновению, входить и выходить с помощью Lerp?

Я следовал за ответы, данные на мой старый вопрос здесь verbatim- Unity, C# - cannot make object move down from current y position ONCE on collision enter?, но не может получить анимацию с помощью Аниматор работать, несмотря на это в моем аниматора, как указано:

enter image description here

Один человек, который ответил предложил использовать Lerp для анимирования платформы prefab полностью с помощью кода. Я исследовал Lerp, но поскольку мне нужно два отдельных состояния для Down/Idle Down (чтобы платформа оставалась вниз), и то же самое для up/freele, я не знаю, как это сделать.

Как я могу достичь этого эффекта, используя программный код Lerp? Можно ли добиться эффекта, который я собираюсь сделать?

ОШИБКА:

enter image description here

EDIT:

как я икру (Dequeue затем Епдиеие) мои платформы:

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

Это то, что векторы должны всегда быть и то, что я установить их в начале в начале():

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

вещь, которую вы должны следить за убедившись, что «бегун» остается на платформе, пока не будет на дне, так что он может двигаться снова. Вы можете добавить чек, чтобы он возвращался обратно, независимо от другого bool, который он не работает для вас. Надеюсь, что это помогает :)

EDIT

Что лерп (сокращенно линейной интерполяции) делает это выбрать точки между двумя векторами на основе прогрессии компонента времени (от 0 до 1). Поэтому для того, чтобы платформа поднималась и опускалась, ей нужна начальная точка и конечная точка, в этом случае она вверх или вниз (до верхней позиции вниз для другой).

Если вы хотите создать новую платформу без возникновения ошибки, вам необходимо установить эти значения после ее создания, чтобы все работало правильно (если вы прыгнете с любой позиции, она будет агрессивно прыгать на первом этапе lerp). Например:

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

Эй, спасибо, но я внедрил ваш код и Im получаю ошибку (включенный скриншот в вопросе) transform.position присваивает попытку недействительной, и мои сборные файлы исчезают, когда Runner поражает их. Что я делаю не так? – skyguy

+0

Когда вы создаете новую платформу, вы не устанавливаете ее так, чтобы платформа тоже перемещалась, поэтому, когда она пытается инициализировать позицию в стартовом коде, она терпит неудачу и выдает ошибку. В сценарии, который используется для их создания, хватайте скрипт и устанавливайте точки вверх и вниз. – user3797758

+0

Что значит не устанавливать начальную позицию? Можете ли вы привести пример? Пробовал настройку вверх и вниз в обновлении, но он не работает – skyguy