首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >统一中对象的动态变化速度

统一中对象的动态变化速度
EN

Stack Overflow用户
提问于 2017-07-26 05:39:51
回答 3查看 910关注 0票数 2

我需要一个物体根据动态的时间来上下移动。确切的位置存储在一个名为Timings的List()中。这将包含排序条目,如0.90 1.895 2.64 3.98.这些时间是相对的音乐播放,所以他们可以比较TheMusic.time。(TheMusic是我的AudioSource)

现在(请参阅下面的代码),它正在使用moveSpeed静态地上下移动。我怎样才能做到这一点,这样就可以在预定义的时间到达顶部和底部了?当它到达时间列表的末尾时,移动应该停止。

代码语言:javascript
复制
public class Patrol : MonoBehaviour {

    public Transform[] patrolPoints;  //contains top and bottom position
    public float moveSpeed; //needs to be changed dynamically

    private int currentPoint; 

    // Initialization
    void Start () {
        transform.position = patrolPoints [0].position;
        currentPoint = 0;
    }

    // Update is called once per frame
    void Update () {

        print (currentPoint);
        if (currentPoint >= patrolPoints.Length) {
            currentPoint = 0;
        }

        if (transform.position == patrolPoints [currentPoint].position) {
            currentPoint++;
        }

        transform.position = Vector3.MoveTowards (transform.position, patrolPoints[currentPoint].position, moveSpeed * Time.deltaTime);

    }
}

重要的是,绝不能偏离绝对时间点。当时间达到一个很高的时间,比如1009时,就不会有太多的偏差。

还请注意,其他事情(如更改颜色和检查用户行为)需要同时发生,请参阅我的其他问题

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-09 12:37:40

您的解决方案的路径是答案,它显示了随着时间推移移动GameObject的函数。

有了这个函数,您就可以在包含ListbeatsTimer上启动一个coroutine循环。在每个循环中,您应该有一个变量,用于确定在每个循环之后是向上还是下行。在我的示例中,我将该变量命名为upDownMoveDecider。这个变量将决定使用patrolPoints数组的哪个索引。(我假设索引和1只有两个点)。

另外,每次都可以在for循环中调用for函数。确保对其进行yield,以便它在进入下一个函数之前等待moveToX函数完成或返回。

以下是应该是什么样子:

代码语言:javascript
复制
public Transform[] patrolPoints;  //contains top and bottom position
List<float> beatsTimer = new List<float>();
public Transform objectToMove;

void Start()
{
    //For testing purposes
    beatsTimer.Add(0.90f);
    beatsTimer.Add(1.895f);
    beatsTimer.Add(2.64f);
    beatsTimer.Add(3.98f);

    //Start the moveobject
    StartCoroutine(beginToMove());
}

IEnumerator beginToMove()
{
    // 0 = move up, 1 = move down
    int upDownMoveDecider = 0;

    //Loop through the timers
    for (int i = 0; i < beatsTimer.Count; i++)
    {
        if (upDownMoveDecider == 0)
        {
            //Move up
            Debug.Log("Moving Up with time: " + beatsTimer[i] + " in index: " + i);
            //Start Moving and wait here until move is complete(moveToX returns)
            yield return StartCoroutine(moveToX(objectToMove, patrolPoints[upDownMoveDecider].position, beatsTimer[i]));

            //Change direction to 1 for next move
            upDownMoveDecider = 1;
        }
        else
        {
            //Move down
            Debug.Log("Moving Down with time: " + beatsTimer[i] + " in index: " + i);
            //Start Moving and wait here until move is complete(moveToX returns)
            yield return StartCoroutine(moveToX(objectToMove, patrolPoints[upDownMoveDecider].position, beatsTimer[i]));

            //Change direction to 0 for next move
            upDownMoveDecider = 0;
        }
    }
}

IEnumerator moveToX(Transform fromPosition, Vector3 toPosition, float duration)
{
    float counter = 0;

    //Get the current position of the object to be moved
    Vector3 startPos = fromPosition.position;

    while (counter < duration)
    {
        counter += Time.deltaTime;
        fromPosition.position = Vector3.Lerp(startPos, toPosition, counter / duration);
        yield return null;
    }
}

for循环中的代码很长,但更容易理解。下面是没有if/else语句的较短版本。

代码语言:javascript
复制
//Loop through the timers
for (int i = 0; i < beatsTimer.Count; i++)
{
    //Move up/Down depening on the upDownMoveDecider variable
    string upDown = (upDownMoveDecider == 0) ? "Up" : "Down";
    Debug.Log("Moving " + upDown + " with time: " + beatsTimer[i] + " in index: " + i);

    //Start Moving and wait here until move is complete(moveToX returns)
    yield return StartCoroutine(moveToX(objectToMove, patrolPoints[upDownMoveDecider].position, beatsTimer[i]));

    //Change direction
    upDownMoveDecider = (upDownMoveDecider == 1) ? 0 : 1;
}
票数 0
EN

Stack Overflow用户

发布于 2017-07-26 06:13:57

添加一个浮点数数组,比如public float[] moveSpeedArray;

可以根据需要在Start()或编辑器中填充此数组。

您已经获得并更新了currentPoint

将该currentPoint作为moveSpeedArray的索引。

就像;

代码语言:javascript
复制
transform.position = Vector3.MoveTowards (transform.position, patrolPoints[currentPoint].position, moveSpeedArray[currentPoint] * Time.deltaTime);

因此,您可以将对象移动到不同预定义时间的位置。

希望这能有所帮助!干杯!

票数 1
EN

Stack Overflow用户

发布于 2017-07-26 08:51:11

别重新发明轮子。使用图文库,例如iTween。有超过20种宽松类型为您定义:

示例代码:

代码语言:javascript
复制
iTween.MoveBy(gameObject,iTween.Hash(
 "x"   , 2,
 "time", 0.2f
));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45318281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档