- Home /
Why does my script affect objects it's not assigned to?
To help me better understand the use of raycasting for determine the object that I've clicked on, I was able to find the following code in another forum. It was originally Javascript, but I modified it to C#.
public class raycastTest04 : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
RaycastHit hit;
Ray ray;
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit))
{
Transform transform;
transform = (UnityEngine.Transform)hit.collider.GetComponent("Transform");
if (transform)
{
transform.Rotate(0, -2, 0);
}
}
}
}
I then created 3 cube objects. I did not duplicate the first cube, but instead created three individual cubes, named Cube1, Cube2, and Cube3. None of them are set as static. I attached the script to Cube1, but not Cube2 or Cube3. However, when I run my program, every cube I mouseover will rotate.
Why do Cube2 and Cube3 rotate when only Cube1 has the script attached to it?
Answer by Lovrenc · Jan 15, 2013 at 08:43 AM
So what your script does is
a) Cast ray.
b) Rotate object that you hit. And i think we agree you can indeed hit more than just "holder" cube.
So your script is not doing rotation on the holder of the script, but on ANY object you hover on.
Test 1: If you were to put this script on 2 cubes, cube you hover on would rotate twice as fast! Why? 2 scripts are rotating it.
Test 2: If you check wheather object you hit IS object you are running script on, other cubes will stop rotating.
using UnityEngine;
public class test : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
RaycastHit hit;
Ray ray;
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit))
{
if(hit.transform.gameObject.Equals(gameObject)) { //is object my ray hit the same as the one that is holding the script??
Transform transform;
transform = (UnityEngine.Transform)hit.collider.GetComponent("Transform");
if (transform)
{
transform.Rotate(0, -2, 0);
}
}
}
}
}
Note that this is only a test, you should by no means do this in this manner as you would have hundered of raycasts per update. What you should do if you want to have rotating and non rotating cubes is to place your script on camera for isntance and only rotate cubes that have proper tag (eg. "rotate").