Unity3d 使用IEnumerator生成扩展方法

Unity3d 使用IEnumerator生成扩展方法,unity3d,scripting,extension-methods,quaternions,Unity3d,Scripting,Extension Methods,Quaternions,大家好,我想做一个扩展方法,基本上可以让你们做统一的旋转函数,但你们可以选择执行的时间,每次调用例程时增加值。 示例:transform.Rotate(90,0,0,秒,用于转换) 这是我写的代码 public static class RotateMeExtensions{ public static IEnumerator MoveObject(this Transform source, int x,int y, int z, float overTime) { Quate

大家好,我想做一个扩展方法,基本上可以让你们做统一的旋转函数,但你们可以选择执行的时间,每次调用例程时增加值。 示例:
transform.Rotate(90,0,0,秒,用于转换)

这是我写的代码

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;

}
公共静态类扩展{
公共静态IEnumerator MoveObject(此转换源,
整数x,整数y,整数z,浮点超时)
{
四元数目标=新四元数();
浮点a=震源旋转x+x;
浮动b=源旋转y+y;
浮点数c=震源旋转z+z;
target.eulerAngles=新矢量3(a、b、c);
浮动开始时间=Time.Time;
while(Time.Time
现在我用一个按钮用户界面来调用它,但是在我第一次使用它之后,它就不再工作了,eulerangles保持在90,7。我想每次增加90度。
再见

我不确定它是否可以直接作为一个扩展,但是如果你把它变成一个简单的函数(在四元数之前没有“this”),你可以做以下事情

  • 在函数onTiggerEnter上,只需调用start例程(RotateMeExtensions.MoveObject(“填充变量”)
如果你真的想作为一个扩展创建一个像你一样的伪函数,那么它唯一要做的就是调用一个全局单行为协程,然后你传递另一个函数

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;
}
publicstaticvoidmoveobject(这个四元数源,int x,int y,int z,float超时)
{
globalMonoBehavior.instance.start例程(moveObjectCorroutine(source,x,y,z,超时));
}
公共静态IEnumerator MoveObjectCoroutine(四元数源、int x、int y、int z、浮点超时)
{
四元数目标=新四元数();
Vector3 tempV=新Vector3(source.eulerAngles.x+x,
source.eulerAngles.y+y,source.eulerAngles.z+z);
target.eulerAngles=tempV;
浮动开始时间=Time.Time;
while(Time.Time

希望有帮助

我会发布答案,这样也许对其他人有用。 问题是我用了

 transform.rotation.x 
相反,我应该使用

transform.rotation.eulerAngles.x

在哪个名称空间中它是GblobalMonobehavior?在我的ideia中,它只是一个连接到常规对象的MonoBehavior,并且有一个公共静态变量,像singleton一样指向它自己的实例。问题是,它必须是一个MonoBehavior实例,因为如果不是,它将不会运行coroutineHak you,现在我知道如何使用它进行扩展静态和单例。:)那么,枚举器以本机方式与扩展一起工作?它是这样命名的-transform.MoveObject(10,10,10,10)?是:
start例程(transform.MoveObject(0,0,90,1))
。我遇到的唯一问题是当您递增第一个参数时。您应该在函数外部递增,然后将其分配给扩展方法。
float a=source.rotation.x;