evelynshilosky

InteractionSystem - Part 3 & 4

Feb 7th, 2025 (edited)
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.40 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3.  
  4. public class InteractionSystem : MonoBehaviour
  5. {
  6.     public Transform leftObjectHolder;
  7.     public Transform rightObjectHolder;
  8.     public LayerMask pickupLayer;
  9.     public float placementDistance = 5f;
  10.     public LayerMask placementLayerMask;
  11.  
  12.     private InventorySystem inventorySystem;
  13.     private PlayerMovement playerMovement;
  14.     private bool isPrecisionDrop = false;
  15.     private Dictionary<GameObject, int> originalLayers = new Dictionary<GameObject, int>();
  16.  
  17.     private void Start()
  18.     {
  19.         inventorySystem = InventorySystem.Instance;
  20.         playerMovement = GetComponent<PlayerMovement>();
  21.     }
  22.  
  23.     public void TryPickUpItem(InteractableObject interactable)
  24.     {
  25.         Item item = interactable.item;
  26.         bool isLeftHand = inventorySystem.rightHandItem != null && inventorySystem.leftHandItem == null;
  27.  
  28.         if (item.isTwoHanded)
  29.         {
  30.             if (inventorySystem.leftHandItem == null && inventorySystem.rightHandItem == null)
  31.             {
  32.                 EquipItem(item, true, true);
  33.             }
  34.             else
  35.             {
  36.                 Debug.Log("Cannot pick up two-handed item. Hands are not empty.");
  37.             }
  38.         }
  39.         else if (inventorySystem.rightHandItem == null || isLeftHand)
  40.         {
  41.             EquipItem(item, isLeftHand, false);
  42.         }
  43.         else
  44.         {
  45.             Debug.Log("Cannot pick up item. Both hands are full.");
  46.         }
  47.     }
  48.  
  49.     private void EquipItem(Item item, bool isLeftHand, bool isTwoHanded)
  50.     {
  51.         inventorySystem.EquipItem(item, isLeftHand, isTwoHanded);
  52.         UpdateItemPosition(item.gameObject, isLeftHand);
  53.         ChangeItemLayer(item.gameObject, pickupLayer);
  54.         playerMovement.UpdateCarryingAnimations();
  55.     }
  56.  
  57.     public void UpdateItemPosition(GameObject itemObject, bool isLeftHand)
  58.     {
  59.         Transform objectHolder = isLeftHand ? leftObjectHolder : rightObjectHolder;
  60.         Item item = itemObject.GetComponent<Item>();
  61.         Vector3 positionOffset = isLeftHand ? item.leftPositionOffset : item.rightPositionOffset;
  62.         Vector3 rotationOffset = isLeftHand ? item.leftRotationOffset : item.rightRotationOffset;
  63.  
  64.         itemObject.transform.SetParent(objectHolder);
  65.         itemObject.transform.localPosition = positionOffset;
  66.         itemObject.transform.localRotation = Quaternion.Euler(rotationOffset);
  67.     }
  68.  
  69.     public void DropItem(bool isLeftHand)
  70.     {
  71.         Item itemToDrop = isLeftHand ? inventorySystem.leftHandItem : inventorySystem.rightHandItem;
  72.         if (itemToDrop != null)
  73.         {
  74.             GameObject itemObject = itemToDrop.gameObject;
  75.             itemObject.transform.SetParent(null);
  76.  
  77.             Vector3 dropPosition;
  78.             if (isPrecisionDrop)
  79.             {
  80.                 RaycastHit hit;
  81.                 if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hit, placementDistance, placementLayerMask))
  82.                 {
  83.                     dropPosition = hit.point + hit.normal * 0.05f;
  84.                     itemObject.transform.position = dropPosition;
  85.                     itemObject.transform.rotation = Quaternion.LookRotation(hit.normal, Vector3.up);
  86.                 }
  87.                 else
  88.                 {
  89.                     dropPosition = transform.position + transform.forward * 1f;
  90.                     itemObject.transform.position = dropPosition;
  91.                     itemObject.transform.rotation = Random.rotation;
  92.                 }
  93.                 isPrecisionDrop = false;
  94.             }
  95.             else
  96.             {
  97.                 dropPosition = transform.position + transform.forward * 1f + transform.right * Random.Range(-0.5f, 0.5f);
  98.                 itemObject.transform.position = dropPosition;
  99.                 itemObject.transform.rotation = Random.rotation;
  100.             }
  101.  
  102.             Rigidbody rb = itemObject.GetComponent<Rigidbody>();
  103.             if (rb == null) rb = itemObject.AddComponent<Rigidbody>();
  104.             rb.isKinematic = false;
  105.             rb.AddForce(Vector3.down * 2f, ForceMode.Impulse);
  106.  
  107.             inventorySystem.UnequipItem(isLeftHand);
  108.             RestoreOriginalLayer(itemObject);
  109.  
  110.             InteractableObject interactable = itemObject.GetComponent<InteractableObject>();
  111.             if (interactable != null)
  112.             {
  113.                 interactable.enabled = true;
  114.             }
  115.  
  116.             playerMovement.UpdateCarryingAnimations();
  117.         }
  118.     }
  119.  
  120.     public void DropBothItems()
  121.     {
  122.         DropItem(true);
  123.         DropItem(false);
  124.     }
  125.  
  126.     private void ChangeItemLayer(GameObject itemObject, LayerMask newLayer)
  127.     {
  128.         if (!originalLayers.ContainsKey(itemObject))
  129.         {
  130.             originalLayers[itemObject] = itemObject.layer;
  131.         }
  132.         itemObject.layer = (int)Mathf.Log(newLayer.value, 2);
  133.     }
  134.  
  135.     private void RestoreOriginalLayer(GameObject itemObject)
  136.     {
  137.         if (originalLayers.ContainsKey(itemObject))
  138.         {
  139.             itemObject.layer = originalLayers[itemObject];
  140.             originalLayers.Remove(itemObject);
  141.         }
  142.     }
  143.  
  144.     public void TogglePrecisionDrop()
  145.     {
  146.         isPrecisionDrop = !isPrecisionDrop;
  147.         Debug.Log(isPrecisionDrop ? "Precision drop enabled" : "Precision drop disabled");
  148.     }
  149.  
  150.     public bool IsPrecisionDropEnabled()
  151.     {
  152.         return isPrecisionDrop;
  153.     }
  154. }
  155.  
Advertisement
Add Comment
Please, Sign In to add comment