몬스터가 죽고 재화(골드)를 드랍하는데, 그 값을 랜덤하게 뽑으려고 한다. 이때, 작은 값이 뽑힐 확률이 더 높게 설정하고 싶어서 Random.Value의 값을 AnimationCurve를 이용해 가중치를 설정하여 작은 값이 더 잘 나오게 하였다.
AnimationCurve 적용 방법
실제 작성한 script (0~1 사이의 값을 Curve를 이용하여 랜덤하게 뽑은 뒤 최대로 나올 수 있는 값에 곱해줘서 (낮은 값이 더 자주 나오게 가중치가 설정된) 랜덤한 골드를 얻을 수 있게 함)
public AnimationCurve curveRandom;
[SerializeField] private int dropGold;
public void SetDropGold(int maxGold)
{
dropGold = Mathf.RoundToInt(maxGold * CurveWeightedRandom(curveRandom));
}
private float CurveWeightedRandom(AnimationCurve curve)
{
return curve.Evaluate(Random.value);
}
[Image 1] 설정한 Curve
출처 : Unity Documentation, https://docs.unity3d.com/kr/2022.3/Manual/class-Random.html
private IEnumerator hpRegen;
private float lastDamagedTime;
private bool isAttacked = false;
private void Start()
{
hpRegen = RegenerateHp();
StartCoroutine(hpRegen);
}
private void Update()
{
if (isAttacked)
{
if (Time.time - lastDamagedTime > 5f)
{
isAttacked = false;
if (hpRegen != null)
StartCoroutine(hpRegen);
}
}
_hpBar.UpdateCurrentHP(status.HP.CurrentValue);
}
// Skill이나 Projectile 오브젝트에서 충돌 시 호출할 메서드
public void TakeDamage(float damage)
{
isAttacked = true;
lastDamagedTime = Time.time;
status.HP.CurrentValue -= damage;
if (hpRegen != null)
StopCoroutine(hpRegen);
}
IEnumerator RegenerateHp()
{
while (true)
{
if (status.HP.CurrentValue < status.HP.GetValue())
status.HP.CurrentValue = Mathf.Min(status.HP.CurrentValue + status.HPRegeneration.CurrentValue,
status.HP.GetValue());
yield return regenInterval;
}
}
WaitForSeconds regenInterval = new WaitForSeconds(1f);