C# 以1的速度将对象旋转0到90度,然后以1的速度c等待90到0度#

C# 以1的速度将对象旋转0到90度,然后以1的速度c等待90到0度#,c#,unity3d,C#,Unity3d,我想以1速度-->将对象旋转0到90度,然后等待3秒-->然后以1速度-->再次旋转90到0度,然后等待3秒 我需要上面的循环过程 我很成功,但它的启动功能只工作了1次 在更新功能中,它不工作 下面是我的启动功能代码 IEnumerator Start() { StartCoroutine( RotateMe1(Vector3.forward * 90f, 1f)); yield return new WaitForSeconds(3); StartCoroutine(R

我想以1速度-->将对象旋转0到90度,然后等待3秒-->然后以1速度-->再次旋转90到0度,然后等待3秒

我需要上面的循环过程

我很成功,但它的启动功能只工作了1次

在更新功能中,它不工作

下面是我的启动功能代码

IEnumerator Start()
{
    StartCoroutine( RotateMe1(Vector3.forward * 90f, 1f));
    yield return new WaitForSeconds(3);
    StartCoroutine(RotateMe2(Vector3.forward * 0f, 1f));
    yield return new WaitForSeconds(3);
}

IEnumerator RotateMe1(Vector3 byAngles1, float inTime1)
{
    var fromAngle1 = transform.rotation;
    var toAngle1 = Quaternion.Euler(transform.eulerAngles + byAngles1);
    for (var t = 0f; t < 1; t += Time.deltaTime / inTime1)
    {
        transform.rotation = Quaternion.Lerp(fromAngle1, toAngle1, t);
        yield return null;
    }
}

IEnumerator RotateMe2(Vector3 byAngles2, float inTime2)
{
    var fromAngle2 = transform.rotation;
    var toAngle2 = Quaternion.Euler(transform.eulerAngles + byAngles2);
    for (var t = 0f; t < 1; t += Time.deltaTime / inTime2)
    {
        transform.rotation = Quaternion.Lerp(fromAngle2, toAngle2, t);
        yield return null;
    }
}
void Update()
{
    StartCoroutine(RotateMe1(Vector3.forward * 90f, 1f));
    StartCoroutine(Wait());
    StartCoroutine(RotateMe2(Vector3.forward * 0f, 1f));
    StartCoroutine(Wait());
}

IEnumerator RotateMe1(Vector3 byAngles1, float inTime1)
{
    var fromAngle1 = transform.rotation;
    var toAngle1 = Quaternion.Euler(transform.eulerAngles + byAngles1);
    for (var t = 0f; t < 1; t += Time.deltaTime / inTime1)
    {
        transform.rotation = Quaternion.Lerp(fromAngle1, toAngle1, t);
        yield return null;
    }
}

IEnumerator RotateMe2(Vector3 byAngles2, float inTime2)
{
    var fromAngle2 = transform.rotation;
    var toAngle2 = Quaternion.Euler(transform.eulerAngles + byAngles2);
    for (var t = 0f; t < 1; t += Time.deltaTime / inTime2)
    {
        transform.rotation = Quaternion.Lerp(fromAngle2, toAngle2, t);
        yield return null;
    }
}

IEnumerator Wait()
{
    yield return new WaitForSeconds(3);
}
IEnumerator Start()
{
start例程(RotateMe1(Vector3.forward*90f,1f));
产生返回新WaitForSeconds(3);
start例程(RotateMe2(矢量3.forward*0f,1f));
产生返回新WaitForSeconds(3);
}
IEnumerator RotateMe1(矢量3按角度1,浮动起始1)
{
var fromAngle1=变换旋转;
var toAngle1=四元数.Euler(transform.eulerAngles+byAngles1);
对于(变量t=0f;t<1;t+=Time.deltaTime/inTime1)
{
transform.rotation=Quaternion.Lerp(从角度1到角度1,t);
收益返回空;
}
}
IEnumerator RotateMe2(矢量3按角度2,浮动初始值2)
{
var fromAngle2=变换旋转;
var toAngle2=四元数.Euler(transform.eulerAngles+byAngles2);
对于(变量t=0f;t<1;t+=Time.deltaTime/inTime2)
{
transform.rotation=Quaternion.Lerp(从角度2到角度2,t);
收益返回空;
}
}
下面是我的更新功能代码

IEnumerator Start()
{
    StartCoroutine( RotateMe1(Vector3.forward * 90f, 1f));
    yield return new WaitForSeconds(3);
    StartCoroutine(RotateMe2(Vector3.forward * 0f, 1f));
    yield return new WaitForSeconds(3);
}

IEnumerator RotateMe1(Vector3 byAngles1, float inTime1)
{
    var fromAngle1 = transform.rotation;
    var toAngle1 = Quaternion.Euler(transform.eulerAngles + byAngles1);
    for (var t = 0f; t < 1; t += Time.deltaTime / inTime1)
    {
        transform.rotation = Quaternion.Lerp(fromAngle1, toAngle1, t);
        yield return null;
    }
}

IEnumerator RotateMe2(Vector3 byAngles2, float inTime2)
{
    var fromAngle2 = transform.rotation;
    var toAngle2 = Quaternion.Euler(transform.eulerAngles + byAngles2);
    for (var t = 0f; t < 1; t += Time.deltaTime / inTime2)
    {
        transform.rotation = Quaternion.Lerp(fromAngle2, toAngle2, t);
        yield return null;
    }
}
void Update()
{
    StartCoroutine(RotateMe1(Vector3.forward * 90f, 1f));
    StartCoroutine(Wait());
    StartCoroutine(RotateMe2(Vector3.forward * 0f, 1f));
    StartCoroutine(Wait());
}

IEnumerator RotateMe1(Vector3 byAngles1, float inTime1)
{
    var fromAngle1 = transform.rotation;
    var toAngle1 = Quaternion.Euler(transform.eulerAngles + byAngles1);
    for (var t = 0f; t < 1; t += Time.deltaTime / inTime1)
    {
        transform.rotation = Quaternion.Lerp(fromAngle1, toAngle1, t);
        yield return null;
    }
}

IEnumerator RotateMe2(Vector3 byAngles2, float inTime2)
{
    var fromAngle2 = transform.rotation;
    var toAngle2 = Quaternion.Euler(transform.eulerAngles + byAngles2);
    for (var t = 0f; t < 1; t += Time.deltaTime / inTime2)
    {
        transform.rotation = Quaternion.Lerp(fromAngle2, toAngle2, t);
        yield return null;
    }
}

IEnumerator Wait()
{
    yield return new WaitForSeconds(3);
}
void Update()
{
start例程(RotateMe1(Vector3.forward*90f,1f));
start例程(Wait());
start例程(RotateMe2(矢量3.forward*0f,1f));
start例程(Wait());
}
IEnumerator RotateMe1(矢量3按角度1,浮动起始1)
{
var fromAngle1=变换旋转;
var toAngle1=四元数.Euler(transform.eulerAngles+byAngles1);
对于(变量t=0f;t<1;t+=Time.deltaTime/inTime1)
{
transform.rotation=Quaternion.Lerp(从角度1到角度1,t);
收益返回空;
}
}
IEnumerator RotateMe2(矢量3按角度2,浮动初始值2)
{
var fromAngle2=变换旋转;
var toAngle2=四元数.Euler(transform.eulerAngles+byAngles2);
对于(变量t=0f;t<1;t+=Time.deltaTime/inTime2)
{
transform.rotation=Quaternion.Lerp(从角度2到角度2,t);
收益返回空;
}
}
IEnumerator Wait()
{
产生返回新WaitForSeconds(3);
}

我附加上述脚本斧头在附加上述视频


请帮帮我,现在发生的是,你正在开始破坏每一帧,而不是等待一帧结束。这会导致数百甚至数千个协程试图同时修改对象旋转。抱歉,您不能在更新功能中等待。您可以尝试使用
boolean
变量,但协程用于完成这类工作

如果你想让它永远旋转,把它放在一个while循环中

void Start()
{
    StartCoroutine(rotateForever());
}

IEnumerator rotateForever()
{
    while (true)
    {
        StartCoroutine(RotateMe1(Vector3.forward * 90f, 1f));
        yield return new WaitForSeconds(3);
        StartCoroutine(RotateMe2(Vector3.forward * 0f, 1f));
        yield return new WaitForSeconds(3);
    }
}
您可以优化RotateForver函数:

IEnumerator rotateForever()
{
    WaitForSeconds waitTime = new WaitForSeconds(3);
    while (true)
    {
        StartCoroutine(RotateMe1(Vector3.forward * 90f, 1f));
        yield return waitTime;
        StartCoroutine(RotateMe2(Vector3.forward * 0f, 1f));
        yield return waitTime;
    }
}

发生的事情是,你正在开始破坏每一帧,而不是等待一个完成。这会导致数百甚至数千个协程试图同时修改对象旋转。抱歉,您不能在更新功能中等待。您可以尝试使用
boolean
变量,但协程用于完成这类工作

