簡體   English   中英

unity3d,沿x軸移動的腳本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM