c#generic与流派有细微差别吗?请注意两个扩展名,一个用于float,一个用于Vector3。注意var(只是有点不同var(调用。这些可以在c#中写成泛型吗?我的问题的本质是:在泛型内容中,你能分析这种类型的性质吗?publicstaticIEnumeratorTweeng(thisfloatduration,System.Actionvary,floataa,floatzz){floatsT=Time.time;floateT=sT+duration;while(Time.timetransform.Eulers(0f,0f,t),0f,20f));//在0.75秒内淡入alphaStartCoroutine(.75f.Tweeng((u)=>{ca=u;s.color=c;},0f,1f));(如果你是UnityNewbie并且不熟悉扩展的基本概念,请参阅介绍。)如果你在调用var操作之前进行额外的Func执行转换(你应该重命名,因为var是C#关键字),你可以这样做).您可以采取以下一种方法:publicstaticIEnumeratorTweeng(thisfloatduration,System.ActionvarAction,Taa,Tzz){Functransform=MakeTransform();浮动sT=时间.时间;浮动eT=sT+持续时间;while(Time.timeMakeTransform(){if(typeof(T)==typeof(float)){Funcf=Mathf.SmoothStep;return(Func)(Delegate)f;}if(typeof(T)==typeof(Vector3)){Funcf=Vector3.Lerp;return(Func)(Delegate)f;}thrownewArgumentException("Unexpectedtype"+typeof(T));}它甚至可以内联完成:publicstaticIEnumeratorDasTweeng(thisfloatduration,System.Actionvary,Taa,Tzz){floatsT=Time.time;floateT=sT+duration;Func步骤;如果(typeof(T)==typeof(float))step=(Func)(Delegate)(Func)Mathf.SmoothStep;elseif(typeof(T)==typeof(Vector3))step=(Func)(Delegate)(Func)Vector3.Lerp;elsethrownewArgumentException("意外类型"+typeof(T));while(Time.time也许更自然的习语是Delegated;if(typeof(T)==typeof(float))d=(Func)Mathf.SmoothStep;elseif(typeof(T)==typeof(Vector3))d=(Func)Vector3.Lerp;elsethrownewArgumentException("意外类型"+typeof(T));Func步骤=(Func)d;您可以定义方法如下:publicstaticIEnumeratorTweeng(thisfloatduration,System.Actionvar,Taa,Tzz,Functhing){floatsT=Time.time;浮动eT=sT+持续时间;while(Time.timethenUseit:floata=5;floatb=0;floatc=0;a.Tweeng(q=>{},b,c,Mathf.SmoothStep);或者:floata=0;Vector3b=null;Vector3c=null;a.Tweeng(q=>{},b,c,Vector3.Lerp);或者,如果你想摆脱方法传递,你可以有简单的重载来处理它:publicstaticIEnumeratorTweeng(thisfloatduration,System.Actionvar,floataa,floatzz){returnTweeng(duration,var,aa,zz,Mathf.SmoothStep);}publicstaticIEnumeratorTweeng(thisfloatduration,System.Actionvar,Vector3aa,Vector3zz){returnTweeng(duration,var,aa,zz,Vector3.Lerp);}privatestaticIEnumeratorTweeng(thisfloatduration,System.Actionvar,Taa,Tzz,Functhing){浮点数T=时间.时间;浮动eT=sT+持续时间;while(Time.time然后使用它:floata=5;floatb=0;floatc=0;a.Tweeng(q=>{},b,c);或者:floata=0;Vector3b=null;Vector3c=null;a.Tweeng(q=>{},b,c);Stub方法在LINQPad中编译/不统一:publicclassMathf{publicstaticfloatSmoothStep(floataa,floatzz,floatt)=>0;}publicclassTime{publicstaticfloattime=>DateTime.Now.Ticks;}publicclassVector3{publicstaticVector3Lerp(Vector3aa,Vector3zz,floatt)=>null;}我喜欢Tweeng的东西,但是,如果协程只能用于MonoBehaviours,为什么要扩展浮点数?你应该为MonoBehaviours做扩展,例如我对插值进行了扩展:publicstaticvoid_Interpolate(thisMonoBehaviourmonoBehaviour,floatduration,Actioncallback,floatfrom,floatto,Interpolatorinterpolator){monoBehaviour.StartCoroutine(ExecuteInterpolation(interpolator,duration,callback,from,to));}所以我只是启动一个协程:privatestaticIEnumeratorExecuteInterpolation(Interpolatorinterpolator,floatduration,Action回调,浮动自,浮动至){floatsT=Time.time;浮动eT=sT+持续时间;布尔hasFinished=假;while(Time.timemylogicherewithcallback(to,false)yieldreturnnull;}hasFinished=true;callback(to,hasFinished);}请注意,我有一个布尔值指示插值已完成,这是因为依赖floatingpointcomparisonstocheckforendofthestreamisnotbestpractice,ifitroundstheresultforthemaximumresultin在最后一个之前,我们会有一个回调。最后一次调用两次以上是C#学习教程:是c#泛型和类型有细微的区别吗?全部内容分享,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注~本文收集自网络,确实不代表立场,如涉及侵权,请点右联系管理员删除,如需转载请注明出处: