简体   繁体   中英

How to reference camera in prefab script in Unity 2D?

I have created a player prefab (called Tim in my project) and am trying to make all the references to gameObjects and transforms directly from the one of the players scripts which is actually attached to a gun object which is a child of the player prefab.

在此处输入图像描述

The issue is I cant manage to reference the camera in the script although I've looked and tried many different methods, none of them seemed to work. Unity prints this error in the console though: "NullReferenceException: Object reference not set to an instance of an object". And here is the script:

public class Gun_Control : MonoBehaviour
{
// References for GameObjects
[SerializeField] private Rigidbody2D rb;
private GameObject Player;
[SerializeField] private Transform PlayerTransform;
private GameObject Gun;
[SerializeField] private Transform GunTransform;
private Camera MainCamera;
private GameObject firePoint;
[SerializeField] private Transform firePointTransform;
[SerializeField] private GameObject bulletPrefab;

// Variables for Shooting
private Vector2 mousePos;
private float bulletForce = 20f;

// Start is called at the beginning
void Start()
{
    Debug.Log("Starting");
    Player = GameObject.FindWithTag("Player");
    PlayerTransform = Player.transform;
    Gun = GameObject.FindWithTag("PlayerGun");
    GunTransform = Gun.transform;
    MainCamera = GameObject.FindWithTag("Camera").GetComponent<Camera>();
    firePoint = GameObject.FindWithTag("PlayerFirePoint");
    firePointTransform = firePoint.transform;
}

// Update is called once per frame
void Update()
{
    // Get mouse position
    mousePos = MainCamera.ScreenToWorldPoint(Input.mousePosition);

    // Run shoot function on left click
    if(Input.GetButtonDown("Fire1"))
    {
        Shoot();
    }
}

// Update is called on every physics frame
void FixedUpdate()
{
    // Set gun position to player position
    GunTransform.position = PlayerTransform.position;
    // Set gun rotation to mouse position
    Vector2 lookDir = mousePos - rb.position;
    float angle = Mathf.Atan2(lookDir.y ,lookDir.x) * Mathf.Rad2Deg - 180f;
    rb.rotation = angle;
}

void Shoot()
{
    // Instantiate a bullet at the firepoint and give it force
    GameObject bullet = Instantiate(bulletPrefab, firePointTransform.position, firePointTransform.rotation);
    Rigidbody2D rb = bullet.GetComponent<Rigidbody2D>();
    rb.AddForce(firePointTransform.up * bulletForce, ForceMode2D.Impulse);
}
}

Right now I have a variable, MainCamera, and when the script starts I look for a camera which has "Camera" as its tag which is set correctly. I can add on if anyone needs more details and thank you to everyone for taking the time to help.

Edit 1: I tried what thunderkill suggested but it doesnt seem to work. Here is a picture of the new code.

在此处输入图像描述

And when I try to use Debug.Log(Camera.main); it prints null.

here is a good example to access your main camera:

Camera m_MainCamera;
void Start()
{
        //This gets the Main Camera from the Scene
     if(Camera.main != null){
        m_MainCamera = Camera.main;
        //This enables Main Camera
        m_MainCamera.enabled = true; 
        }
}

So i ended up finding the answer. I just deleted the camera in my scene and created a new one and then ended up using: "MainCamera = GameObject.FindWithTag("Camera").GetComponent();" which worked this time. The issue could have also been caused by errors present before in my code.

Camera c = Camera.main;//get the camera Tagged "MainCamera"

So you have to Check if your Camera tag is "MainCamera".

or you try:

GameObject.FindObjectOfType<Camera>();

(I don't recommend the second solution)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM