1. 代码
using UnityEngine;
public class ObjectManipulation : MonoBehaviour
{
public float MinScale = 0.2f;
public float MaxScale = 3.0f;
private float scaleRate = 1f;
private float newScale;
private Ray ray;
private RaycastHit hitInfo;
private bool isDragging = false;
private Vector3 offset;
private float rotationSpeed = 5.0f;
private void OnMouseDown()
{
isDragging = true;
offset = gameObject.transform.position - GetMouseWorldPosition();
}
private void OnMouseUp()
{
isDragging = false;
}
private void Update()
{
if (isDragging)
{
Vector3 newPosition = GetMouseWorldPosition() + offset;
transform.position = newPosition;
}
if (Input.GetMouseButton(1))
{
float mousX = Input.GetAxis("Mouse X");
float mousY = Input.GetAxis("Mouse Y");
transform.Rotate(mousY * rotationSpeed, -mousX * rotationSpeed, 0, Space.World);
}
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hitInfo))
{
if (Input.GetAxis("Mouse ScrollWheel") != 0)
{
newScale += Input.GetAxis("Mouse ScrollWheel") * scaleRate;
newScale = Mathf.Clamp(newScale, MinScale, MaxScale);
transform.localScale = new Vector3(newScale, newScale, newScale);
}
}
}
private Vector3 GetMouseWorldPosition()
{
Vector3 mousePos = Input.mousePosition;
mousePos.z = -Camera.main.transform.position.z;
return Camera.main.ScreenToWorldPoint(mousePos);
}
}
2. 测试场景