【问题标题】:How can I set random positions on radius?如何在半径上设置随机位置?
【发布时间】:2020-07-25 07:57:25
【问题描述】:

在这个脚本中,我正在创建一个具有特定半径大小的圆并获取半径大小:

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(LineRenderer))]
public class DrawRadiusAroundTurret : MonoBehaviour
{
    [Range(0, 50)]
    public int segments = 50;
    [Range(0, 5)]
    public float xradius = 5;
    [Range(0, 5)]
    public float yradius = 5;
    [Range(0.1f, 5f)]
    public float width = 0.1f;
    LineRenderer line;

    void Start()
    {
        line = gameObject.GetComponent<LineRenderer>();

        line.enabled = true;
        line.positionCount = segments + 1;
        line.widthMultiplier = width;
        line.useWorldSpace = false;
        CreatePoints();
    }

    private void Update()
    {
        CreatePoints();
    }

    public Vector3[] CreatePoints()
    {
        line.widthMultiplier = width;

        float x;
        float y;
        float z;

        float angle = 20f;

        for (int i = 0; i < (segments + 1); i++)
        {
            x = Mathf.Sin(Mathf.Deg2Rad * angle) * xradius;
            y = Mathf.Cos(Mathf.Deg2Rad * angle) * yradius;

            line.SetPosition(i, new Vector3(x, 0f, y));

            angle += (380f / segments);
        }

        var positions = new Vector3[line.positionCount];

        return positions;
    }
}

在这个脚本中,我有这个方法,我希望在半径边缘位置上随机设置最后一个点:

private void GeneratePointsInTracks()
    {
        var startPoints = GameObject.FindGameObjectsWithTag("Start Point");
        var curvedLines = GameObject.FindGameObjectsWithTag("Curved Line");

        for (int i = 0; i < startPoints.Length; i++)
        {
            for (int x = 0; x < numberOfPointsInTrack; x++)
            {
                GameObject go = Instantiate(tracksPrefab, curvedLines[i].transform);
                go.name = "Point In Track";
                go.transform.position = turrent.position + new Vector3(Random.Range(-100f, 100f), Random.Range(-100f, 100f), Random.Range(-100f, 100f));

                if(x == numberOfPointsInTrack - 1)
                {
                    go.name = "Last Point In Track";

                    for(int y = 0; y < drawRadius.CreatePoints().Length; y++)
                    {
                        go.transform.position = new Vector3(Random.Range(0,1)[y].x,
                            drawRadius.CreatePoints()[y].y,
                            drawRadius.CreatePoints()[y].z);
                    }
                }
            }
        }
    }

我试过这个:

 go.transform.position = new Vector3(Random.Range(0,1)[y].x,
                                drawRadius.CreatePoints()[y].y,
                                drawRadius.CreatePoints()[y].z);

但是 x 上的随机给出错误:

无法将 [] 索引应用于“int”类型的表达式

第一个脚本创建一个像这样的圆圈:

这是我在绘画中绘制的一个示例,只是为了说明我所说的我希望第二个脚本中的 endPoints 随机定位在圆边缘上:

因此,每个“跟踪中的最后一个点”对象都应该像第二个屏幕截图一样随机放置在圆边缘上。

【问题讨论】:

  • Random.Range(0,1) 只是一个数字,不是一个集合,不要尝试用索引访问它y
  • 同样在第一个 sn-p 的末尾你会做var positions = new Vector3[line.positionCount]; return positions; 所以你总是返回一个向量为零的数组,这不是你想要的
  • 你想从你已经在 LineRenderer 中设置的位置中选择随机位置,还是只是在圆圈上随机位置?
  • @Pluto 我希望第二个脚本中的端点每个端点都位于第一个脚本的圆上的随机位置上。
  • @Pluto 我用底部的两张截图更新了我的问题,解释我的意思。

标签: c# unity3d


【解决方案1】:

如果你知道圆心和半径,就很容易在圆上得到随机点:

go.name = "Last Point In Track";
Vector2 p = Random.insideUnitCircle.normalized * radius;
go.transform.position = center + new Vector3(p.x, 0, p.y);

要摆脱 Random.insideUnitCircle 太小而无法标准化的边缘情况,您应该使用:

Vector2 RandomOnUnitCircle(){
    Vector2 result = Vector2.zero;
    do{
        result = Random.insideUnitCircle.normalized;
    }while(result == Vector2.zero);
    return result;
}

【讨论】:

  • 如何从第一个脚本 CreatePoints 返回或获取圆的半径和中心?
  • 在顶部的第二个脚本中,我添加了 public DrawRadiusAroundTurret drawRadius;所以我将能够从第一个脚本访问 CreatePoints 方法,但我不确定如何同时获得半径和中心。
  • 半径应该是drawRadius.xradius和中心drawRadius.transform.position,如果你的游戏对象周围有一个圆圈,并附有DrawRadiusAroundTurret脚本。
【解决方案2】:

我想你想要的是这样的:

Vector3[] points = drawRadius.CreatePoints(); //get all edge points
Vector3 randomPoint = points[Random.Range(0, points.Length)]; //pick a random one

go.transform.position = randomPoint; //set go.transform.position to position of random point

对不起,如果我误解了你的意图,但我希望这对你有用!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    相关资源
    最近更新 更多