OldBlueWater/BlueWater/Assets/02.Scripts/Boids.cs

82 lines
2.8 KiB
C#
Raw Normal View History

using Sirenix.OdinInspector;
using UnityEngine;
using Random = UnityEngine.Random;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
public class Boids : MonoBehaviour
{
[Title("군집(떼) 설정")]
[Tooltip("Boid 프리팹")]
[SerializeField] private Boid boidPrefab;
[Range(1, 1000)]
[Tooltip("생성할 개체 수")]
[SerializeField] private int boidCount = 5;
[Range(5, 100)]
[Tooltip("개체 생성 범위")]
[SerializeField] private float spawnRange = 10;
[field: Tooltip("개체의 랜덤 속도 값\nx == Min\ny == Max")]
[field: SerializeField] public Vector2 RandomSpeedRange { get; private set; } = new(5, 10);
[field: Range(0, 10)]
[field: Tooltip("응집력 가중치")]
[field: SerializeField] public float CohesionWeight { get; private set; } = 1;
[field: Range(0, 10)]
[field: Tooltip("정렬 가중치")]
[field: SerializeField] public float AlignmentWeight { get; private set; } = 1;
[field: Range(0, 10)]
[field: Tooltip("분리 가중치")]
[field: SerializeField] public float SeparationWeight { get; private set; } = 1;
[field: Range(0, 100)]
[field: Tooltip("경계 가중치")]
[field: SerializeField] public float BoundsWeight { get; private set; } = 1;
[field: Range(0, 100)]
[field: Tooltip("장애물 가중치")]
[field: SerializeField] public float ObstacleWeight { get; private set; } = 10;
[field: Range(0, 10)]
[field: Tooltip("자아 가중치")]
[field: SerializeField] public float EgoWeight { get; private set; } = 1;
[Title("옵션")]
[Tooltip("경계 범위 On/Off")]
[SerializeField] private bool showBounds;
public MeshRenderer BoundMeshRenderer { get; private set; }
private void OnValidate()
{
if (BoundMeshRenderer)
{
BoundMeshRenderer.enabled = showBounds;
}
}
private void Start()
{
CreateBoids();
}
private void CreateBoids()
{
BoundMeshRenderer = GetComponentInChildren<MeshRenderer>();
BoundMeshRenderer.enabled = showBounds;
var myTransform = transform;
for (var i = 0; i < boidCount; i++)
{
var randomPos = Random.insideUnitSphere * spawnRange;
var randomRotation = Quaternion.Euler(0, Random.Range(0, 360f), 0);
var boid = Instantiate(boidPrefab, myTransform.position + randomPos, randomRotation, myTransform);
boid.Init(this, Random.Range(RandomSpeedRange.x, RandomSpeedRange.y));
}
}
}
}