主要用到了unity中的LineRenderer组件
using UnityEngine;
public class CircleLineRenderer : MonoBehaviour
{
private LineRenderer lineRenderer;
public float radiusMultiplier = 1f;
public int vertexCount = 100;
public Color circleColor = Color.white;
private void Start()
{
lineRenderer = GetComponent<LineRenderer>();
if (lineRenderer == null)
{
lineRenderer = gameObject.AddComponent<LineRenderer>();
}
lineRenderer.loop = false;
lineRenderer.startWidth = 0.05f;
lineRenderer.endWidth = 0.05f;
}
private void Update()
{
SetCircle();
}
private void SetCircle()
{
float radius = CalculateRadius();
lineRenderer.positionCount = vertexCount + 1;
Vector3[] positions = new Vector3[vertexCount + 1];
Vector3 objectPlaneNormal = transform.up;
Vector3 objectPlanePosition = transform.position;
for (int i = 0; i < vertexCount; i++)
{
float angle = i * (2 * Mathf.PI / vertexCount);
float xPos = radius * Mathf.Cos(angle);
float zPos = radius * Mathf.Sin(angle);
Vector3 vertexPosition = objectPlanePosition + transform.rotation * new Vector3(xPos, 0f, zPos);
Vector3 projectedPosition = ProjectPointOnPlane(vertexPosition, objectPlanePosition, objectPlaneNormal);
positions[i] = projectedPosition;
}
positions[vertexCount] = positions[0];
lineRenderer.SetPositions(positions);
// 设置LineRenderer的材质颜色
lineRenderer.material.color = circleColor;
}
//将圆环的顶点位置投影到物体所在平面,以解决视角变化时的误差问题。
private Vector3 ProjectPointOnPlane(Vector3 point, Vector3 planePosition, Vector3 planeNormal)
{
Vector3 vector = point - planePosition;
float distance = Vector3.Dot(vector, planeNormal);
return point - distance * planeNormal;
}
//计算半径
private float CalculateRadius()
{
Vector3 objectScale = transform.localScale;
float maxScale = Mathf.Max(objectScale.x, objectScale.y, objectScale.z);
float radius = maxScale * radiusMultiplier;
return radius;
}
}
直接挂载到需要移动的物体上面就行了.
最后大概就是这个样子,圆环的颜色可以自己调节