using System.Collections; using System.Collections.Generic; using UnityEngine; public class CustomCursor : MonoBehaviour { [Header("Курсори")] [SerializeField] private Texture2D normalCursor; [SerializeField] private Texture2D targetCursor; [SerializeField] private Vector2 hotspot = new Vector2(16, 16); [Header("Підняття")] [SerializeField] private Camera cameraMain; [SerializeField] private float pickupDistance = 5f; [SerializeField] private float holdDistance = 3.4f; [SerializeField] private Vector3 holdOffset = new Vector3(0, 0.5f, 0); [SerializeField] private float moveSpeed = 15f; [Header("Кидання")] [SerializeField] private float throwForwardForce = 5f; [SerializeField] private float throwUpForce = 3f; [SerializeField] private KeyCode throwKey = KeyCode.Mouse0; private GameObject _heldObject; private Rigidbody _heldObjectRb; private AirTrailController _currentTrail; private void Start() { if (cameraMain == null) cameraMain = Camera.main; Cursor.SetCursor(normalCursor, hotspot, CursorMode.Auto); } private void Update() { Ray ray = cameraMain.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (_heldObject != null) { if (Input.GetKeyDown(KeyCode.E)) { PlaceObject(); return; } if (Input.GetKeyDown(throwKey)) { ThrowObject(); return; } } else { if (Physics.Raycast(ray, out hit, pickupDistance)) { if (hit.collider.CompareTag("Target")) { Cursor.SetCursor(targetCursor, hotspot, CursorMode.Auto); if (Input.GetKeyDown(KeyCode.E)) PickupObject(hit.collider.gameObject); } else { Cursor.SetCursor(normalCursor, hotspot, CursorMode.Auto); } } else { Cursor.SetCursor(normalCursor, hotspot, CursorMode.Auto); } } } private void FixedUpdate() { if (_heldObject != null) HoldObjectAtCursor(); } private void PickupObject(GameObject obj) { _heldObject = obj; _heldObjectRb = obj.GetComponent(); _heldObjectRb.useGravity = false; _heldObjectRb.velocity = Vector3.zero; _heldObjectRb.drag = 10f; _heldObjectRb.angularDrag = 10f; _currentTrail = _heldObject.GetComponentInChildren(); if (_currentTrail != null) { _currentTrail.Deactivate(); } } private void PlaceObject() { bool isMoonObject = _heldObject.GetComponent() != null; _heldObjectRb.useGravity = !isMoonObject; _heldObjectRb.drag = 0f; _heldObjectRb.angularDrag = 0.05f; _heldObjectRb.velocity = Vector3.zero; if (_currentTrail != null) { _currentTrail.Deactivate(); } _heldObject = null; _heldObjectRb = null; _currentTrail = null; } private void HoldObjectAtCursor() { Ray ray = cameraMain.ScreenPointToRay(Input.mousePosition); Vector3 targetPos = ray.GetPoint(holdDistance) + holdOffset; Vector3 dir = targetPos - _heldObject.transform.position; _heldObjectRb.velocity = dir * moveSpeed; } private void ThrowObject() { if (_currentTrail != null) { Vector3 tailStart = _heldObject.transform.position - cameraMain.transform.forward * 0.3f; _currentTrail.Activate(tailStart); } ObjectPhysicsInfo earthInfo = _heldObject.GetComponent(); if (earthInfo != null) earthInfo.OnRelease(); MoonObjectInfo moonInfo = _heldObject.GetComponent(); if (moonInfo != null) moonInfo.OnRelease(); bool isMoonObject = _heldObject.GetComponent() != null; _heldObjectRb.useGravity = !isMoonObject; _heldObjectRb.drag = 0f; _heldObjectRb.angularDrag = 0.05f; Vector3 throwDir = cameraMain.transform.forward * throwForwardForce + Vector3.up * throwUpForce; _heldObjectRb.velocity = throwDir; _heldObject = null; _heldObjectRb = null; _currentTrail = null; } }