- Home /
 
How to access a Component from another Child when current is Destroyed
My Character(ParentObject) has 2 sprites/skins(dresses or whatever you wanna call it) that you can select from the menu(Children). Those 2 gameObjects(sprites) are stored in a list, whenever I select a skin from the menu, it Instantiate the selected sprite and destroys the current one(they Instantiate inside Character GameObject). Each Sprite has a Animator.
 public class Character : MonoBehaviour {
     bool move = false;
     Animator animator;
     
     void Start() {
     
     animator = transform.GetComponentInChildren<Animator>();
     
     }
  
 void Update(){
 if (Input.GetKeyDown (KeyCode.Space) || Input.GetMouseButtonDown (0)) {
 move = true;
                         
                         }
 
 }
 
     void FixedUpdate() {
     if (move == true) {
     
         animator.SetTrigger ("Moved");
     }
 
               When the first sprite is destroyed, I get the error "The Object Type Animator has been destroyed but you are still trying to access it". I thought that if the first sprite was destroyed, the code (animator = transform.GetComponentInChildren();) would get the second Sprite Animator. But isn't working that way. How do I get the Animator from the second sprite when the first is destroyed.
P.D. : The 2 Sprites have NO script. Character Object has the script Character.
Likely you will need to call this line again when a component is destroyed:
  animator = transform.GetComponentInChildren<Animator>();
 
                  Given the structure of your code, it may be simpler to just call it every frame.
Answer by Kiwasi · May 09, 2014 at 05:13 AM
The effect is part of the way the scripting language works. When you store the animator you store a reference to the specific instance of the animator component in memory, not the general animator on the childe object.
To fix you could simply grab a reference to the animator in the update loop
 void Update (){
     animator = transform.GetComponentInChildren<Animator>();
     //do other stuff with animator
 }
 
               But getting a reference is expensive. This method will cost you in terms of performance.
A better way to do it as follows 1. First check if the animator component is not null. 2. If the animator component is null then get a new reference to the animator
 void Update (){
     if (!animator){
         animator = transform.GetComponentInChildren<Animator>();
     }
     //do other stuff with animator
 }
 
               Its typically a good practice to check if a reference is null every time you refer to a object that might be destroyed.
Your answer