簡體   English   中英

如何修復使用LineRenderer制作的不完美圓?

[英]How can I fix this imperfect circle I made using LineRenderer?

因此,我制作了此形狀,並通過以下腳本將其應用於精靈:

using UnityEngine;
using System.Collections;

public class CircleShapeGenerator : MonoBehaviour
{
    public int segments = 100;
    public float radius = 1;

    public Color c1 = new Color( 1, 1, 1, 0.1f );
    public Color c2 = new Color( 1, 1, 1, 0.1f );

    LineRenderer line;

    void Start ()
    {
        line = gameObject.AddComponent<LineRenderer>();

        line.material = new Material(Shader.Find("Particles/Additive"));
        line.SetWidth(0.05F, 0.05F);
        line.SetVertexCount (segments + 1);
        line.useWorldSpace = false;
    }
    void Update()
    {
        line.SetColors(c1, c2);

        float angle = 20f;

        for (int i = 0; i < (segments + 1); i++)
        {
            float x = Mathf.Sin (Mathf.Deg2Rad * angle) * radius;
            float y = Mathf.Cos (Mathf.Deg2Rad * angle) * radius;

            line.SetPosition( i, new Vector3( x,y,0) );

            angle += (360f / segments);
        }
    }
}

正如您在屏幕截圖中所看到的,起點和終點未按應有的方式連接。 我怎樣才能解決這個問題? 我在整個互聯網上都找到了這段代碼,但是所有人都給出了這個結果。 有人可以解決此問題或提供樣條解決方案嗎? 我認為使用Shader解決方案(使用Shader的0經驗)過於刻板。

在此處輸入圖片說明

該解決方案可能有點復雜。 但這會起作用。
這個想法是

1)將第一個線段繪制為小分段區域。
2)從幾秒鍾到最后的-1段作為大段進行繪制。
3)也將最后一個段繪制為小段區域。

它使起點和終點之間具有無縫的邊緣。 而且細分市場的總數並不太多。

total segment = segment + 2 * subsegment

這是示例代碼。

using UnityEngine;
using System.Collections;

public class CircleShapeGenerator : MonoBehaviour {

    public int segments = 100;
    public int edgeSegments = 10;
    public float radius = 1f; 

    int vertCount;
    float increAngle, increAngleEdge;

    public Color c1 = new Color( 1, 1, 1, 1f );
    public Color c2 = new Color( 1, 1, 1, 1f );

    LineRenderer line;

    void Start ()
    {
        vertCount = segments + 2*edgeSegments - 2 + 1;
        increAngle = 360f / segments;
        increAngleEdge = increAngle/edgeSegments;

        line = gameObject.AddComponent<LineRenderer>();

        line.material = new Material(Shader.Find("Particles/Additive"));
        line.SetWidth(0.05F, 0.05F);
        line.SetVertexCount (vertCount);
        line.useWorldSpace = false;
    }

    void Update()
    {
        line.SetColors(c1, c2);

        //draw first segment
        float angle = 0;
        for (int i = 0; i < edgeSegments; i++)
        {
            float x = Mathf.Sin (Mathf.Deg2Rad * angle) * radius;
            float y = Mathf.Cos (Mathf.Deg2Rad * angle) * radius;

            line.SetPosition( i, new Vector3(x, y, 0) );
            angle += increAngleEdge;
        }

        //draw from seconds to last-1  segment
        angle -= increAngleEdge;
        for (int i = 0; i < segments-2; i++)
        {
            angle += increAngle;

            float x = Mathf.Sin (Mathf.Deg2Rad * angle) * radius;
            float y = Mathf.Cos (Mathf.Deg2Rad * angle) * radius;

            line.SetPosition( edgeSegments + i, new Vector3(x, y, 0) );
        }

        //draw last segment
        for (int i = 0; i < edgeSegments+1; i++)
        {
            angle += increAngleEdge;

            float x = Mathf.Sin (Mathf.Deg2Rad * angle) * radius;
            float y = Mathf.Cos (Mathf.Deg2Rad * angle) * radius;

            line.SetPosition( edgeSegments + segments - 2 + i, new Vector3(x, y, 0) );
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM