我正在尝试为生成的平台预制件设置动画(平台对象本身在空,因为它的位置发生变化)当Runner对象与它碰撞时(onCollisonEnter)和碰撞退出时UP。
我已逐字逐句地回答了我的旧问题的答案 - 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实现此效果?是否有可能达到我想要的效果?
ERROR:
编辑:
我如何产生(出列然后入队)我的平台:
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);
由于平台实际上并未产生,您确定错误是什么?你能救我吗?
答案 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);