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 עם סמן העכבר!