Hey, I'm making an AR-Escape-Room with ARKit but unfortunately I havent found a good solution for carrying objects around in the virtual room. I'm quite new to coding so I patchworked a script together, but it doesen't seem to be the right thing. (I don't want to use a UI or inventory system to keep the immersion) I've tried different things like a physics gun seen in garry's mod () but it just doesn't work for me. It's very important to move the Rigidbody of the objects to prevent them from doing funny things like shaking with the boxcolliders and have them face the camera/player (seen in the first part of the video). I managed this by using "LookAt()", but this brings the shaking issue back. In line 193 of my code theres a condition so i can controll wich objects should be affected by "LookAt()" using the mass. I dont think thats a ellegant solution, but thats the only thing I came up with... when i took this out of my code, thing just hang around, because I'm using a SpringJoint. here's the code I put on the Camera: Code (CSharp): using UnityEngine; using System.Collections; using System.Collections.Generic; namespace UnityStandardAssets.Utility { public class TouchInput1 : MonoBehaviour { //Später löschen public Transform locTarget; public GameObject rotTarget; public LayerMask touchInputMask; private List<GameObject> touchList = new List<GameObject>(); private GameObject[] touchesOld; public RaycastHit hit; const float k_Spring = 100.0f; const float k_Damper = 0.0f; const float k_Drag = 10.0f; const float k_AngularDrag = 5.0f; const float k_Distance = 0f; const bool k_AttachToCenterOfMass = false; private SpringJoint m_SpringJoint; // Update is called once per frame void Update() { var mainCamera = FindCamera(); RaycastHit hit = new RaycastHit(); #if UNITY_EDITOR if (Input.GetMouseButton(0) || Input.GetMouseButtonDown(0) || Input.GetMouseButtonUp(0)) { touchesOld = new GameObject[touchList.Count]; touchList.CopyTo(touchesOld); touchList.Clear(); Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit, touchInputMask)) { GameObject recipient = hit.transform.gameObject; touchList.Add(recipient); if (Input.GetMouseButtonDown(0)) { recipient.SendMessage("OnTouchDown", hit.point, SendMessageOptions.DontRequireReceiver); } if (Input.GetMouseButtonUp(0)) { recipient.SendMessage("OnTouchUp", hit.point, SendMessageOptions.DontRequireReceiver); } if (Input.GetMouseButton(0)) { recipient.SendMessage("OnTouchStay", hit.point, SendMessageOptions.DontRequireReceiver); } } foreach (GameObject g in touchesOld) { if (!touchList.Contains(g)) { g.SendMessage("OnTouchExit", hit.point, SendMessageOptions.DontRequireReceiver); } } } #endif if (Input.touchCount > 0) { touchesOld = new GameObject[touchList.Count]; touchList.CopyTo(touchesOld); touchList.Clear(); foreach (Touch touch in Input.touches) { Ray ray = Camera.main.ScreenPointToRay(touch.position); if (Physics.Raycast(ray, out hit, touchInputMask)) { GameObject recipient = hit.transform.gameObject; touchList.Add(recipient); if (touch.phase == TouchPhase.Began) { recipient.SendMessage("OnTouchDown", hit.point, SendMessageOptions.DontRequireReceiver); } if (touch.phase == TouchPhase.Ended) { recipient.SendMessage("OnTouchUp", hit.point, SendMessageOptions.DontRequireReceiver); } if (touch.phase == TouchPhase.Stationary || touch.phase == TouchPhase.Moved) { recipient.SendMessage("OnTouchStay", hit.point, SendMessageOptions.DontRequireReceiver); } if (touch.phase == TouchPhase.Canceled) { recipient.SendMessage("OnTouchExit", hit.point, SendMessageOptions.DontRequireReceiver); } } } foreach (GameObject g in touchesOld) { if (!touchList.Contains(g)) { g.SendMessage("OnTouchExit", hit.point, SendMessageOptions.DontRequireReceiver); } } } if ( !Physics.Raycast(mainCamera.ScreenPointToRay(Input.mousePosition).origin, mainCamera.ScreenPointToRay(Input.mousePosition).direction, out hit, 100, Physics.DefaultRaycastLayers)) { return; } // We need to hit a rigidbody that is not kinematic if (!hit.rigidbody || hit.rigidbody.isKinematic) { return; } if (!m_SpringJoint) { var go = new GameObject("Rigidbody dragger"); Rigidbody body = go.AddComponent<Rigidbody>(); m_SpringJoint = go.AddComponent<SpringJoint>(); body.isKinematic = true; } m_SpringJoint.transform.position = hit.point; m_SpringJoint.anchor = Vector3.zero; m_SpringJoint.spring = k_Spring; m_SpringJoint.damper = k_Damper; m_SpringJoint.maxDistance = k_Distance; m_SpringJoint.connectedBody = hit.rigidbody; StartCoroutine("DragObject", hit.distance); } private IEnumerator DragObject(float distance) { var oldDrag = m_SpringJoint.connectedBody.drag; var oldAngularDrag = m_SpringJoint.connectedBody.angularDrag; m_SpringJoint.connectedBody.drag = k_Drag; m_SpringJoint.connectedBody.angularDrag = k_AngularDrag ; var mainCamera = FindCamera(); while (Input.GetMouseButton(0)) { var ray = mainCamera.ScreenPointToRay(Input.mousePosition); m_SpringJoint.transform.position = ray.GetPoint(distance); yield return null; //Sorgt für shakes if (m_SpringJoint.connectedBody.mass < 1) { m_SpringJoint.connectedBody.transform.LookAt(locTarget); m_SpringJoint.connectedBody.transform.rotation = rotTarget.transform.rotation; } } if (m_SpringJoint.connectedBody) { m_SpringJoint.connectedBody.drag = oldDrag; m_SpringJoint.connectedBody.angularDrag = oldAngularDrag; m_SpringJoint.connectedBody = null; } } private Camera FindCamera() { if (GetComponent<Camera>()) { return GetComponent<Camera>(); } return Camera.main; } } } I've made a video to make the problem clearer (second part without clipping issue, because "LookAt()" is commented out.) long story short, the thing I want is: as soon as the player comes close to a carryable object, he should be able to pick it up on touch, drag it by touch or movement of the smartphone and it should face to the player. maybe someone comes up with a good solution Greetings Dave