Does This Coroutine Make Sense?

I’m new to the concept of coroutines. Within one of my scripts I check to see if a variety of different objects are close enough to the camera to enable them. If they are not, they remain disabled. The script checks the distances every X seconds.

I was noticing within Profiler that the script was taking about 2.5ms-3.5ms to process and would like to cut it down, so I modified my code (below).

Can anyone tell me if doing it this way is a good idea or not? I guess I’m specifically referring to the way the conditional statements “yield” within CheckShowOrDontShow(). From what I understand, yield will basically exit the coroutine, then next frame return to where it left off. The result is that the Profiler shows it as taking 0.15ms-0.3ms now. Great! Just not sure if I’m missing something or causing problems elsewhere.

function Start () {
	cachedVisibleDistance = visibleDistance;
	player = GameObject.Find("Player/Ship/Ship");
	for (var child : Transform in transform) {
		// Lets us specify which child to enable/disable based on distance.
		child.transform.gameObject.SetActiveRecursively(false);
		theObject.Push(child.gameObject);
		theLocation.Push(child.position);
		theStatus.Push(false);
	}
	arrLength = theObject.length;
}

function LateUpdate () {
	if(tempTime <= Time.time) {
		// Cache the player's position so we don't have to access it every loop in CheckShowOrDontShow().  Saves CPU (Profiler)
		cachedPlayerPosition = player.transform.position;
		CheckShowOrDontShow();
	
	tempTime = distanceCheck + Time.time;
	}
}

function CheckShowOrDontShow() {
	// Get the distance to all the objects which enable or disable based on distance
	for (i=0;i<arrLength;i++) {
		if (player && theObject) {
			if(theStatus *== false) {*

_ if(Vector3.Distance(cachedPlayerPosition, theLocation*) <= visibleDistance) {_
_ / Then we tell it to enable.
* Alternatively, we could just enable and disable materials, but I*
feel like completely disabling the objects may save resources. /
theObject
.SetActiveRecursively(true);
theStatus = true;
}
yield; // Check Profiler to see if this helps with processing time*

* } else {
// We should also disable currently enabled objects if they’re farther than visibleDistance*

if (Vector3.Distance(cachedPlayerPosition, theLocation*) > visibleDistance) {
theObject.SetActiveRecursively(false);
theStatus = false;
}
yield; // Check Profiler to see if this helps with processing time*

* }
}
}
}*_

That’s a great use of coroutines. Perfect multi-frame shifting of effort is a very good idea.

I would suggest that you square visibleDistance at the start and then check (cachedPlayerPosition - theLocation*).sqrMagnitude because square roots are recursive and expensive. There’s some more advanced info on coroutines available on Unity Gems*