public void DropHeld() { if (pickup != null) { pickup.OnDrop(); Collider[] hits = pickup.GetComponentsInChildren <Collider>(); pickup.GetComponent <Rigidbody>().isKinematic = false; pickup = null; } }
private void Update() { if (allowPickup) { if (pickup != null) { float angle = transform.eulerAngles.y; pickup.transform.position = Vector3.Lerp(pickup.transform.position, pickupPoint.transform.position, Time.deltaTime * 5f); if (Input.GetKeyDown(KeyCode.Mouse1)) { DropHeld(); } if (Input.GetMouseButtonDown(0)) { pickup.Interact(); } } else if (pickup == null) { int hitCount = Physics.RaycastNonAlloc(Camera.main.ScreenPointToRay(Input.mousePosition), hits, Camera.main.farClipPlane, pickupLayer); if (hitCount > 0) { Vector3 dist = (transform.position + Vector3.up) - hits[0].collider.transform.position; if (dist.magnitude < pickupDistance) { SetGlowFilter(hits[0].collider.gameObject.GetComponentInChildren <MeshFilter>()); if (Input.GetMouseButtonDown(0)) { HeldInteractable potentialInteractable = hits[0].collider.gameObject.GetComponent <Pickup>(); if (potentialInteractable.CanPickup()) { pickup = potentialInteractable; pickup.OnPickup(this); SetGlowFilter(null); pickup.GetComponent <Rigidbody>().isKinematic = true; } } } } else { SetGlowFilter(null); } } } Vector3 dif = Input.mousePosition - Camera.main.WorldToScreenPoint(transform.position + Vector3.up); dif.z = 0; dif = dif.normalized; if (Vector3.Dot(dif, Vector3.up) > -0.5f) { pickupPoint.position = transform.position + Vector3.up + dif.normalized * plugHoldingRange; } for (int i = 0; i < colliders.Count; i++) { foreach (Collider col in myCols) { Physics.IgnoreCollision(col, colliders[i], false); } } RaycastHit hit; if (Physics.Raycast(new Ray(transform.position + Vector3.up, Vector3.up), out hit, 2.2f, walkLayer)) { lastFallTime = Time.time; foreach (Collider col in myCols) { Physics.IgnoreCollision(col, hit.collider, true); } colliders.Add(hit.collider); } if (Input.GetKey(KeyCode.S)) { if (Physics.Raycast(new Ray(transform.position + Vector3.up, Vector3.down), out hit, 2.2f, walkLayer)) { lastFallTime = Time.time; foreach (Collider col in myCols) { Physics.IgnoreCollision(col, hit.collider, true); } colliders.Add(hit.collider); } } if (Time.time - lastFallTime <= fallTimeDelay) { //keeps player from getting stuck in layers already falling through Collider[] tcols = Physics.OverlapCapsule(transform.position + Vector3.up * (0.5f), transform.position + Vector3.up * 1.5f, 0.4f, walkLayer); for (int i = 0; i < tcols.Length; i++) { foreach (Collider col in myCols) { Physics.IgnoreCollision(col, tcols[i], true); } colliders.Add(tcols[i]); } if (tcols.Length > 0) { lastFallTime = Time.time; } } }