How to detect enemys on a tower vision radius?

Iam making a isometric tower defense game, towers have range, giving the range value i increase the circle size

this.rangeHitbox.transform.localScale = new Vector3(this.range,this.range);

(Its just a circle rotated to fit the isometric view)

The problem is that i dont know how make the collision, CircleCast doenst work since it cant be rotated, Polygon Collider be inacurrated, i tryed use some math formulas that i found on internet but still dont work, i dont know what to do.

some options to test

1 Like

Use caution with the above construct: you are likely going to have issues with the Z scale being zero.

The proper way to set scales:

https://discussions.unity.com/t/851227/2

NEVER set scale (or any part of scale) to zero or negative.

NEVER use Vector2 because that makes the third term (Z) zero.

ALWAYS use Vector3, and make sure that the .z is either 1.0f, or else your non-zero scale.

Similarly never set scale to Vector3.zero, especially in a UI, because this will cause layout divide-by-zeros and damage all your hierarchy.

As to your actual problem, I’d go look at a few tower defense tutorials with ranged towers, see how they handle it, might give you some ideas.

“As to your actual problem, I’d go look at a few tower defense tutorials with ranged towers, see how they handle it, might give you some ideas.” SIR I ALREADY DID no one of them have have the answer that is why iam here, also doenst reply to talk about a problem that is not on the post.

Sir circle collide cant rotate man …

Really??

8488832--1129319--Screen Shot 2022-10-04 at 7.51.48 AM.jpg

Looks like it’s going on right here early in the video:

8488832--1129322--Screen Shot 2022-10-04 at 7.53.33 AM.png
Perhaps you weren’t “doing” the tutorial properly?

Tutorials and example code are great, but keep this in mind to maximize your success and minimize your frustration:

How to do tutorials properly, two (2) simple steps to success:

Step 1. Follow the tutorial and do every single step of the tutorial 100% precisely the way it is shown. Even the slightest deviation (even a single character!) generally ends in disaster. That’s how software engineering works. Every step must be taken, every single letter must be spelled, capitalized, punctuated and spaced (or not spaced) properly, literally NOTHING can be omitted or skipped.

Fortunately this is the easiest part to get right: Be a robot. Don’t make any mistakes.
BE PERFECT IN EVERYTHING YOU DO HERE!!

If you get any errors, learn how to read the error code and fix your error. Google is your friend here. Do NOT continue until you fix your error. Your error will probably be somewhere near the parenthesis numbers (line and character position) in the file. It is almost CERTAINLY your typo causing the error, so look again and fix it.

Step 2. Go back and work through every part of the tutorial again, and this time explain it to your doggie. See how I am doing that in my avatar picture? If you have no dog, explain it to your house plant. If you are unable to explain any part of it, STOP. DO NOT PROCEED. Now go learn how that part works. Read the documentation on the functions involved. Go back to the tutorial and try to figure out WHY they did that. This is the part that takes a LOT of time when you are new. It might take days or weeks to work through a single 5-minute tutorial. Stick with it. You will learn.

Step 2 is the part everybody seems to miss. Without Step 2 you are simply a code-typing monkey and outside of the specific tutorial you did, you will be completely lost. If you want to learn, you MUST do Step 2.

Of course, all this presupposes no errors in the tutorial. For certain tutorial makers (like Unity, Brackeys, Imphenzia, Sebastian Lague) this is usually the case. For some other less-well-known content creators, this is less true. Read the comments on the video: did anyone have issues like you did? If there’s an error, you will NEVER be the first guy to find it.

Beyond that, Step 3, 4, 5 and 6 become easy because you already understand!

Finally, when you have errors…

Remember: NOBODY here memorizes error codes. That’s not a thing. The error code is absolutely the least useful part of the error. It serves no purpose at all. Forget the error code. Put it out of your mind.

The complete error message contains everything you need to know to fix the error yourself.

The important parts of the error message are:

  • the description of the error itself (google this; you are NEVER the first one!)
  • the file it occurred in (critical!)
  • the line number and character position (the two numbers in parentheses)
  • also possibly useful is the stack trace (all the lines of text in the lower console window)

Always start with the FIRST error in the console window, as sometimes that error causes or compounds some or all of the subsequent errors. Often the error will be immediately prior to the indicated line, so make sure to check there as well.

All of that information is in the actual error message and you must pay attention to it. Learn how to identify it instantly so you don’t have to stop your progress and fiddle around with the forum.

That tutorials doenst work cause its not isometric, i already tryed, he uses cicle collider, but circle collider cant rotate so wont be correctly.

Then use another collider, perhaps a sphere or a capsule if your “up” is the +Y axis.

The tutorial above just uses OnTriggerEnter2D() so you would use the 3D equivalent, OnTriggerEnter()

8488853--1129328--Screen Shot 2022-10-04 at 8.01.59 AM.png

Otherwise, 100% of the concepts apply. His towers are finding targets. Yours could be too.

Its a 2d game with sprites how i will use 3d colliders?

ah, can use 3d physics

1 Like

check distance wont work cause the enemy hitbox is a circle rotated too, the distance would just take in consideration the center of the circle

If you just have two circles, use Vector3.Distance() and check if they are less than the two radii combined.

float enemySize = 1.0f;
float towerRange = 5.0f;

if (Vector3.Distance (enemyPosition, towerPosition) < enemySize + towerRange))
{
  Debug.Log( "Enemy is in range!");
}
else
{
  Debug.Log( "Enemy is NOT in range!");
}

dont work i tryed

8489108--1129346--upload_2022-10-4_13-26-15.jpg

prints in range but its not :confused:

because the rotation

If you are dealing with grid you should maybe check the cells in the circle. IF you are not dealing with grid an alternative may be to do a Radial Raycast Check. Or else you may do Inside collider check

You can simply know every enemy that enters the game and check distance.

yeah i tryed check distance but rotations doenst allow me

as you can see here it shows the enemy is on the range (the enemy is that small circle that is rotated too)

8489162--1129355--upload_2022-10-4_13-39-55.jpg

But its not on range :/, than i figured out why, if i remove the x rotation

8489162--1129358--upload_2022-10-4_13-40-28.jpg

so Vector3.Distance ignores rotation :confused: so dont work for me

What do you mean it ignores rotation?

what are you trying to do attack front enemy first?

Oh.

no i see. It is false isometric.

You’ll need to be more accurate with your placement and layers. To do it the way you expect it should work.

? what layers have to do about it?

Well if the distance doesn’t work due to rotation I can assume your billboarded sprite must have a parent object and is not physically positioned in the same dimensions as it’s radius circle. ?

thus projects the image of isometric, but it is only a trick. And that the positions maths and distance as a result don’t check out. ?

Are you actually keeping the position of these objects in 2D space but vertically “squished” according to the camera?!

If so that means that moving north / south will cause objects to move faster than east / west… that’s a mess.

Traditionally one keeps objects in a non-squished coordinate space, then apply a projection to get them correct for an isometric vertically squished view.

Otherwise all your speed, distance, pathfinding, etc. EVERYTHING, every single computations MUST incorporate the same squish factor all over the place. As I said, a complete mess.

If you insist on keeping your coordinates in squished space then you must squish the Y offset by the same amount before asking the Vector3.Distance(), but I highly recommend you normalize internal object positions and then project those positions at only one place, the place where their onscreen location is needed.

1 Like