当前位置: 首页 > 编程语言 > C#

如何在不留空隙的情况下为线条渲染器形状设置动画分享

时间:2023-04-10 14:28:02 C#

C#LearningTutorial:Howtoanimatealinerenderershapewithoutleavingagap对于大于3的点(三角形等),第一个和最后一个点不会像其他点那样闭合形状。1.我怎样才能关闭一个超过3个点的形状而没有任何可见的间隙?2.如何为形状设置动画,以便在特定持续时间内绘制线条(可能使用协程)?publicclassCircleDrawing:MonoBehaviour{[Tooltip("圆的半径,以世界单位测量。")]publicfloatRadius=2;[Tooltip("圆的顶点数。")]publicintPoints=5;[Tooltip("圆的颜色。")]publicColorColor;私有LineRendererlineRenderer;publicvoidAwake(){lineRenderer=gameObject.AddComponent();lineRenderer.material=newMaterial(Shader.Find("Sprites/Default"));lineRenderer.material.color=颜色;lineRenderer.startWidth=lineRenderer.endWidth=0.5f;lineRenderer.positionCount=Points+1;//+1关闭形状Draw();}privatevoidDraw(){floatangle=0f;for(inti=0;i<=Points;i++){floatx=Radius*Mathf.Cos(angle)+transform.position.x;floaty=Radius*Mathf.Sin(angle)+transform.position.y;lineRenderer.SetPosition(i,newVector3(x,y,0.01f));//Z稍微落后于paddle所以它绘制前角+=(2f*Mathf.PI)/Points;}}privatevoidOnDestroy(){Destroy(lineRenderer.material);如果您确保LineRenderer的最后一个点与第一个点相同,您应该始终通过运行这样的for循环来关闭任何给定的形状for(inti=0;i(所以除了最后一个点之外的每个点一个,也是)。然后使用lineRenderer.SetPosition(Point-1,lineRenderer.GetPosition(0));关闭形状lineRenderer.SetPosition(Point-1,lineRenderer.GetPosition(0));当for循环结束时。注意数组从0开始,这就是为什么Point-1是lineRenderer的最后一个点。对于动画,我不知道有什么简单的方法。我会做的是使用协程将每个点移动到它的最终目的地。对于例如,您首先添加第一个点,然后在第一个点之上添加第二个点。然后您将第二个点(在协同程序中随着时间的推移)移动到其最终位置(使用SetPosition移动它)。当它到达最终位置时位置,在其顶部添加第三个点,并将其移动到最终位置。重复每个点。第一个(可能很明显)解决方案是在LineRenderer上设置循环选项。然而,在许多情况下,这似乎并不能提供视觉上令人愉悦的结果。我会像这样解决问题,它提供了很好的视觉效果:lineRenderer.positionCount=Points+2;//+2关闭形状并再创建一块以延伸到间隙上。并且:for(inti=0;i绘制完整的形状,然后创建另一个形状,从头开始循环。这可能感觉不优雅,但它很简单,看起来和我想象的一模一样。至于动画,尝试这样的事情:使用UnityEngine;使用系统集合;公共类CircleDrawing:MonoBehaviour{publicfloatRadius=2f;publicint点=5;公共颜色Color=Color.red;publicfloatDrawSpeed=1f;私有LineRendererlineRenderer;私人浮动进度;//[0..1]动画值。publicvoidAwake(){lineRenderer=gameObject.AddComponent();lineRenderer.material=newMaterial(Shader.Find("Sprites/Default"));lineRenderer.material.color=颜色;lineRenderer.startWidth=lineRenderer.endWidth=0.5f;lineRenderer.positionCount=Points+2;//+2关闭形状并再创建一块以延伸到间隙上。进度=0;StartCoroutine(绘制());}privatevoidUpdate_Disabled()//常规Update()循环{floatangle=0f;对于(inti=0;i=1)done=true;//done检查可以更好地处理,但是已经晚了。浮动角度=0f;for(inti=0;i你基本上拥有了一切,现在通过动画你已经使用的值来动画。当然,实现不同效果的方法有很多种,但大多都是将动画进度值应用到绘图的不同参数上。您可以使用协程或仅使用常规Update()循环,如示例中所示。我希望这会有所帮助;)所以我的想法是添加一个将顶点连接到顶点的线渲染器。下面的解决方案是一个立方体,但我添加了一个额外的顶点,它很好。我唯一无法测试的是循环设置,因为我使用的是5.5...我认为它有效...另外,我没有通过任何材料,我想你已经通过了。以上就是C#学习教程:如何动画化线条渲染器的形状而不留空隙。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注---usingSystem.Collections.Generic;使用统一引擎;公共类测试:MonoBehaviour{[SerializeField]privatefloatstep=0.5f;//它绘制的速度有多快privateListvertices=null;私有LineRenderer行=null;privatevoidStart(){//这创建了一个正方形this.vertices=newList(){newVector3(-1,-1,0),newVector3(1,-1,0),newVector3(1,1,0),新Vector3(-1,1,0)};StartCoroutine(绘制());}privateIEnumeratorDraw(){intindex=1;intvertexPos=1;//使用2个顶点设置LineRenderer基础知识this.line=this.gameObject.AddComponent();this.line.startWidth=this.line.endWidth=0.1f;this.line.numPositions=2;//将两个点设置在相同的起始位置this.line.SetPosition(0,this.vertices[0]);this.line.SetPosition(1,this.vertices[0]);Vector3temp=this.vertices[0];//获取当前顶点位置Vector3目标=this.vertices[索引];//获取目标顶点位置while(true){//将当前pos移动到目标postemp=Vector3.MoveTowards(temp,target,Time.deltaTime*this.step);this.line.SetPosition(vertexPos,temp);//是否达到目标if(temp==target){//这是关闭形状时的最终运行//这意味着我们达到目标并且索引为0所以形状结束//中断协程if(index==0){this.line.loop=true;//无法在5.5yieldbreak上测试这个;}//将LineRenderer大小增加1vertexPos++;this.line.numPositions++;//将新的顶点放在之前的位置this.line.SetPosition(vertexPos,temp);//增加索引并检查我们是否到达顶点列表的末尾//如果顶点列表结束,那么我们使用第一个关闭if(++index==this.vertices.Count){index=0;}//设置新目标target=this.vertices[index];}yieldreturnnull;}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: