使用IEnumerator创建扩展方法

时间:2015-10-07 10:28:56

标签: unity3d scripting extension-methods quaternions

大家好,我正在尝试制作一个扩展方法,它必须让你做单位的旋转功能,但你可以选择执行的时间,并在每次调用例程时递增值。 示例:transform.Rotate(90,0,0, SecondsInWichMakeTheTransition);

这是我写的代码。

public static class RotateMeExtensions{

 public  static IEnumerator MoveObject(this Transform source, 
int x,int y, int z, float overTime)
{
    Quaternion target = new Quaternion();

    float a = source.rotation.x + x;
    float b = source.rotation.y + y;
    float c = source.rotation.z + z;

    target.eulerAngles = new Vector3(a, b, c);

    float startTime = Time.time;

    while(Time.time < startTime + overTime)
    {
        source.rotation = Quaternion.Lerp(source.rotation, target, (Time.time - startTime)/overTime);

        yield return null;
    }
    source.rotation = target;

}

现在我用Button UI调用它,但在我第一次使用它之后,它再也无法工作了,eulerangles保持在90,7。我希望每次增加90度。 再见你再见

2 个答案:

答案 0 :(得分:1)

我不确定它是否可以作为扩展名直接使用但是如果你把它作为一个简单的函数(在Quaternion之前没有“this”)你可以做以下

  • 在函数OnTriggerEnter上调用StartCoroutine(RotateMeExtensions.MoveObject(“填充变量”));

如果你真的想要作为一个扩展来创建像你这样的虚拟函数,它唯一能做的就是调用全局Monobehaviour Coroutine并传递其他函数。像

这样的东西
public  static void MoveObject(this Quaternion source, int x,int y, int z, float overTime)
{
    GlobalMonoBehaviour.instance.StartCoroutine(MoveObjectCoroutine(source, x, y, z, overTime));
}

public  static IEnumerator MoveObjectCoroutine(Quaternion source, int x,int y, int z, float overTime)
{
    Quaternion target = new Quaternion();
    Vector3 tempV = new Vector3(source.eulerAngles.x + x,
                            source.eulerAngles.y + y, source.eulerAngles.z + z);

    target.eulerAngles = tempV;

    float startTime = Time.time;
    while(Time.time < startTime + overTime)
    {
        source = Quaternion.Lerp(source, target, (Time.time - startTime)/overTime);

        yield return null;
    }
    source = target;
}

希望有所帮助

答案 1 :(得分:1)

我会发布答案,所以也许对其他人有用。 问题是我用过  transform.rotation.x 相反,我应该使用 transform.rotation.eulerAngles.x