您的位置:首页 > 移动开发 > Unity3D

<Unity>鼠标拖动物体、按下鼠标左键旋转观察物体、鼠标滚轮缩放视野

2015-10-23 22:08 1021 查看
如题目所示,本文实现这三个效果。所有代码都在pc端成功运行,移植到手机端改变相应的判断条件即可,核心算法没有问题。

一、 鼠标拖拽移动物体

效果演示



源代码

public class mousedrag : MonoBehaviour
{

private Vector3 targetScreenpos;//拖拽物体的屏幕坐标
private Vector3 targetWorldpos;//拖拽物体的世界坐标
private  Transform target;//拖拽物体
private Vector3 mouseScreenpos;//鼠标的屏幕坐标
private Vector3 offset;//偏移量
Color oricolor = Color.black;//物体本来的颜色

void Start ()
{
target = transform;
}

void OnMouseEnter()
{
//当鼠标在物体上时,改变物体颜色。
GetComponent<Renderer>().material.color = Color.blue;
}
void OnMouseExit()
{
GetComponent<Renderer>().material.color = oricolor;
}

//被移动物体需要添加collider组件,以响应OnMouseDown()函数
//基本思路。当鼠标点击物体时(OnMouseDown(),函数体里面代码只执行一次),记录此时鼠标坐标和物体坐标,并求得差值。如果此后用户仍然按着鼠标左键,那么保持之前的差值不变即可。
//由于物体坐标是世界坐标,鼠标坐标是屏幕坐标,需要进行转换。具体过程如下所示。
IEnumerator OnMouseDown()
{
targetScreenpos = Camera.main.WorldToScreenPoint(target.position);
mouseScreenpos = new Vector3(Input.mousePosition.x,Input.mousePosition.y,targetScreenpos.z);
offset = target.position -Camera.main.ScreenToWorldPoint(mouseScreenpos);

while(Input.GetMouseButton(0))//鼠标左键被持续按下。
{
mouseScreenpos = new    Vector3(Input.mousePosition.x,Input.mousePosition.y,targetScreenpos.z);
targetWorldpos = Camera.main.ScreenToWorldPoint(mouseScreenpos) + offset;
target.position = targetWorldpos;
yield return new WaitForFixedUpdate();
}
}
}


二、滚轮控制视野缩放

效果演示



void Update()
{
Camera.main.fieldOfView = Camera.main.fieldOfView + Input.GetAxis("Mouse ScrollWheel")*20;
}


在移动端时,需要判断两手指的移动距离。不在这里写出来了。

三、按下鼠标左键旋转物体

效果演示



源代码

//旋转速度,需要调试
public float xSpeed = 250.0f;
public float ySpeed = 130.0f;
//限制旋转角度,物体绕x轴旋转限制,不能上下颠倒。
public float yMinLimit = -30;
public float yMaxLimit = 30;
//物体的旋转角度
public float x = 0.0f;
public float y = 0.0f;
void Start()
{
//初始化旋转角度,记录开始时物体的旋转角度。
Vector3 angels = transform.eulerAngles;
x = angels.y;
y = angels.x;
//
}
void Update()
{
if(Input.GetMouseButton(0))
{
//鼠标沿x轴的移动乘以系数当作物体绕y轴的旋转角度。
//鼠标沿y轴的移动乘以系数当作物体绕x轴的旋转角度。
x += Input.GetAxis("Mouse X")*xSpeed*0.02f;
y += Input.GetAxis("Mouse Y")*ySpeed*0.02f;
}
}
void LateUpdate()
{
//限制绕x轴的移动。
y = Mathf.Clamp(y,yMinLimit,yMaxLimit);
Quaternion rotation = Quaternion.Euler(y,-x,0);
transform.rotation = rotation;
}


这里部分参考了宣雨松的代码。

上周找了个实习,是用unreal做虚拟现实和游戏的,所以最近一直在熟悉虚幻4的UMG和blueprint。感觉blueprint可视化编程确实效率很高,在开发大型游戏、虚拟现实方面可以减轻一定的代码工作量,不过虚幻的umg系统确实太垃圾了,ui做起来太费事。

今后可能unity方面的文章会很少写了,抓紧时间学习虚幻引擎。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: