Unity 基础 之 一些物体形态生成方式整理(圆圈形式/圆圈螺旋形式/矩形区域/环形区域/球形区域等(随机)生成)
目录
Unity 基础 之 一些物体形态生成方式整理(圆圈形式/圆圈螺旋形式/矩形区域/环形区域/球形区域等(随机)生成)
一、简单介绍
Unity中的一些基础知识点。
本节简单整理了一些物体形态生成方法的整理,以方便学习使用,后期也会根据需要更新,如果你有新的方式也可以留言,多谢。
二、效果预览
三、关键代码
using UnityEngine;
namespace XANStudy {
public class TestRandomInstantiate : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Test();
}
void Test() {
// 圆圈生成
for (int angle = 0; angle < 360; angle+=30)
{
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
obj.GetComponent<Renderer>().material.color = Color.black;
//设置物体的位置Vector3三个参数分别代表x,y,z的坐标数
obj.transform.position = CirclePos(5, angle, Vector3.up * 10);
}
// 螺旋圆圈生成 原理 半径增加
float angleSpin = 0;
float radiuSpin = 2;
for (int i = 0; i < 50; i++, angleSpin += 20, radiuSpin += 0.1f)
{
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
obj.GetComponent<Renderer>().material.color = Color.cyan;
//设置物体的位置Vector3三个参数分别代表x,y,z的坐标数
obj.transform.position = CirclePos(radiuSpin, angleSpin, Vector3.up * 5);
}
// 矩形随机生成
for (int i = 0; i < 1000; i++)
{
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
obj.GetComponent<Renderer>().material.color = Color.white;
//设置物体的位置Vector3三个参数分别代表x,y,z的坐标数
obj.transform.position = RandomPos(-5, 5, -5, 5, -5, 5, Vector3.one * 10)
;
}
// 环形随机生成
for (int i = 0; i < 1000; i++)
{
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj.GetComponent<Renderer>().material.color = Color.red;
//设置物体的位置Vector3三个参数分别代表x,y,z的坐标数
obj.transform.position = RandomCirclePos(10,2, Vector3.zero)
;
}
// 球形随机生成
for (int i = 0; i < 1000; i++)
{
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Capsule);
obj.GetComponent<Renderer>().material.color = Color.yellow;
//设置物体的位置Vector3三个参数分别代表x,y,z的坐标数
obj.transform.position = RandomSpherePos(10, 2, Vector3.one * -10)
;
}
}
/// <summary>
/// 圆圈点位
/// </summary>
/// <param name="radius">半径</param>
/// <param name="angle">角度</param>
/// <param name="centerPos">基于点位</param>
/// <returns></returns>
Vector3 CirclePos(float radius, float angle, Vector3 centerPos)
{
// x = 原点x + 半径 * 邻边除以斜边的比例, 邻边除以斜边的比例 = cos(弧度) , 弧度 = 角度 *3.14f / 180f;
float x = radius * Mathf.Cos(angle * 3.14f / 180f);
float y = radius * Mathf.Sin(angle * 3.14f / 180f);
return new Vector3(x, 0, y) + centerPos;
}
/// <summary>
/// 随机矩形位置
/// </summary>
/// <param name="xMin"></param>
/// <param name="xMax"></param>
/// <param name="yMin"></param>
/// <param name="yMax"></param>
/// <param name="zMin"></param>
/// <param name="zMax"></param>
/// <param name="centerPos">基于位置</param>
/// <returns></returns>
Vector3 RandomPos(float xMin, float xMax, float yMin, float yMax, float zMin, float zMax, Vector3 centerPos)
{
return new Vector3(Random.Range(xMin, xMax), Random.Range(yMin, yMax), Random.Range(zMin, zMax))
+ centerPos;
}
/// <summary>
/// 环形随机位置
/// </summary>
/// <param name="innerRadius">内径</param>
/// <param name="toOutderadd">向外扩展的宽度</param>
/// <param name="centerPos">中心位置</param>
/// <returns></returns>
Vector3 RandomCirclePos(float innerRadius, float toOutderadd, Vector3 centerPos)
{
Vector2 p = Random.insideUnitCircle * toOutderadd;
Vector2 pos = p.normalized * (innerRadius + p.magnitude);
return new Vector3(pos.x, 0, pos.y) + centerPos;
}
/// <summary>
/// 球形随机位置
/// </summary>
/// <param name="innerRadius">内径</param>
/// <param name="toOutderadd">向外扩展的宽度</param>
/// <param name="centerPos">中心位置</param>
/// <returns></returns>
Vector3 RandomSpherePos(float innerRadius, float toOutderadd, Vector3 centerPos)
{
Vector3 p = Random.insideUnitSphere * toOutderadd;
Vector3 pos = p.normalized * (innerRadius + p.magnitude);
return pos + centerPos;
}
}
}