[英]Unity3d, script for moving along x-axis
我寫了一個 X 軸移動的腳本。 如果 Input.GetKeyDown("left") (存在此類的對象),則從 Update() 中的另一個腳本調用它。
但是為什么它在構建和編輯器中的工作速度不同呢? 它是否取決於 Time.deltaTime?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveToSpecifiedAbscissa : MonoBehaviour
{
[SerializeField] private float AbscissaOfTheDestinantion;
[SerializeField] private int Frequency;
[SerializeField] private float Waiting;
private float DisplacementByAbscissa;
private bool IsMovingNow = false;
public float GetTimeOfTheMoving()
{
return Waiting * (float)(Frequency);
}
public bool GetBoolVariableWhichSaysIfItIsMovingNow()
{
return IsMovingNow;
}
public void SetAbscissaOfTheDestinantion(float AbscissaToSave)
{
AbscissaOfTheDestinantion = AbscissaToSave;
}
private void Start()
{
DisplacementByAbscissa = AbscissaOfTheDestinantion - transform.position.x;
}
private IEnumerator MoveAbstractly(int frequency, float waiting)
{
IsMovingNow = true;
for (int i = 0; i < frequency; i++)
{
transform.position += new Vector3(DisplacementByAbscissa * (1 / (float)(frequency)), 0, 0);
yield return new WaitForSeconds(waiting);
}
IsMovingNow = false;
StopCoroutine(MoveAbstractly(frequency, waiting));
}
public void Move()
{
StartCoroutine(MoveAbstractly(Frequency, Waiting));
}
}
這可能是因為您在另一個腳本中使用了Update()
,該腳本的調用或多或少取決於當前的幀速率。 (每個新幀調用一次更新)您可以嘗試通過FixedUpdate()
調用您的運動,因為它將被頻繁調用並且不依賴於 FrameRate。 我希望能解決你的問題! :)
在轉換中使用時間增量總是安全的。 正如 Pretzl 已經提到的,如果您從另一個腳本的 Update 方法調用 Move 方法,您將根據當前幀速率調用 Move 方法,這將導致對象在不同運行時的速度偏差。
順便說一句,在調用方法 WaitForSeconds() 時,時間上可能會有小的偏差。 當程序在協程中等待下一次迭代時,我猜你應該根據時間增量計算差異。 這將是安全的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.