unity 绘制圆环跟随物体移动

主要用到了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;
    }
}

直接挂载到需要移动的物体上面就行了.

最后大概就是这个样子,圆环的颜色可以自己调节

猜你喜欢

转载自blog.csdn.net/weixin_42301988/article/details/134670535