为什么 itween 动画似乎比声明花费更多时间并防止延迟 Destroy()
Why itween animations seem to take more time than declared and prevent delayed Destroy()
我有这个代码:
void OnCollisionEnter (Collision collision)
{
if (canCollide == true) {
canCollide = false;
ContactPoint contactPoint = collision.contacts [0];
GameObject cube = GameObject.CreatePrimitive (PrimitiveType.Cube);
cube.transform.localScale = new Vector3 (5, 5, 5);
cube.transform.position = contactPoint.point;
iTween.MoveTo (cube, iTween.Hash (
"y", 40,
"time", 0.5));
iTween.MoveTo (cube, iTween.Hash (
"position", new Vector3 (55, 79, 10),
"time", 0.5f,
"delay", 0.5f,
"oncompletetarget", GameObject.Find ("PlayerCar"),
"oncomplete", "IncrementGauge"));
Destroy (cube, 1.1f);
}
}
这工作正常,两个动画都是按顺序的。但是时间总和应该是1秒。但是Destroy()不能延迟1秒,至少要1.1秒。为什么?我能否以某种方式更快地销毁立方体并仍然触发 IncrementGauge()(销毁 1 秒,防止触发 IncrementGauge())。
谢谢。
发生这种情况是因为 iTween 库会在每次更新调用中检查是否已经过了 1.0 秒,这不能恰好是 1.0 秒,因为它取决于您的帧率并且浮点算法不精确。
您的问题可以通过销毁立方体并在相同的回调方法 DestroyCubeAndIncrementGauge() 中递增仪表来解决,该回调方法作为字符串传递到参数oncomplete
。
public class CollisionObject : MonoBehaviour
{
[SerializeField]
private bool canCollide = true;
void OnCollisionEnter(Collision collision)
{
if (canCollide == true) {
canCollide = false;
ContactPoint contactPoint = collision.contacts [0];
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.localScale = new Vector3(5, 5, 5);
cube.transform.position = contactPoint.point;
iTween.MoveTo(cube, iTween.Hash(
"y", 40,
"time", 0.5));
iTween.MoveTo(cube, iTween.Hash(
"position", new Vector3 (55, 79, 10),
"time", 0.5f,
"delay", 0.5f,
"oncompletetarget", this.gameObject,
"oncompleteparams", cube,
"oncomplete", "DestroyCubeAndIncrementGauge"
));
}
}
public void DestroyCubeAndIncrementGauge(GameObject cube)
{
// destroy the cube
Destroy(cube);
// inform the PlayerCar to IncrementGauge
GameObject.Find("PlayerCar").SendMessage("IncrementGauge");
}
}
我有这个代码:
void OnCollisionEnter (Collision collision)
{
if (canCollide == true) {
canCollide = false;
ContactPoint contactPoint = collision.contacts [0];
GameObject cube = GameObject.CreatePrimitive (PrimitiveType.Cube);
cube.transform.localScale = new Vector3 (5, 5, 5);
cube.transform.position = contactPoint.point;
iTween.MoveTo (cube, iTween.Hash (
"y", 40,
"time", 0.5));
iTween.MoveTo (cube, iTween.Hash (
"position", new Vector3 (55, 79, 10),
"time", 0.5f,
"delay", 0.5f,
"oncompletetarget", GameObject.Find ("PlayerCar"),
"oncomplete", "IncrementGauge"));
Destroy (cube, 1.1f);
}
}
这工作正常,两个动画都是按顺序的。但是时间总和应该是1秒。但是Destroy()不能延迟1秒,至少要1.1秒。为什么?我能否以某种方式更快地销毁立方体并仍然触发 IncrementGauge()(销毁 1 秒,防止触发 IncrementGauge())。
谢谢。
发生这种情况是因为 iTween 库会在每次更新调用中检查是否已经过了 1.0 秒,这不能恰好是 1.0 秒,因为它取决于您的帧率并且浮点算法不精确。
您的问题可以通过销毁立方体并在相同的回调方法 DestroyCubeAndIncrementGauge() 中递增仪表来解决,该回调方法作为字符串传递到参数oncomplete
。
public class CollisionObject : MonoBehaviour
{
[SerializeField]
private bool canCollide = true;
void OnCollisionEnter(Collision collision)
{
if (canCollide == true) {
canCollide = false;
ContactPoint contactPoint = collision.contacts [0];
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.localScale = new Vector3(5, 5, 5);
cube.transform.position = contactPoint.point;
iTween.MoveTo(cube, iTween.Hash(
"y", 40,
"time", 0.5));
iTween.MoveTo(cube, iTween.Hash(
"position", new Vector3 (55, 79, 10),
"time", 0.5f,
"delay", 0.5f,
"oncompletetarget", this.gameObject,
"oncompleteparams", cube,
"oncomplete", "DestroyCubeAndIncrementGauge"
));
}
}
public void DestroyCubeAndIncrementGauge(GameObject cube)
{
// destroy the cube
Destroy(cube);
// inform the PlayerCar to IncrementGauge
GameObject.Find("PlayerCar").SendMessage("IncrementGauge");
}
}