private void Update() { if (nearbyObjects.Count < 1) { HideTipCanvas(); } else if (nearbyObjects.Count > 1 && previousPlayerPosition != player.transform.position) { closestObject = FindNearestObject(); } if (Input.GetMouseButtonDown(0) && pickUpAndDropReady && nearbyObjects.Count > 0) { PickUpObject(FindNearestObject()); } previousPlayerPosition = player.transform.position; if (tipCanvas_LeftClick.activeSelf) { tipCanvas_LeftClick.transform.LookAt(playerCamera.transform); if (closestObject != null) { // Hämtar objektes egna inställning för positionen av vänsterklick-tipset. Om ingen inställning hittas anges ett default värde. ItemAndTip_Positioning pos = closestObject.GetComponent <ItemAndTip_Positioning>() ?? null; tipCanvas_LeftClick.transform.position = closestObject.transform.position + ((pos != null) ? pos.GetTipPosition() : new Vector3(0f, 1f, 0f)); } else { tipCanvas_LeftClick.SetActive(false); } } }
private bool PickUpObject(GameObject objectToPickUp) { if (objectToPickUp != null) { DropObject(true); currentlyHoldingObject = objectToPickUp; objectToPickUp.tag = "Untagged"; nearbyObjects.Remove(objectToPickUp); closestObject = FindNearestObject(); Rigidbody rb = objectToPickUp.GetComponent <Rigidbody>(); rb.constraints = RigidbodyConstraints.FreezeAll; foreach (var item in currentlyHoldingObject.GetComponents <Collider>()) { item.enabled = false; } Transform t = objectToPickUp.transform; ItemAndTip_Positioning pos = t.gameObject.GetComponent <ItemAndTip_Positioning>() ?? null; t.SetParent(player.transform); StartCoroutine(LerpObject(t, pos)); ToggleGlitterEffect(t, false); return(true); } return(false); }
IEnumerator LerpObject(Transform t, ItemAndTip_Positioning pos) { pickUpAndDropReady = false; bool lerping = true; Vector3 endPosition; Vector3 endRotation = Quaternion.identity.eulerAngles; if (pos != null) { endPosition = pos.GetItemPosition(); if (pos.GetItemRotation() != Vector3.zero) { endRotation = pos.GetItemRotation(); } if (pos.GetPlaceObjectInHand()) { t.SetParent(rightHand); } } else { endPosition = new Vector3(0, defaultItemDistanceFromPlayer_Y, defaultItemDistanceFromPlayer_Z); } Vector3 startPosition = t.localPosition; Vector3 startRotation = t.localRotation.eulerAngles; float time = 0.0f; float fracJourney; while (lerping) { yield return(new WaitForEndOfFrame()); fracJourney = Mathf.Clamp01(time / pickUpSpeed); t.localPosition = Vector3.Lerp(startPosition, endPosition, fracJourney); //t.localRotation = Quaternion.Lerp(startRotation, new Quaternion(endRotation.x, endRotation.y, endRotation.z, 0), fracJourney); //t.localEulerAngles = Vector3.Lerp(startRotation, endRotation, fracJourney); t.localEulerAngles = new Vector3( Mathf.LerpAngle(startRotation.x, endRotation.x, fracJourney), Mathf.LerpAngle(startRotation.y, endRotation.y, fracJourney), Mathf.LerpAngle(startRotation.z, endRotation.z, fracJourney)); time += Time.deltaTime; if (fracJourney > 0.99f) { lerping = false; } } pickUpAndDropReady = true; }