官术网_书友最值得收藏!

Disabling objects by distance

In other situations, we may want Components or GameObjects to be disabled after they are enough far away from the player such that they may be barely visible, but too far away to matter. A good candidate for this type of activity is roaming AI creatures that we want to see at a distance, but where we don't need it to process anything, and it can sit idle until we get closer.

The following code is a simple Coroutine that periodically checks the total distance from a given target object and disables itself if it strays too far away from it:

[SerializeField] GameObject _target;
[SerializeField] float _maxDistance;
[SerializeField] int _coroutineFrameDelay;

void Start() {
StartCoroutine(DisableAtADistance());
}

IEnumerator DisableAtADistance() {
while(true) {
float distSqrd = (transform.position - _target.transform.position).sqrMagnitude;
if (distSqrd < _maxDistance * _maxDistance) {
enabled = true;
} else {
enabled = false;
}

for (int i = 0; i < _coroutineFrameDelay; ++i) {
yield return new WaitForEndOfFrame();
}
}
}

We should assign the player's character object (or whatever object we want it to compare with) to the _target field in the Inspector window, define the maximum distance in _maxDistance, and modify the frequency with which the Coroutine is invoked using the _coroutineFrameDelay field. Any time the object goes further than _maxDistance distance away from the object assigned to _target, it will be disabled. It will be re-enabled if it returns within that distance.

A subtle performance-enhancing feature of this implementation is comparing against distance-squared instead of the raw distance. This leads us conveniently to our next section.

主站蜘蛛池模板: 乐亭县| 阿克| 屯门区| 浦北县| 孙吴县| 获嘉县| 勐海县| 张北县| 宁德市| 绵阳市| 瑞丽市| 斗六市| 涟水县| 白山市| 辉县市| 逊克县| 双牌县| 治县。| 会东县| 南部县| 阿坝县| 贡嘎县| 修武县| 鄂托克前旗| 阿鲁科尔沁旗| 胶南市| 东港市| 察哈| 遂宁市| 盘山县| 永福县| 梅州市| 昌黎县| 新泰市| 甘德县| 荃湾区| 陈巴尔虎旗| 达州市| 永登县| 麦盖提县| 宝丰县|