Unity - 如何使平台动画平台在碰撞进入和退出时使用Lerp上下移动?

时间:2016-06-27 19:22:10

标签: c# animation unity3d lerp

我正在尝试为生成的平台预制件设置动画(平台对象本身在空,因为它的位置发生变化)当Runner对象与它碰撞时(onCollisonEnter)和碰撞退出时UP。

我已逐字逐句地回答了我的旧问题的答案 - Unity, C# - cannot make object move down from current y position ONCE on collision enter?但是无法使用动画师来制作动画,尽管我的动画师按照指示进行了此操作:

enter image description here

一位回答的人建议我使用Lerp完全使用代码为平台预制件制作动画。我已经研究过Lerp但是因为我需要2个单独的状态用于Down / Idle Down(以使平台停留)和相同的up / idle up我不知道该怎么做。

如何以编程方式使用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;
        }

这就是向量应该始终是什么以及我最初在start()中设置它们的内容:

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

由于平台实际上并未产生,您确定错误是什么?你能救我吗?

1 个答案:

答案 0 :(得分: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它不适合您。希望它有所帮助:)

修改

lerp(线性插值的简称)的作用是基于时间分量(0到1)的进展在两个矢量之间拾取点。因此,为了使平台上下移动,它需要一个起点和一个终点,在这种情况下它是向上或向下(直到另一个的上部位置)。

如果你想创建一个没有引起错误的新平台,你需要在创建它之后设置这些值,这样一切都能正常工作(如果你从任何位置跳跃,它将在lerp的第一步中积极地跳跃)。例如:

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