当前位置:   article > 正文

Unity+C# 正多边形点位创建_unity创建多边形

unity创建多边形

一,配置怪物轨迹位置长短不一,移动表现不理想,就写了个简单的正多边形点位生成工具。

二,代码功能三部分,根据边数和外切圆半径生成点位位置信息,根据定点数生成空物体,改名并赋值对应的点位位置信息,OnDrawGizmos方法里显示。

三,上代码。

using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 创建多边形,点位
/// 策划正多边形的点位工具
/// </summary>
public class CreatePolygonPoint : MonoBehaviour
{
    [SerializeField]
    private List<GameObject> points = new List<GameObject>();
    [Header("正多边形顶点数")]
    [Range(3,100)]
    public int pointCount;
    [Header("外切圆半径")]
    public float radius = 0.2f;    
    public bool openDrawGizmos = true;
#if UNITY_EDITOR    
    [ContextMenu ("CreatPathPoint")]
    public void CreatPathPoint()
    {
        if (points.Count >0)
        {
            for (int i = 0; i < points.Count; i++)
            {
                DestroyImmediate(points[i]);
            }
            points.Clear();
        }
        GetPath(pointCount, radius);
        for (int i = 0; i < pointCount; i++)
        {
            GameObject item = new GameObject("point_" + i);
            item.transform.SetParent(this .transform);
            float x, y;
            if (fixDic.ContainsKey (i))
            {
                x = fixDic[i].x;
                y = fixDic[i].y;            
                item.transform.localPosition = new Vector3(x, y, 0f);
            }            
            points.Add(item);
        }
    }
    Dictionary<int, Vector2> fixDic = new Dictionary<int, Vector2>();
    public void GetPath(float sides, float radius)
    {
        fixDic.Clear();
        int i = 0;
        float x, y, t;
        while (i < sides)
        {
            t = 360 * Mathf.Deg2Rad * i / sides;
            x = Mathf.Cos(t) * radius;
            y = Mathf.Sin(t) * radius;
            if (!fixDic.ContainsKey(i))
            {
                fixDic.Add(i, new Vector2(x, y));
            }
            i++;
        }
    }
    public void OnDrawGizmos()
    {
        if (openDrawGizmos)
        {
            Gizmos.color = Color.green;
            if (points.Count > 0)
            {
                for (int i = 0; i < points.Count; i++)
                {
                    if (i + 1 == points.Count)
                    {
                        Gizmos.DrawLine(points[i].transform .position , points[0].transform.position);
                    }
                    else
                    {
                        Gizmos.DrawLine(points[i].transform.position, points[i+1].transform.position);
                    }
                }
            }
            
        }
    }    
#endif 
}

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号