void LateUpdate() { Collider collider = null; if (env != null && env.characterController != null) { // Check object on the crosshair collider = env.characterController.crosshairHitInfo.collider; if (env.input.GetButtonDown(InputButtonNames.Action)) { if (collider != null) { VoxelPlayInteractiveObject obj = collider.GetComponentInChildren <VoxelPlayInteractiveObject> (); if (obj != null) { if (obj.triggerNearbyObjects) { for (int k = 0; k < nearCount; k++) { obj = nearObjs [k]; if (obj != null && obj.playerIsNear) { nearObjs [k].OnPlayerAction(); } } } else if (obj.playerIsNear) { obj.OnPlayerAction(); } } } } } // Check nearby objects // Get player position Vector3 playerPos = env.currentAnchorPos; // Check if player has moved since last frame int playerPosX = (int)playerPos.x; int playerPosY = (int)playerPos.y; int playerPosZ = (int)playerPos.z; if (playerPosX == lastPlayerPosX && playerPosY == lastPlayerPosY && playerPosZ == lastPlayerPosZ && collider == lastCollider) { return; } lastCollider = collider; lastPlayerPosX = playerPosX; lastPlayerPosY = playerPosY; lastPlayerPosZ = playerPosZ; // Check if player enters/exits the interaction area per object for (int k = 0; k < count; k++) { VoxelPlayInteractiveObject o = objs [k]; if (o != null && o.enabled) { Vector3 objPos = o.transform.position; float interactionDistanceSqr = o.interactionDistance * o.interactionDistance; float dist = FastVector.SqrDistance(ref playerPos, ref objPos); bool isNear = dist <= interactionDistanceSqr; if (o.playerIsNear && !isNear) { o.playerIsNear = false; // Remove from near list nearObjs [o.nearIndex] = null; if (o.nearIndex == nearCount - 1) { nearCount--; } o.nearIndex = 0; // Call event o.OnPlayerGoesAway(); } else if (isNear && !o.playerIsNear) { o.playerIsNear = true; o.nearIndex = AddToDynamicList(o, ref nearObjs, ref nearCount); // Call event o.OnPlayerApproach(); } } } }