How to make the vertical axis relative.

I have a pick up and hold items script and the object I’m carrying is moved on the horizontal axis but stays on the same level on the vertical axis. How do I fix this?
The object is teleported to a hand empty which doesn’t move on the axis.

This is how I hold it correctly:

And this is how I hold it when I look down:

I’d like to be able to hold it in like the first picture when looking up and down.

This is my script:

using UnityEngine;
using System.Collections;

#pragma warning disable 0414

namespace CarryingItems {

	public class PickUp : MonoBehaviour {
		
		private float RayCastLength = 2.15F;
		public LayerMask RayMask;
		
		private float OffsetDropPosition = 2;
		
		private GameObject UtilityProps;
		private GameObject CarryableObject;
		private GameObject Hand;
		private GameObject Character;
		private GameObject CameraMain;
		private GameObject Handle;
		private GameObject HandleExtra;
		private GameObject BladeHolder;
		private GameObject Blade;
		
		private bool ItemPickedUp;
		
		void Awake() {
			UtilityProps = GameObject.Find("UtilityProps");
			CarryableObject = this.gameObject;
			Hand = GameObject.Find("ItemHand");
			Character = GameObject.Find("PlayerCharacter");
			CameraMain = GameObject.Find("MainCamera");
			Handle = this.gameObject.transform.GetChild(0).gameObject;
			HandleExtra = this.gameObject.transform.GetChild(1).gameObject;
			BladeHolder = this.gameObject.transform.GetChild(2).gameObject;
			Blade = this.gameObject.transform.GetChild(3).gameObject;
		}		
		
		void Start() {
			ItemPickedUp = false;
		}
		
		void Update() {
			if (Input.GetKeyDown("e")) {	
				if(ItemPickedUp == false) {
					ItemPickUp();
				}
				else if(ItemPickedUp == true){
					ItemDrop();
				}
			}			
		}
		
		void ItemPickUp() {
			if (Physics.Raycast(CameraMain.transform.position, CameraMain.transform.forward, RayCastLength, RayMask.value)) {
				CarryableObject = this.gameObject;
                CarryableObject.transform.parent = Character.transform;
				CarryableObject.GetComponent<Rigidbody>().useGravity = false;
				CarryableObject.GetComponent<Rigidbody>().isKinematic = true;
				CarryableObject.transform.position = Hand.transform.position;
				CarryableObject.transform.rotation = Hand.transform.rotation;
				ItemPickedUp = true;
				
				if(Handle != null){
					Handle.GetComponent<Collider>().enabled = false;
				}
				if(HandleExtra != null){
					HandleExtra.GetComponent<Collider>().enabled = false;
				}
				if(BladeHolder != null){
					BladeHolder.GetComponent<Collider>().enabled = false;
				}
				if(Blade != null){
					Blade.GetComponent<Collider>().enabled = false;
				}
			}
		}
		
		void ItemDrop() {
			CarryableObject.transform.parent = null;
			CarryableObject.transform.position = CameraMain.transform.position + CameraMain.transform.forward*OffsetDropPosition;
			CarryableObject.transform.rotation = Character.transform.rotation;
			CarryableObject.GetComponent<Rigidbody>().useGravity = true;
			CarryableObject.GetComponent<Rigidbody>().isKinematic = false;
			ItemPickedUp = false;
			
			if(Handle != null){
				Handle.GetComponent<Collider>().enabled = true;
			}
			if(HandleExtra != null){
				HandleExtra.GetComponent<Collider>().enabled = true;
			}
			if(BladeHolder != null){
				BladeHolder.GetComponent<Collider>().enabled = true;
			}
			if(Blade != null){
				Blade.GetComponent<Collider>().enabled = true;
			}
		}	
	}
}

PS: Bonus points if you can help me with the fact that I grab 2 items when i try to pick up the cleaver.

What does your hierarchy and pickup script look like? The easiest way would be to have an empty parented to your camera or whatever moves your character and then have the item you’re carrying parented to that empty. Then just keep the item’s position at 0,0,0 so it follows the empty.