- Home /
Camera switch between child back to main camera issue
Hi All,
It is my first post here. Need a bit of help.
- Scenario: 
Player is walking around and by interacting with the object, the camera is then switch to focus on that object. (It has to switch to the 2nd camera)
I do have a Raycast in place and it does refer to the 2nd script - I am able to switch to the second camera.
The problem is, I am unable to switch back :(
Here is the second script:
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class MySelectedPainting : MonoBehaviour
 {
     public Camera playerCamera;
     public Camera artCamera; //No longer needed, replaced with GameObject child1
    
     [SerializeField] private KeyCode goBackToPlayerKey = KeyCode.Q;
     
     public void SwitchCamera()
     {
         GameObject originalGameObject = GameObject.Find("PaintingLarge");
         GameObject child1 = originalGameObject.transform.GetChild(0).gameObject;
         Debug.Log("Painting" + child1.name);
         playerCamera.enabled = false;
         artCamera.enabled = true;
 
         if (Input.GetKeyDown(goBackToPlayerKey))
         {
             Debug.Log("Switch?");
             playerCamera.enabled = true;
             artCamera.enabled = false;
         }
     }
Any help will be much appreciated.
Answer by SadeqSoli · May 31, 2021 at 03:48 PM
Hi @DariuszUK , I did'nt understand why your exactly using find method but it's an expensive call, specially on the update call, so I recommend you don't use it this way but since I didn't know why it's been called I didn't changed it, anyway this is how to do it, you should add a bool field called isCameraFocused and change it accordingly to your key like a toggle, so every time you hit the key you go to other camera and set off the other one. Also keep in mind that camera.enable = true or false will enable or disable code COMPONENT of camera not the object (of course it will work probably but I recommend you to set off or on the whole object), anyway let me know if you had any problem. good luck, cheers.
  using System.Collections;
  using System.Collections.Generic;
  using UnityEngine;
  
  public class MySelectedPainting : MonoBehaviour
  {
      public Camera playerCamera;
      public Camera artCamera; //No longer needed, replaced with 
 GameObject child1
 //To change between cameras.
     bool isCamFocused = false;
 
      [SerializeField] private KeyCode goBackToPlayerKey = KeyCode.Q;
      
      public void SwitchCamera()
      {
 // Use Get key method to avoiding changeing cameras every frame when player push the key down and hold it there.
          if (Input.GetKey(goBackToPlayerKey))
          {
 isCamFocused  = !isCamFocused ;
              Debug.Log("Switch?");
              playerCamera.gameObject.SetActive(isCamFocused ) ;
              artCamera.gameObject.SetActive(!isCamFocused ) ;
 
 //I don't know what is this but FIND Method is a bad and expensive way to reference some asset so I //recommend you use serializing it(caching)
          GameObject originalGameObject = GameObject.Find("PaintingLarge");
          GameObject child1 = originalGameObject.transform.GetChild(0).gameObject;
          Debug.Log("Painting" + child1.name);
 
          }
 
 void Update()
 {
 //you should call it here to be ready for it and don't use Key down to avoid errors and glisches when //user keeps key down this code will run accordingly 
 SwitchCamera();
 }
 
      }
Hi, Thank you for your input. It is not exactly what I had in $$anonymous$$d but I will make the adjustments to your comments. With the Find function, I am planning on having 80-120 objects (created from prefab, each prefab would have a model, the camera inside and above script to interact with - if that make sense) Given the amount of manual labour where I would have to physically drag each camera to specific field I wanted to automate it a little bit. Thank you for the help so far!
Answer by Statement · May 31, 2021 at 09:42 AM
I don't know how SwitchCamera is called but I guess it's a one time event, right? So SwitchCamera isn't called every frame. That means that the Input checking code won't run, meaning that the switch back to player camera won't run. I suggest that you place the input code in Update, so it gets updated each frame.
 void Update()
 {
          if (Input.GetKeyDown(goBackToPlayerKey))
          {
              Debug.Log("Switch?");
              playerCamera.enabled = true;
              artCamera.enabled = false;
          }
 }
Your answer
 
 
              koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                