0

我正在尝试为生成的平台预制件设置动画(平台对象本身在一个空的范围内,因为它的位置发生了变化)当 Runner 对象与它碰撞时(onCollisonEnter)向下,在碰撞退出时向上。

我已经逐字逐句地按照我的老问题给出的答案 - Unity,C# - 在碰撞输入时不能让对象从当前 y 位置向下移动一次?但是尽管按照指示在我的动画师中有这个,但无法使用动画师来制作动画:

在此处输入图像描述

一位回答的人建议我使用 Lerp 完全使用代码为平台预制件制作动画。我已经研究过 Lerp,但是由于我需要 2 个单独的状态来表示 Down/Idle Down(使平台保持关闭),而 up/idle up 也是如此,我不知道该怎么做。

如何以编程方式使用 Lerp 实现这种效果?能不能达到我想要的效果?

错误:

在此处输入图像描述

编辑:

我如何生成(出队然后入队)我的平台:

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

由于平台实际上并没有产生,你确定这是错误吗?你能帮助我吗?

4

1 回答 1

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

您需要注意的是确保“跑步者”停留在平台上,直到它在底部,以便它可以再次向上移动。您可以添加一个检查,以便无论使用另一个布尔值它对您不起作用,它都会向上移动。希望能帮助到你 :)

编辑

lerp(线性插值的缩写)所做的是根据时间分量(0 到 1)的进展在两个向量之间选取点。因此,为了让平台上下移动,它需要一个起点和一个终点,在这种情况下,它是向上或向下的(向上或向下是另一个)。

如果您想创建一个新平台而不会导致错误,您需要在创建它之后设置这些值,以便一切正常(如果您从任何位置跳跃,它将在 lerp 的第一步中积极跳跃)。例如:

//after instantiating the new platform object
scriptName newObject = newGameobject.GetComponent<scriptName>();
newObject.up = (up Vector);
newObject.down = (down Vector);
于 2016-06-27T22:19:27.433 回答