Why is my gun stretching out when I pick it up?

When my gun is picked up, the transform changes from 0.02 on all axes to 1 on all axes. If it helps, here is my pick up system script:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PickUpSystem : MonoBehaviour
{
    public GunSystem gunScript;
    public Rigidbody rb;
    public BoxCollider coll;
    public Transform player, gunContainer, fpsCam;

    public float pickUpRange;
    public float dropForwardForce, dropUpwardForce;

    public bool equipped;
    public static bool slotFull;

    private void Start()
    {
        //Setup
        if (!equipped)
        {
            gunScript.enabled = false;
            rb.isKinematic = false;
            coll.isTrigger = false;
        }
        if (equipped)
        {
            gunScript.enabled = true;
            rb.isKinematic = true;
            coll.isTrigger = true;
            slotFull = true;
        }
    }

    private void Update()
    {
        //Check if player is in range and "E" is pressed
        Vector3 distanceToPlayer = player.position - transform.position;
        if (!equipped && distanceToPlayer.magnitude <= pickUpRange && Input.GetKeyDown(KeyCode.E) && !slotFull) PickUp();

        //Drop if equipped and "Q" is pressed
        if (equipped && Input.GetKeyDown(KeyCode.Q)) Drop();
    }

    private void PickUp()
    {
        equipped = true;
        slotFull = true;

        //Make weapon a child of the camera and move it to default position
        transform.SetParent(gunContainer);
        transform.localPosition = Vector3.zero;
        transform.localRotation = Quaternion.Euler(Vector3.zero);
        transform.localScale = Vector3.one;

        //Make Rigidbody kinematic and BoxCollider a trigger
        rb.isKinematic = true;
        coll.isTrigger = true;

        //Enable script
        gunScript.enabled = true;
    }

    private void Drop()
    {
        equipped = false;
        slotFull = false;

        //Set parent to null
        transform.SetParent(null);

        //Make Rigidbody not kinematic and BoxCollider normal
        rb.isKinematic = false;
        coll.isTrigger = false;

        //Gun carries momentum of player
        rb.velocity = player.GetComponent<Rigidbody>().velocity;

        //AddForce
        rb.AddForce(fpsCam.forward * dropForwardForce, ForceMode.Impulse);
        rb.AddForce(fpsCam.up * dropUpwardForce, ForceMode.Impulse);
        //Add random rotation
        float random = Random.Range(-1f, 1f);
        rb.AddTorque(new Vector3(random, random, random) * 10);

        //Disable script
        gunScript.enabled = false;
    }
}

If anyone could help me that would be great :slight_smile:

Hi @somerandomhacker,

because in void Update()
You order you gun to:
transform.localScale = Vector3.one;
So if you don’t know scale is just another Vector3… and Vextor3.one = (1,1,1).

If you don’t need this to happen just cut this out…


If issue will still occur you could also SetParent for:

transform.SetParent(gunContainer, false);

SetParent → have one parameter “hidden”, by hidden you need to understand that it have default value and if you not assign it during call, it will act according to default value… this parameter is:


worldPositionStays “If true, the parent-relative position, scale and rotation are modified such that the object keeps the same world space position, rotation and scale as before”.
Hope will do, let me know…

It’s likely that the parent object you’re assigning it to has an asymmetrical scale and that’s used as a multiplier when childing the gun to it. If the object has a parent in its hierarchy with a scale where the x,y,z values don’t match each other, then depending on the rotation of its children, they’ll get stretched out according to the differently sized axes.