C# 如何在统一的两点之间移动对象?
我试图使用unity的C# 如何在统一的两点之间移动对象?,c#,unity3d,C#,Unity3d,我试图使用unity的lerp功能将一个棋子上下翻译。但是,每当我触发此脚本时,整个会话都会冻结 使用unity调试器,我已将问题缩小到这段代码 do { float distCovered = (Time.time - startTime) * speed; fracJourney = distCovered / journeyLength; Debug.Log(fracJourne
lerp
功能将一个棋子上下翻译。但是,每当我触发此脚本时,整个会话都会冻结
使用unity调试器,我已将问题缩小到这段代码
do
{
float distCovered = (Time.time - startTime) * speed;
fracJourney = distCovered / journeyLength;
Debug.Log(fracJourney);
transform.position = Vector3.Lerp(startPoint, endPoint, speed);
} while (fracJourney <= 1);
do
{
float distCovered=(Time.Time-startTime)*速度;
FractJourney=距离覆盖/行程长度;
Debug.Log(fractjourney);
transform.position=Vector3.Lerp(起点、终点、速度);
}然而(p你这里有不止一个问题
第一个是在lerp函数中使用循环。在循环完成之前,游戏不会更新渲染输出。不管循环是否无限,它不会只执行一次迭代,它会执行所有迭代(这也无助于时间。时间在这个过程中不会改变)
第二个问题是,计算移动的距离是从应用程序开始到当前移动开始的距离
第三,调用Vector3.lerp(),将第三个参数(“浮点百分比”)传递给它,其值为speed
,而不是应该计算的小数量。例如Vector3.lerp(startPoint,endPoint,0.5f);
将返回startPoint
和endPoint
之间的中点
第四,没有理由使用四种方法来渲染动画。你只需要一种,但你也必须将其传递到所需的目的地(而不是使用四种表示不同目的地的方法)
第五,您正在计算journeyLength
作为起始点
和端点
之间的距离,尽管之前已经将端点
计算为起始点+距离
(这就是新向量3(0,0,50)
是一个距离!)我对c比较陌生,所以我将看看IEnumerator
和yield
但是,do循环本身不在Update()
例程中。它在Update()调用的子例程中
除非在这种情况下,这基本上算是同一件事。它算是同一件事啊,好了,现在开始工作了。是的,我现在明白了为什么我的代码只是令人震惊
public class MovePiece : MonoBehaviour {
Vector3 startPoint;
Vector3 endPoint;
float speed = 10;
float startTime;
private bool moving = false;
private bool up = false;
private bool across = false;
private bool down = false;
public void Start()
{
startPoint = gameObject.GetComponent<Transform>().position;
startTime = Time.time;
moving = true;
Debug.Log("Moving Piece");
}
void Update() {
if (!moving)
{
Destroy(this);
return;
}
moveManager();
}
void moveManager()
{
if (!up)
{
lerpUp();
return;
}
if (!across)
{
lerpAcross();
return;
}
if (!down)
{
lerpDown();
return;
}
}
private void lerpUp()
{
Debug.Log("Upwards");
startPoint = gameObject.GetComponent<Transform>().position;
endPoint = startPoint + new Vector3(0, 0, 50);
float journeyLength = Vector3.Distance(startPoint, endPoint);
float fracJourney;
do
{
float distCovered = (Time.time - startTime) * speed;
fracJourney = distCovered / journeyLength;
Debug.Log(fracJourney);
transform.position = Vector3.Lerp(startPoint, endPoint, speed);
} while (fracJourney <= 1);
up = true;
Debug.Log("Upwards Finished");
return;
}
private void lerpAcross()
{
Debug.Log("Across");
startPoint = gameObject.GetComponent<Transform>().position;
endPoint = startPoint + new Vector3(0, 50, 0);
float journeyLength = Vector3.Distance(startPoint, endPoint);
float fracJourney;
do
{
float distCovered = (Time.time - startTime) * speed;
fracJourney = distCovered / journeyLength;
transform.position = Vector3.Lerp(startPoint, endPoint, speed);
} while (fracJourney <= 1);
across = true;
Debug.Log("Across Finished");
return;
}
private void lerpDown()
{
Debug.Log("Down");
startPoint = gameObject.GetComponent<Transform>().position;
endPoint = startPoint + new Vector3(0, 0, -50);
float journeyLength = Vector3.Distance(startPoint, endPoint);
float fracJourney;
do
{
float distCovered = (Time.time - startTime) * speed;
fracJourney = distCovered / journeyLength;
transform.position = Vector3.Lerp(startPoint, endPoint, speed);
} while (fracJourney <= 1);
down = true;
Debug.Log("Down Finished");
moving = false;
Debug.Log("Moving Finished");
return;
}
}
}
do
{
float distCovered = (Time.time - startTime) * speed;
fracJourney = distCovered / journeyLength;
Debug.Log(fracJourney);
transform.position = Vector3.Lerp(startPoint, endPoint, speed);
} while (fracJourney <= 1);
public IEnumerator MyLoop()
{
while (fracJourney <= 1)
{
float distCovered = (Time.time - startTime) * speed;
fracJourney = distCovered / journeyLength;
Debug.Log(fracJourney);
transform.position = Vector3.Lerp(startPoint, endPoint, speed);
yield return null; //< --- yield out and let a frame pass
}
}