今天做了个关于鼠标拾取的例子,现在场景中有一个物体,我们想实现一个功能是:点击一次物体,再移动鼠标,物体会跟随鼠标的光标移动的功能。
现在场景中有一个测量工具磁钢表,它就是我们所说的物体,如图:
附上代码:
public class MouseFollow2 : MonoBehaviour {
Camera camera;
Quaternion _cigangbiaoRotateStart = Quaternion.Euler(90f, 90f, 180f);
Quaternion _cigangbiaoRotateEnd = Quaternion.Euler(0f, 270f, 0f);
public float rotateSpeed;
private bool isInput;
Vector3 screenPosition;
Vector3 mScreenPosition;
Vector3 offset;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (isInput)
{
transform.localRotation = Quaternion.RotateTowards(_cigangbiaoRotateStart, _cigangbiaoRotateEnd, rotateSpeed);
//鼠标屏幕上新位置
mScreenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);
// 对象新坐标
transform.position = offset + camera.ScreenToWorldPoint(mScreenPosition);
}
}
IEnumerator OnMouseDown()
{
camera = Camera.main;
if (camera)
{
//转换对象到当前屏幕位置
screenPosition = camera.WorldToScreenPoint(transform.position);
//鼠标屏幕坐标
mScreenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);
//获得鼠标和对象之间的偏移量,拖拽时相机应该保持不动
offset = transform.position - camera.ScreenToWorldPoint(mScreenPosition);
print("drag starting:" + transform.name);
//若鼠标左键一直按着则循环继续
if(Input.GetMouseButton(0))
{
if (!isInput)
{
isInput = true;
}
else
{
isInput = false;
}
}
yield return new WaitForFixedUpdate();
print("drag compeleted");
}
}
}
将该脚本绑在这个物体对象上,功能完成。现在你可以按下鼠标左键一次选中该物体,移动光标,物体会跟随光标移动,再点击鼠标左键一次,物体“被放在了你想要放置的位置”。
下面是关于鼠标左键按住不放的功能代码,同样将这段代码绑定在物体对象上,实现该功能。
public class MouseFollow2 : MonoBehaviour {
Camera camera;
Quaternion _cigangbiaoRotateStart = Quaternion.Euler(90f, 90f, 180f);
Quaternion _cigangbiaoRotateEnd = Quaternion.Euler(0f, 270f, 0f);
public float rotateSpeed;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
IEnumerator OnMouseDown()
{
camera = Camera.main;
if (camera)
{
//转换对象到当前屏幕位置
Vector3 screenPosition = camera.WorldToScreenPoint(transform.position);
//鼠标屏幕坐标
Vector3 mScreenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);
//获得鼠标和对象之间的偏移量,拖拽时相机应该保持不动
Vector3 offset = transform.position - camera.ScreenToWorldPoint(mScreenPosition);
print("drag starting:" + transform.name);
//若鼠标左键一直按着则循环继续
if(Input.GetMouseButton(0))
{
transform.localRotation = Quaternion.RotateTowards(_cigangbiaoRotateStart, _cigangbiaoRotateEnd, rotateSpeed);
//鼠标屏幕上新位置
mScreenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);
// 对象新坐标
transform.position = offset + camera.ScreenToWorldPoint(mScreenPosition);
}
yield return new WaitForFixedUpdate();
print("drag compeleted");
}
}
}