如果你想让它永远旋转,把它放在一个while循环中

void Start()
{
    StartCoroutine(rotateForever());
}

IEnumerator rotateForever()
{
    while (true)
    {
        StartCoroutine(RotateMe1(Vector3.forward * 90f, 1f));
        yield return new WaitForSeconds(3);
        StartCoroutine(RotateMe2(Vector3.forward * 0f, 1f));
        yield return new WaitForSeconds(3);
    }
}
您可以优化RotateForver函数:

IEnumerator rotateForever()
{
    WaitForSeconds waitTime = new WaitForSeconds(3);
    while (true)
    {
        StartCoroutine(RotateMe1(Vector3.forward * 90f, 1f));
        yield return waitTime;
        StartCoroutine(RotateMe2(Vector3.forward * 0f, 1f));
        yield return waitTime;
    }
}

您可以使用一个协同程序来完成这项工作,请改用它。 基本上是这样

void Start()
{
    StartCoroutine(RotateMe(Vector3.forward * 90f, 1f));
}

IEnumerator RotateMe(Vector3 byAngles1, float inTime1)
{
    while (true)
    {
        var fromAngle1 = transform.rotation;
        var toAngle1 = Quaternion.Euler(transform.eulerAngles + byAngles1);
        for (var t = 0f; t < 1; t += Time.deltaTime / inTime1)
        {
            transform.rotation = Quaternion.Lerp(fromAngle1, toAngle1, t);
            yield return null;
        }
        yield return new WaitForSeconds(3);
        byAngles1 *= -1;
    }
}
void Start()
{
start例程(RotateMe(矢量3.forward*90f,1f));
}
IEnumerator RotateMe(矢量3按角度1,浮动起始1)
{
while(true)
{
var fromAngle1=变换旋转;
var toAngle1=四元数.Euler(transform.eulerAngles+byAngles1);
对于(变量t=0f;t<1;t+=Time.deltaTime/inTime1)
{
transform.rotation=Quaternion.Lerp(从角度1到角度1,t);
收益返回空;
}
产生返回新WaitForSeconds(3);
byAngles1*=-1;
}
}

您可以使用单个协同程序来完成此工作,请改用它。 基本上是这样

void Start()
{
    StartCoroutine(RotateMe(Vector3.forward * 90f, 1f));
}

IEnumerator RotateMe(Vector3 byAngles1, float inTime1)
{
    while (true)
    {
        var fromAngle1 = transform.rotation;
        var toAngle1 = Quaternion.Euler(transform.eulerAngles + byAngles1);
        for (var t = 0f; t < 1; t += Time.deltaTime / inTime1)
        {
            transform.rotation = Quaternion.Lerp(fromAngle1, toAngle1, t);
            yield return null;
        }
        yield return new WaitForSeconds(3);
        byAngles1 *= -1;
    }
}
void Start()
{
start例程(RotateMe(矢量3.forward*90f,1f));
}
IEnumerator RotateMe(矢量3按角度1,浮动起始1)
{
while(true)
{
var fromAngle1=变换旋转;
var toAngle1=四元数.Euler(transform.eulerAngles+byAngles1);
对于(变量t=0f;t<1;t+=Time.deltaTime/inTime1)
{
transform.rotation=Quaternion.Lerp(从角度1到角度1,t);
收益返回空;
}
产生返回新WaitForSeconds(3);
byAngles1*=-1;
}
}

“在更新功能中它不工作”确定,那么为什么不发布不工作的更新功能版本呢?在使用时,请解释“不工作”。其工作原理与启动功能不同。我上传了那个问题的视频,检查一下,一点也不好。您希望在等待最后3秒钟后再次重复吗?永远重复?是的,我需要永远重复“在更新函数中它不工作”好的,那么为什么不发布不工作的更新函数版本呢?在使用时,请解释“不工作”。其工作原理与启动功能不同。我上传了那个问题的视频,检查一下,一点也不好。您希望在等待最后3秒钟后再次重复吗?永远重复?是的,我需要永远重复。当我将(Vector3.forward*90f,1f))更改为(Vector3.forward*90f,2f)时,我还有一个问题。它在80度左右旋转,然后回来。如果您想确保在等待之前完成所有旋转,请将所有
start例程…
更改为
yield return start例程…
当我将(Vector3.forward*90f,1f))更改为(Vector3.forward*90f,2f)时,我又遇到了一个问题。它在80度左右旋转,然后回来。如果你想确保所有的r