Home > database >  How to select an object to be picked up whenever the camera is pointed to that object?
How to select an object to be picked up whenever the camera is pointed to that object?

Time:01-14

I'm trying to pick up objects in unity. I have a gameObject called LookObject. Whenever the camera points to an object, the name of that object will be stored in LookObject, then when I press Space the object gets picked up. it is working but not completely. The issue I'm facing is that when I look at an object then look at another direction, the lookObject still shows the name of the object I was looking at (it doesn't update). please see this image:

as shown in the image, the reticle is not pointing to the object. but it is still showing Cube as the Look Object.

Here is PlayerInteractions class:

 GameObject[] targetObjects;
    List<GameObject> targetObjectsList;
    [Header("InteractableInfo")]
    public float sphereCastRadius = 0.5f;
    public int interactableLayerIndex;
    private Vector3 raycastPos;
    public GameObject lookObject; 
    private PhysicsObjects physicsObject;
    private Camera mainCamera;
    public GameObject winUI;
    private InteractiveObjects interactiveObjects;
    [Header("Pickup")]
    [SerializeField] private Transform pickupParent;
    public GameObject currentlyPickedUpObject;
    private Rigidbody pickupRB;
    [Header("ObjectFollow")]
    [SerializeField] private float minSpeed = 0;
    [SerializeField] private float maxSpeed = 300f;
    [SerializeField] private float maxDistance = 8f;
    private float currentSpeed = 0f;
    private float currentDist = 0f;
    [Header("Rotation")]
    public float rotationSpeed = 100f;
  //  Quaternion lookRot;
    [SerializeField] GameObject TargetsCanvas;
    static bool strikeThrough = false; 
 private void Start()
    {

        mainCamera = Camera.main;
        targetObjects = GameObject.FindGameObjectsWithTag("TargetObj");
        targetObjectsList = new List<GameObject>();
        foreach (var obj in targetObjects)
        {
            var mytext = CreateText(TargetsCanvas.transform);
            mytext.text = "• Find The "   obj.name;
            Debug.Log(""  obj.name); 
       }
        
    }

    //A simple visualization of the point we're following in the scene view
    private void OnDrawGizmos()
    {
        Gizmos.color = Color.yellow;
        Gizmos.DrawSphere(pickupParent.position, 0.5f);
    }
  void Update()
    {
        //Here we check if we're currently looking at an interactable object
        raycastPos = mainCamera.ScreenToWorldPoint(new Vector3(Screen.width / 2, Screen.height / 2, 0));
        RaycastHit hit;
        if (Physics.SphereCast(raycastPos, sphereCastRadius, mainCamera.transform.forward, out hit, maxDistance, 1 << interactableLayerIndex))
        {
            lookObject = hit.collider.transform.gameObject;

        }

        //if we press the button of choice
        if (Input.GetKeyDown(KeyCode.Space))
        {
            //and we're not holding anything
            if (currentlyPickedUpObject == null)
            {
                //and we are looking an interactable object
                if (lookObject != null )
                {
                    PickUpObject();            
                    if (!targetObjectsList.Contains(lookObject.gameObject))
                    {
                        targetObjectsList.Add(lookObject.gameObject);

                        if (targetObjectsList.Count == targetObjects.Length) 
                        {
                          //  Time.timeScale = 0f;
                          //  winUI.SetActive(true);
                            // SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex   1);
                            // Time.timeScale = 1f;
                        }
                    }
                   
                }
            }
            //if we press the pickup button and have something, we drop it
            else
            {
                BreakConnection();
            }
        }
}
 private void FixedUpdate()
    {
        if (currentlyPickedUpObject != null)
        {
            currentDist = Vector3.Distance(pickupParent.position, pickupRB.position);
            currentSpeed = Mathf.SmoothStep(minSpeed, maxSpeed, currentDist / maxDistance);
            currentSpeed *= Time.fixedDeltaTime;
            Vector3 direction = pickupParent.position - pickupRB.position;
            pickupRB.velocity = direction.normalized * currentSpeed;
              //Rotation// 
           // lookRot = Quaternion.LookRotation(mainCamera.transform.position - pickupRB.position);
           // lookRot = Quaternion.Slerp(mainCamera.transform.rotation, lookRot, rotationSpeed * Time.fixedDeltaTime);
          //  pickupRB.MoveRotation(lookRot);
        }
    }
    //Release the object 
    public void BreakConnection()
    {
        pickupRB.constraints = RigidbodyConstraints.None;
        currentlyPickedUpObject = null;
        lookObject = null;
        physicsObject.pickedUp = false;
        currentDist = 0;
    }
    public void PickUpObject()

    {
        physicsObject = lookObject.GetComponentInChildren<PhysicsObjects>();
        currentlyPickedUpObject = lookObject;
        pickupRB = currentlyPickedUpObject.GetComponent<Rigidbody>();
        pickupRB.constraints = RigidbodyConstraints.FreezeRotation;
        physicsObject.playerInteractions = this;
    }

Here is the code attached to objects:

 public float waitOnPickup = 0.2f;
    public float breakForce = 35f;
    [HideInInspector] public bool pickedUp = false;
    [HideInInspector] public PlayerInteractions playerInteractions;


    private void OnCollisionEnter(Collision collision)
    {
        if (pickedUp)
        {
            if (collision.relativeVelocity.magnitude > breakForce)
            {
                playerInteractions.BreakConnection();
            }

        }
    }

    //this is used to prevent the connection from breaking when you just picked up the object as it sometimes fires a collision with the ground or whatever it is touching
    public IEnumerator PickUp()
    {
        yield return new WaitForSecondsRealtime(waitOnPickup);
        pickedUp = true;

    }

Here is an image of the object inspector:

enter image description here

how can I make it accurately showing the objects I'm looking at?

CodePudding user response:

A simple fix for this would be to set lookObject to null if the SphereCast returns false since that would indicate you are no longer looking at a valid object. Simply adding else lookObject = null; to the end of the first if statement in your Update() method should do the trick.

  •  Tags:  
  • Related