- Home /
Access method of an instance
I have an instance of a quad that has a method SetTexture(). I can instantiate the quad, but it has to be a transform so that I can set it as a child. But I still need to be able to access quad.SetTexture() so that I don't have to have a different prefab for every texture. Commented lines don't work.
 //squarePrefab.SetTexture();
                         //squarePrefab.transform.SetTexture();
                         //squarePrefab.gameObject.SetTexture();
                         //squarePrefab.transform.gameObject.SetTexture();
                         Transform gridPart = (Transform) Instantiate(squarePrefab, pos, Quaternion.identity);
                         gridPart.transform.parent= transform;
                         //gridPart.gameObject.SetTexture();
                         //gridPart.SetTexture();
                         //(GameObject) gridPart.SetTexture();
                         //Square gridPart = Square("Texture/Terrain/dirt0");
                         //Transform instance = (Transform) Instantiate(gridPart);
                         //GameObject gridPart = (GameObject) Instantiate(squarePrefab, pos, Quaternion.identity);
                         //gridPart.SetTexture();
You can instantiate the quad as a GameObject and use gridPart.gameObject.transform; I didn't get the rest, just pointing out you don't have to use Transform just to access parent/child
Answer by NoseKills · Apr 19, 2014 at 01:28 AM
In order to understand what's happening and how to fix this, you need to understand the way the building blocks of unity games are constructed.
A GameObject or a Transform does not have a function called SetTexture(). A GameObject can have a component attached to it and this component can have a method called SetTexture().
How do you know there is a method called SetTexture()? If you added a script to the prefab and the script has that method, you should do:
 GameObject gridPart  = (GameObject)GameObject.Instantiate(squarePrefab);
         gridPart.transform.parent = transform;
         
         YourScriptClassName script = gridPart.GetComponent<YourScriptClassName>();
         script.SetTexture();
But if you're for example talking about the SetTexture method of the Material class, you should:
 GameObject gridPart  = (GameObject)GameObject.Instantiate(squarePrefab);
         gridPart.transform.parent = transform;
 
         MeshRenderer mr = gridPart .GetComponent<MeshRenderer>();
         mr.material.SetTexture("_MainTex", yourTextureVariable);
 
You can mix and match but you have to stay true to Types in your code:
 using UnityEngine;
 using System.Collections;
 
 public class Test : MonoBehaviour {
 
     public GameObject squarePrefabGameObject;
     public GameObject gridPartGameObject; 
 
     public Transform squarePrefabTransform;
     public Transform gridPartTransform; 
 
     void functionX () 
     {
         //Option 1
         // If the prefabs are declared as GameObjects, you have to stay true to the type...
         gridPartGameObject  = (GameObject)GameObject.Instantiate(squarePrefabGameObject);
         // you can still access the transfrom easily...
         gridPartGameObject.transform.parent = transform;
 
         MeshRenderer mr = gridPartGameObject.GetComponent<MeshRenderer>();
         mr.material.SetTexture("_MainTex", _Texture);
 
         // if you added a script with yur own functions to the prefab, you need to get the script first...
         YourScriptClassName script = gridPartGameObject.GetComponent<YourScriptClassName>();
         script.SetTexture();
     }
 
     void functionY()
     {
         // Option 2
         // If the prefabs are declared as Transforms...
         gridPartTransform  = (Transform)GameObject.Instantiate(squarePrefabTransform);
         gridPartTransform.parent = transform;
         
         MeshRenderer mr = gridPartTransform.GetComponent<MeshRenderer>();
         mr.material.SetTexture("_MainTex", _Texture);
         
         YourScriptClassName script = gridPartTransform.GetComponent<YourScriptClassName>();
         script.SetTexture();
 
 
 
         // a "transform" has a reference to "gameObject" and vice versa, so whichever your prefabs are declared as
         // you can access one via the other
         GameObject instantiatedGameObject = (GameObject)GameObject.Instantiate(squarePrefabGameObject);
 
         // a GameObject has a transform that describes its orientation and position 
         gridPartTransform = instantiatedGameObject.transform;
 
         // a transform is connected to a GameObject
         gridPartGameObject = gridPartTransform.gameObject;
     }
 
 
 }
 
Hope you don't $$anonymous$$d, I converted your comment to an Answer.
Well this isn't quite doing it for me, though it answers the question in part. The object has to be a transform because it can't be instantiated as a gameobject (for some reason).
"Can't cast from source type to destination type"
I should have mentioned that originally.
And I wrote the SetTexture() method as a way of shortening the code.
I guess the "squarePrefab" is of type Transform then? I'll change my answer a bit.
Your answer
 
 
             Follow this Question
Related Questions
Adding a prefab to gameObject at a certain position in runtime 0 Answers
Creating new Transform from existing objects Transform to Instantiate object 1 Answer
Animation issue (OnTriggerEnter) ***SOLVED*** 1 Answer
move a GameObject based on Input.GetTouch 1 Answer
Scale (Transform.localscale) a gameobject based on ARFaceAnchor anchorData 0 Answers
 koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                