zoukankan      html  css  js  c++  java
  • (三)平面圆形

    概述

    由于基础篇已经比较详细,此篇只贴代码。

    平面圆形代码

    圆形也是由三角形组成的,三角形个数越多则越园。

    基类

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    [RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))]
    public class CreateMeshBase : MonoBehaviour
    {
        MeshFilter meshFilter;
    
        protected Mesh mesh;
    
        protected virtual Vector3[] Vertices { get; }
        protected virtual int[] Triangles { get; }
        protected virtual Vector3[] Normals { get; }
        protected virtual Vector2[] Uvs { get; }
        protected virtual string MeshName { get; }
    
        protected virtual void Start()
        {
            GetMeshFilter();
        }
    
        protected virtual void Reset()
        {
            GetMeshFilter();
        }
    
        protected virtual void OnValidate()
        {
            GetMeshFilter();
        }
    
        void GetMeshFilter()
        {
            if (meshFilter == null)
            {
                meshFilter = GetComponent<MeshFilter>();
                mesh = new Mesh();            
            }
    
            mesh.triangles = null;
            mesh.uv = null;
            mesh.vertices = null;
    
            mesh.name = MeshName;
            mesh.vertices = Vertices;
            mesh.triangles = Triangles;
            mesh.uv = Uvs;
    
            meshFilter.mesh = mesh;
        }
    
        private void OnDrawGizmos()
        {
            if (Vertices == null) return;
    
            Gizmos.color = Color.red;
            Gizmos.DrawSphere(Vector3.zero, 0.5f);
    
            Gizmos.color = Color.blue;
    
            for (int i = 0; i < Vertices.Length; i++)
            {
                Gizmos.DrawSphere(Vertices[i], 0.3f);
            }
        }
    }
    
    

    圆形网格

    其中triCount控制三角形个数,radius控制圆大小。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class CreateCircle : CreateMeshBase
    {
        [Range(3,100)]
        public int triCount = 6;
        public float radius = 5;
        public bool showHalf = false;
    
        protected override string MeshName
        {
            get
            {
                return "Circle Mesh";
            }
        }
    
        protected override Vector3[] Vertices
        {
            get
            {
                Vector3[] vertices = new Vector3[triCount + 1];
                vertices[0] = Vector3.zero;
                float angleDelta = 2 * Mathf.PI / triCount;
    
                for (int i = 0; i < triCount; i++)
                {
                    float angle = angleDelta * i;
                    float x = radius * Mathf.Cos(angle);
                    float y = radius * Mathf.Sin(angle);
    
                    vertices[i + 1] = new Vector3(x, y, 0);
                }
    
                return vertices;
            }
        }
    
        protected override int[] Triangles
        {
            get
            {
                int[] triangles = new int[triCount * 3];
    
                for (int i = 0; i < triCount; i++)
                {
                    if (showHalf)
                    {
                        if (i % 2 == 0) continue;
                    }
    
                    triangles[i * 3] = 0;
                    triangles[i * 3 + 2] = i + 1;
    
                    if (i + 2 > triCount)
                    {
                        triangles[i * 3 + 1] = 1;
                    }else
                    {
                        triangles[i * 3 + 1] = i + 2;
                    }
                }
                return triangles;
            }
        }
    
        protected override Vector2[] Uvs
        {
            get
            {
                Vector2[] uvs = new Vector2[triCount + 1];
                uvs[0] = new Vector2(0.5f,0.5f);
                float angleDelta = 2 * Mathf.PI / triCount;
    
                for (int i = 0; i < triCount; i++)
                {
                    float angle = angleDelta * i;
                    float x = Mathf.Cos(angle) * 0.5f + 0.5f;
                    float y = Mathf.Sin(angle) * 0.5f + 0.5f;
    
                    uvs[i + 1] = new Vector2(x, y);
                }
                return uvs;
            }
        }
    }
    
    
  • 相关阅读:
    oracle 主键自动地址实现
    解构赋值
    那些朋友那些话系列
    那些朋友那些话
    白鹭记事
    该如何存在
    上海秋季HCC小记
    For the person you never see again
    寻城记
    2013年的国庆
  • 原文地址:https://www.cnblogs.com/llstart-new0201/p/12253053.html
Copyright © 2011-2022 走看看