如何在统一3d中的指定时间内执行任务?

时间:2014-05-02 05:44:58

标签: unity3d

Cocos2D 中,我使用了很多动作,例如CCMove,CCRotate,CCEaseIn,CCScale等。

您可以观察到所有这些操作都有一个参数,例如指定的时间间隔。例如,如果我使用位于(0,0)的位置(100,100)的CCMoveTo和5秒的时间,那么它将在5秒内移动节点。

假设我将位置更改为(10,10),然后它也会在5秒内移动。我的意思是任务在一定的时间间隔内完成,无论距离移动,旋转量,比例或任何任务是什么。

现在团结一致,我只想为Unity提供所有这些实用工具。我想为所有这些编写实用程序类。在这种情况下,我对使用Time.deltatime感到有点困惑。

请提供您在一定时间间隔内执行任何任务的一般建议。如果您有,请提供任何代码示例。

1 个答案:

答案 0 :(得分:0)

据我所知,没有像你想要的任何内置功能。<​​/ p>

我一直在使用我在自己的Unity游戏中创建的一个类,以帮助我将一个值更改为另一个值。我称之为 SmoothStepHelper ,我会在这里发布代码;也许它会帮助你!

class SmoothStepHelper {
    var startTime:float;
    var endTime:float;
    var duration:float;

    function GetPercentage () : float {
        return (Time.time - startTime) / duration;
    }

    static function CreateWithDuration (newDuration:float) : SmoothStepHelper {
        var helper:SmoothStepHelper = new SmoothStepHelper();
        helper.duration = newDuration;
        helper.startTime = Time.time;
        helper.endTime = helper.startTime + helper.duration;
        return helper;
    }

    function IsDone () : boolean {
        return Time.time >= endTime;
    }
}

因此,如果您想顺利地将值从A更改为B,请尝试以下操作:

var positionA:Vector3 = Vector3(0,0,0);
var positionB:Vector3 = Vector3(0,0,100);
var duration:float = 5;
var ssh:SmoothStepHelper;

function Start () {
    ssh = SmoothStepHelper.CreateWithDuration(duration);
}

function Update () {
    var smoothStep:float = Mathf.SmoothStep(0f, 1f, ssh.GetPercentage());
    transform.position = Vector3.Lerp(positionA, positionB, smoothStep);
    if (ssh.IsDone()) {
        // The 5 seconds has completed, do something else here
    }
}

我原来的答案,其中我误解了这个问题:

我发现使用Invoke方法效果很好。

例如,假设您想在对象开始后5秒更改对象的位置:

var foo:float = 10;

function Start () {
    Invoke('MoveOver', 5);
}

function MoveOver () {
    transform.position.x += foo;
}