天天看點

unity3d 繪制 技能攻擊範圍 扇形/圓環

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

//必須要挂載到有<meshFilter>的物體上

//同一個物體隻有一個mesh,繪制不同的mesh要分到不同的物體上

public class DrawPlayerIndicator : MonoBehaviour

{

    public float Radius = 0.3f;                //外圈的半徑

    public float Thickness = 0.05f;             //厚度,外圈半徑減去内圈半徑

    public float Depth = 1.0f;                  //厚度

    public float NumberOfSides = 60.0f;         //由多少個面組成

    public float DrawArchDegrees = 360.0f;       //要繪畫多長

    public Material archMaterial = null;

    private List<Vector3> vertexList = new List<Vector3>();

    private List<int> triangleList = new List<int>();

    private List<Vector2> uvList = new List<Vector2>();

    // Start is called before the first frame update

    void Start()

    {

        GenerateVertex();

    }

    void GenerateVertex()

    {

        //頂點坐标

        vertexList.Clear();

        float incrementAngle = DrawArchDegrees / NumberOfSides;

        //小于等于是因為n+1條線才能組成n個面

        for (int i = 0; i <= NumberOfSides; i++)

        {

            float angle = 180 - i * incrementAngle;

            float innerX = (Radius - Thickness) * Mathf.Cos(angle * Mathf.Deg2Rad);

            float innerZ = (Radius - Thickness) * Mathf.Sin(angle * Mathf.Deg2Rad);

            vertexList.Add(new Vector3(innerX, 0, innerZ));

            float outsideX = Radius * Mathf.Cos(angle * Mathf.Deg2Rad);

            float outsideZ = Radius * Mathf.Sin(angle * Mathf.Deg2Rad);

            vertexList.Add(new Vector3(outsideX, 0, outsideZ));

        }

        //三角形索引

        triangleList.Clear();

        int direction = 1;

        for (int i = 0; i < NumberOfSides * 2; i++)

        {

            int[] triangleIndexs = getTriangleIndexs(i, direction);

            direction *= -1;

            for (int j = 0; j < triangleIndexs.Length; j++)

            {

                triangleList.Add(triangleIndexs[j]);

            }

        }

        //UV索引

        uvList.Clear();

        for (int i = 0; i <= NumberOfSides; i++)

        {

            float angle = 180 - i * incrementAngle;

            float littleX = (1.0f / NumberOfSides) * i;

            uvList.Add(new Vector2(littleX, 0));

            float bigX = (1.0f / NumberOfSides) * i;

            uvList.Add(new Vector2(bigX, 1));

        }

        Mesh mesh = new Mesh()

        {

            vertices = vertexList.ToArray(),

            uv = uvList.ToArray(),

            triangles = triangleList.ToArray(),

        };

        mesh.RecalculateNormals();

        gameObject.AddComponent<MeshFilter>().mesh = mesh;

        gameObject.AddComponent<MeshRenderer>().material = archMaterial;

    }

    int[] getTriangleIndexs(int index, int direction)

    {

        int[] triangleIndexs = new int[3] { 0, 1, 2 };

        for (int i = 0; i < triangleIndexs.Length; i++)

        {

            triangleIndexs[i] += index;

        }

        if (direction == -1)

        {

            int temp = triangleIndexs[0];

            triangleIndexs[0] = triangleIndexs[2];

            triangleIndexs[2] = temp;

        }

        return triangleIndexs;

    }

    //繪制圓環

    void Update()

    {

        //ToDrawSectorSolid(transform, transform.localPosition, 60, 3);

    }

}

繼續閱讀