如何从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让圆形基于物体自身坐标系绘制,方便后续调整物体位置来移动圆形
- 通过LineRenderer的
最小半径限制:
- 当
minimumRequireRadius启用时,通过Mathf.Max确保最终半径不小于minRadiusThreshold,避免绘制出过小甚至不可见的圆形
- 当
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

