Проблема в том, что, поскольку этот скрипт прикреплен к обоим игровым объектам, в позиции мыши наведено два луча (по одному от каждого скрипта). Поскольку вы просто видите, что raycollider соответствует статическому объекту, это утверждение верно для обоих сценариев, независимо от того, на каком вы нажали:
if (rh.collider.gameObject.name == touch_detect.clickedObject.name) // always true
Чтобы получить немедленное исправление, вы должны изменить приведенное выше утверждение на что-то вроде этого, чтобы проверить, что луч пересекает тот же игровой объект, к которому прикреплен скрипт:
if (rh.collider.gameObject.name == gameObject.name)
Это действительно не самый лучший метод, так как вы все еще используете два луча и, следовательно, выполняете всю логику дважды (или больше раз, если порождаете больше кубов).
Лучшим способом было бы иметь одного главного игрового объекта, который будет отбрасывать луч. Когда этот луч пересекает куб, вы должны активировать метод внутри скрипта кубов, чтобы показать лазер. Так, например:
на главном объекте у вас будет:
if (Physics.Raycast(ray, out rh, Mathf.Infinity))
{
// add a tag to all objects with the laser script
if (rh.collider.gameObject.tag == "hasLaser") //verify object has laser script via tag
rh.collider.GetComponent<laser>().activateLaser(); // call public method in collider script
}
и тогда у куба будет лазерный скрипт с открытым методом:
public void activateLaser()
{
lr.enabled = true;
}