You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Float列表获取最大值及索引并在Unity中绘制圆形

完善Unity圆形绘制与半径最大值查找逻辑

我来帮你把这段代码补全,实现从Float类型列表中找出最大值及其索引,再基于这个最大半径在Unity中绘制圆形的完整功能。下面是补全后的代码和关键逻辑说明:

完整代码实现

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

[RequireComponent(typeof(LineRenderer))]
public class DrawCircle : MonoBehaviour
{
    [Range(0, 50)] public int segments = 50;
    [Range(0, 50)] public float xradius = 5;
    [Range(0, 50)] public float yradius = 5;
    public bool minimumRequireRadius = false;
    public float minRadiusThreshold = 1f; // 当启用minimumRequireRadius时的最小半径值

    LineRenderer line;
    private List<float> radiusList = new List<float>();

    void Start()
    {
        // 初始化LineRenderer组件
        line = GetComponent<LineRenderer>();
        // 收集半径数据到列表中(示例:收集子物体的缩放X值作为半径)
        HighestRadius(transform);
        
        // 查找最大值及其索引
        if(radiusList.Count > 0)
        {
            float highestRadius = radiusList.Max();
            int highestRadiusIndex = radiusList.IndexOf(highestRadius);
            
            Debug.Log($"找到最大半径: {highestRadius},对应的索引: {highestRadiusIndex}");

            // 应用最大半径到圆形参数
            ApplyHighestRadius(highestRadius);
            // 绘制圆形
            DrawCircleShape();
        }
        else
        {
            Debug.LogWarning("radiusList为空,无法查找最大半径");
            // 如果列表为空,使用默认参数绘制圆形
            DrawCircleShape();
        }
    }

    // 示例:收集子物体的缩放值作为半径数据,你可以根据需求修改此方法
    void HighestRadius(Transform parentTransform)
    {
        foreach(Transform child in parentTransform)
        {
            // 这里以子物体的X轴缩放值作为半径示例,可替换为你的数据来源
            radiusList.Add(child.localScale.x);
            // 递归处理子物体的子物体
            HighestRadius(child);
        }
    }

    // 将最大半径应用到圆形的x/y半径参数
    void ApplyHighestRadius(float targetRadius)
    {
        // 如果启用了最小半径限制,确保半径不小于阈值
        if(minimumRequireRadius)
        {
            targetRadius = Mathf.Max(targetRadius, minRadiusThreshold);
        }
        
        xradius = targetRadius;
        yradius = targetRadius; // 如果要画正圆,让x和y半径相等
        // 如果需要椭圆,可以单独设置x和y,比如xradius = targetRadius * 1.5f;
    }

    // 使用LineRenderer绘制圆形/椭圆
    void DrawCircleShape()
    {
        line.positionCount = segments + 1;
        line.useWorldSpace = false;

        float angle = 0f;
        for(int i = 0; i < segments + 1; i++)
        {
            // 计算每个点的坐标
            float x = Mathf.Sin(Mathf.Deg2Rad * angle) * xradius;
            float y = Mathf.Cos(Mathf.Deg2Rad * angle) * yradius;
            line.SetPosition(i, new Vector3(x, y, 0));
            
            // 递增角度,完成一圈360度
            angle += (360f / segments);
        }
    }
}

关键逻辑说明

  • 最大值与索引查找:

    • 用radiusList.Max()获取列表中的最大值,加了Count > 0的判断避免空列表报错
    • 用radiusList.IndexOf(highestRadius)获取最大值第一次出现的索引,如果有多个相同最大值,只会返回第一个的位置
  • 圆形绘制逻辑:

    • 通过LineRenderer的positionCount设置点的数量,segments值越高,圆形边缘越平滑
    • 利用三角函数Mathf.Sin和Mathf.Cos计算每个角度对应的坐标,完成360度的闭环绘制
    • useWorldSpace = false让圆形基于物体自身坐标系绘制,方便后续调整物体位置来移动圆形
  • 最小半径限制:

    • 当minimumRequireRadius启用时,通过Mathf.Max确保最终半径不小于minRadiusThreshold,避免绘制出过小甚至不可见的圆形

内容的提问来源于stack exchange,提问作者Daniel Lip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:54:23