|
HI!I have script, which works so good without FindClosestEnemies(); function. Here is part of code: With this function, i have <15fps, without >200; What Should I do? I think i shoud change this: gos = GameObject.FindGameObjectsWithTag("Player");, but i have not any ideas how to do it. (I make RTS game^ and this cannon's(Turrel) script(part of one) [Edit by Berenger, code formatting]
(comments are locked)
|
|
I agree your code looks odd. But why don't you cache the list of players rather then fetching them each time you enter this routine? The code doesn't really look odd except the useless empty for-loop (
Apr 29 '12 at 11:24 AM
Bunny83
(comments are locked)
|
|
The best way depends on how many enemies / objects will be there, what's the max-distance and how are they distributed across the map.
I know in a lot questions people suggest to use FindGameObjectsWithTag, but keep in mind it has to iterate through all objects so it's quite slow. OverlapSphere uses the physics system which probably uses some kind of space partitioning which minimize the overhead. Your sorting loop is already in it's optimal form ;) Just realized that your function doesn't return anything. You should add a
Apr 29 '12 at 12:40 PM
Bunny83
(comments are locked)
|
|
I solved the problem!!!!!!!!!!!!!!!!!!!!!! i just put body of function in update - all works fine!!!
(comments are locked)
|
|
It certainly better to get the reference to things like player once at the start. Whether its going to make a lot of difference to your routine I don't know. So do something like: Thats good practice regardless. From performance point of view it'S of course way better, but don't forget that in most RTS games enemies will be added / removed during the game, so you need an updated version of the enemy array.
Apr 29 '12 at 11:27 AM
Bunny83
(comments are locked)
|
|
Call it once every second or two. It will even make the enemies look cooler (when a better target comes closer, they'll sometimes take a few shots at the old target before noticing.) "Easy" way is a counter: Slightly CPU faster way is a coroutine, called at start, like:
(comments are locked)
|
1 2 next page »

Why is there a for loop there, and why are you using Mathf.Infinity? Just asking, maybe I will understand your code better. How many enemies do you have in your scene?
Enemies? from 1 to infinity(it's RTS game), as for Mathf.Infinity - i don't know i took this function from offical documentation
are you calling this function every update? maybe you can get the enemy-objects in an variable at awake and update it whenever a player joins your network or disconnects it? It would probably be better?
Math.Infinityis for a standard "Price is Right" loop. Each new object steps in the winner's circle if it can beat the previous distance by being closer. You start a loop like that by assigning it something anyone can beat -- like how the winner's circle starts saying $0 in the Price is Right.Since the "winner" here is the smaller distance, you start with it super-high.
How to use Awake in C#?