Unity 마우스 커서를 사용하여 Rigidbody를 드래그하는 방법
마우스 커서로 Rigidbodies를 드래그하려면 카메라에 첨부될 스크립트를 생성해야 하며 Rigidbody를 클릭했는지 감지해야 합니다. 클릭된 경우 드래그 동작을 초기화합니다.
SC_DragRigidbody.cs
using UnityEngine;
public class SC_DragRigidbody : MonoBehaviour
{
public float forceAmount = 500;
Rigidbody selectedRigidbody;
Camera targetCamera;
Vector3 originalScreenTargetPosition;
Vector3 originalRigidbodyPos;
float selectionDistance;
// Start is called before the first frame update
void Start()
{
targetCamera = GetComponent<Camera>();
}
void Update()
{
if (!targetCamera)
return;
if (Input.GetMouseButtonDown(0))
{
//Check if we are hovering over Rigidbody, if so, select it
selectedRigidbody = GetRigidbodyFromMouseClick();
}
if (Input.GetMouseButtonUp(0) && selectedRigidbody)
{
//Release selected Rigidbody if there any
selectedRigidbody = null;
}
}
void FixedUpdate()
{
if (selectedRigidbody)
{
Vector3 mousePositionOffset = targetCamera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, selectionDistance)) - originalScreenTargetPosition;
selectedRigidbody.velocity = (originalRigidbodyPos + mousePositionOffset - selectedRigidbody.transform.position) * forceAmount * Time.deltaTime;
}
}
Rigidbody GetRigidbodyFromMouseClick()
{
RaycastHit hitInfo = new RaycastHit();
Ray ray = targetCamera.ScreenPointToRay(Input.mousePosition);
bool hit = Physics.Raycast(ray, out hitInfo);
if (hit)
{
if (hitInfo.collider.gameObject.GetComponent<Rigidbody>())
{
selectionDistance = Vector3.Distance(ray.origin, hitInfo.point);
originalScreenTargetPosition = targetCamera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, selectionDistance));
originalRigidbodyPos = hitInfo.collider.transform.position;
return hitInfo.collider.gameObject.GetComponent<Rigidbody>();
}
}
return null;
}
}
설정
- SC_DragRigidbody 스크립트를 카메라에 연결
- 드래그하려는 객체를 카메라 앞에 배치합니다(드래그하려는 객체에 Rigidbody 구성 요소가 연결되어 있는지 확인하세요).
이제 마우스 커서로 Rigidbodies를 드래그할 수 있습니다!