Unity 在一个圆内尽量均匀的随机生成位置

生成随机位置

1.分析

在一个随机生成位置,还要尽量均匀
在这里我们可以以圆心为原点,然后展开一个坐标系,我们可以把圆分成4部分,也就是四个象限。
在这里插入图片描述
然后我们就只需要在这个四个范围内依次生成位置就好啦。
具体如何实现呢?

2.代码

int count = 100;//生成点的个数
        //四个区域的单位顶点
        Vector2[] allArea = { new Vector2(1, 1), new Vector2(1, -1), new Vector2(-1, 1), new Vector2(-1, -1) };
        List<Vector2> allPos = new List<Vector2>();//存储生成的位置
        for(int i=0;i<count;i++)
        {
            Vector2 pos = Random.insideUnitCircle;//随机一个圆内的位置出来

            float x = Mathf.Abs(pos.x);//把随机出来的位置固定到第一象限
            float y = Mathf.Abs(pos.y);

            int index = i % allArea.Length;//计算allArea的下标
            Vector2 point = new Vector2(x, y) * allArea[index];//确定这个点所在的区域
            allPos.Add(point);//把点存起来
        }

这样我们就尽量均匀的吧点随机生成到圆内
下面我们来看效果

在这里插入图片描述
我们可以看到相对还是比较均匀的

我们再来看看生成四个点的效果
1.这个是没有处理过的,标红的是中心点
在这里插入图片描述

2.这个是处理过的标红的是中心点

在这里插入图片描述

3.小结

其实不这样处理也可以比较均匀的随机在圆里面,这样处理的好处就是我们可以保证每一块区域生成的点比其他区域最多差一个。生成点的个数越少就越可以体现出来这个算法的优势。所以还是看个人需求,一般没有特殊要求的话光一个Random.insideUnitCircle;也足够了。
谢谢大家!

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 创建一个UI物体,比如一个圆形的Image组件。 2. 创建一个脚本,挂在UI物体上,用于控制UI物体的移动。 3. 在脚本中,定义一个圆形的范围,可以用一个圆形碰撞体来表示。 4. 在Update函数中,随机生成一个点,判断该点是否在圆形范围内,如果在,则将UI物体移动到该点。 5. 使用Vector2.MoveTowards函数将UI物体移动到目标点,控制移动速度。 6. 在脚本中可以设置移动速度、圆形范围大小等参数,根据需求进行调整。 下面是一个示例代码: ``` using UnityEngine; using UnityEngine.UI; public class RandomMove : MonoBehaviour { public float moveSpeed = 50f; //移动速度 public float circleRadius = 100f; //圆形范围半径 private Vector3 targetPosition; //目标位置 private CircleCollider2D circleCollider; //圆形碰撞体 private void Start() { circleCollider = GetComponent<CircleCollider2D>(); } private void Update() { //生成随机位置 Vector3 randomPosition = new Vector3(Random.Range(-circleRadius, circleRadius), Random.Range(-circleRadius, circleRadius), transform.position.z); //判断随机位置是否在圆形范围内 if (circleCollider.bounds.Contains(randomPosition)) { targetPosition = randomPosition; } //移动到目标位置 transform.position = Vector2.MoveTowards(transform.position, targetPosition, moveSpeed * Time.deltaTime); } private void OnDrawGizmosSelected() { //绘制圆形范围 Gizmos.color = Color.green; Gizmos.DrawWireSphere(transform.position, circleRadius); } } ``` 将该脚本挂在UI物体上,即可实现UI物体在圆形范围内进行随机移动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不敲注释的呆呆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值