【问题标题】:Unity - How to animate platform move up and down on collision enter and exit using Lerp?Unity - 如何使用 Lerp 在碰撞进入和退出时为平台上下移动设置动画?
【发布时间】:2016-06-27 19:22:10
【问题描述】:

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

我已经逐字遵循了对我的旧问题的回答-Unity, C# - cannot make object move down from current y position ONCE on collision enter?,但是尽管按照指示在我的动画师中使用了这个,但我无法使用动画师来制作动画:

一位回答的人建议我使用 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);

由于平台实际上并未生成,您确定这是错误吗?你能帮帮我吗?

【问题讨论】:

  • 只用Lerp上下浮动?例如,上下跳跃。最好确切地知道您要做什么。

标签: c# animation unity3d lerp


【解决方案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);

【讨论】:

  • 嘿,谢谢,但我实现了你的代码,我得到了错误(包括有问题的屏幕截图)transform.position 分配尝试无效,当跑步者击中它们时,我的预制件消失了。我做错了什么?
  • 当你创建一个新平台时,你没有设置平台也必须移动的位置,所以当它尝试初始化到起始代码中的位置时,它会失败并抛出错误。在您用来创建它们的脚本中,抓取脚本并设置上下点。
  • 不设置起始位置是什么意思?你能举个例子吗?尝试在更新中设置和关闭,但它不起作用
  • 我遇到了麻烦,并在我的问题中发布了更多我实例化我的平台的地方 - 首先我实际上并没有生成我的平台,只是将它们出列修改并将它们入队,所以我不知道为什么这个位置不会'不能设置。此外,由于我的向上向量始终是原始位置,而向下在 y 轴上总是低 2,所以我不知道我会将这些新的 scriptName.up 或 .down 向量设置为什么。还是不明白,真的需要帮助
  • 嗨@skyguy - 你真的应该勾选这个很好的答案,然后提出一个新问题。你的问题得到了真正的回答。
猜你喜欢
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 2018-10-09
  • 1970-01-01
  • 2014-11-19
相关资源
最近更新 更多