My AI will spot multiple enemy targets anywhere from a distance of 0 - 100. I am trying to figure out how to convert the distance value to a threat value. I want the enemy targets far away to be assigned a low threat value and the targets closer to have a high threat value.
Enemies targets can be distances of: 0 - 100.
Threat values to assign should be between: 10 - 40 (add in increments of 5 - 10).
Problem 1. How to inverse distance so that big distance number becomes small threat number & small distance number becomes big threat number.
Problem 2. I want the scale reduced to only add threat values between 10 - 40. And not be be linear. So threat values get added in large increments of 5-10.
Any help is appreciated.
Thanks,
for (int i = 0; i < list.Count; i++)
{
threatLevel.Add(0f);
float distance = Vector3.Distance(transform.position, list*.transform.position);*
_ float threatAmountToAdd = (do some math on distance here);_
_ threatLevel += threatAmountToAdd;_
}
Well, it’s not really clear what you mean by “add in increments of 5 - 10”. increments of 5 would be clear, but what’s 5 - 10? So you would allow 5.0123 or 6.753 as well? Or just whole numbers between 5 and 10? (5, 6, 7, 8, 9, 10)? Next unclear thing is “not be be linear”. If it’s not linear you have to have a different interpolation. It’s like saying you want a color but not blue. That doesn’t specify a certain color.
One way is to use a linear interpolation. In any case you first want to normalize the range and invert it:
if (distance < 100f)
{
float d = 1f - distance/100f; // linear inverse distance
float threat = 10 + d*30;
}
This will result in a threat value between 10 and 40 linearly distributed. If you want to limit the increase to steps of 5 you can do this:
float threat = 10 + Mathf.Floor(d*7)*5;
This will map the distance linearly like this:
//
//distance range | d | threat
---------------------------------------
100.00 - 85.71 | 0.00 - 0.14 | 10
85.71 - 71.43 | 0.14 - 0.28 | 15
71.43 - 57.14 | 0.28 - 0.42 | 20
57.14 - 42.86 | 0.42 - 0.57 | 25
42.86 - 28.57 | 0.57 - 0.71 | 30
28.57 - 14.29 | 0.71 - 0.85 | 35
14.29 - >0.0 | 0.85 - 0.99 | 40
0.0 | 1.00 | 45
Note that at an exact distance of 0.0 it would increment to the next value. However this should never happen. Even a distance of 0.000001 will still map to 40.