当我将此脚本附加到对象上时,它会在周围绘制一个圆。现在,我想让脚本的线渲染器附加到一个空游戏对象上,该游戏对象将是绘制圆形的对象的子级。
我希望这样做是为了能够拖动空游戏对象并更改圆的高度。这样我就可以简单地复制空游戏对象并有两个圆,一个在地面上,一个在较高位置。两个圆都将以相同的半径围绕父对象,而父对象将成为中心。
我希望这样做是为了能够拖动空游戏对象并更改圆的高度。这样我就可以简单地复制空游戏对象并有两个圆,一个在地面上,一个在较高位置。两个圆都将以相同的半径围绕父对象,而父对象将成为中心。
using UnityEngine;
using System.Collections;
using System;
[ExecuteAlways]
[RequireComponent(typeof(LineRenderer))]
public class DrawRadiusAroundTurret : MonoBehaviour
{
[Range(1, 50)] public int segments = 50;
[Range(1, 5)] public float xRadius = 5;
[Range(1, 5)] public float yRadius = 5;
[Range(0.1f, 5f)] public float width = 0.1f;
public bool controlBothXradiusYradius = false;
public bool draw = true;
[SerializeField] private LineRenderer line;
private void Start()
{
if (!line) line = GetComponent<LineRenderer>();
CreatePoints();
}
public void CreatePoints()
{
line.enabled = true;
line.widthMultiplier = width;
line.useWorldSpace = false;
line.widthMultiplier = width;
line.positionCount = segments + 1;
float x;
float y;
var angle = 20f;
var points = new Vector3[segments + 1];
for (int i = 0; i < segments + 1; i++)
{
x = Mathf.Sin(Mathf.Deg2Rad * angle) * xRadius;
y = Mathf.Cos(Mathf.Deg2Rad * angle) * yRadius;
points[i] = new Vector3(x, 0f, y);
angle += (380f / segments);
}
// it's way more efficient to do this in one go!
line.SetPositions(points);
}
#if UNITY_EDITOR
private float prevXRadius, prevYRadius;
private int prevSegments;
private float prevWidth;
private void OnValidate()
{
// Can't set up our line if the user hasn't connected it yet.
if (!line) line = GetComponent<LineRenderer>();
if (!line) return;
if (!draw)
{
// instead simply disable the component
line.enabled = false;
}
else
{
// Otherwise re-enable the component
// This will simply re-use the previously created points
line.enabled = true;
if (xRadius != prevXRadius || yRadius != prevYRadius || segments != prevSegments || width != prevWidth)
{
CreatePoints();
// Cache our most recently used values.
prevXRadius = xRadius;
prevYRadius = yRadius;
prevSegments = segments;
prevWidth = width;
}
if (controlBothXradiusYradius)
{
yRadius = xRadius;
}
}
}
#endif
}
主要目标是在导弹炮塔周围拥有多个圆圈,但我可以通过简单拖动来更改圆圈的高度。
LineRenderer
或甚至是环面更有效,因为它们将遵守transform
层次结构。 - 3Dave