关闭

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

标签: unity
2737人阅读 评论(1) 收藏 举报
分类:

如题目所示,本文实现这三个效果。所有代码都在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方面的文章会很少写了,抓紧时间学习虚幻引擎。

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:127905次
    • 积分:1397
    • 等级:
    • 排名:千里之外
    • 原创:23篇
    • 转载:10篇
    • 译文:1篇
    • 评论:7条
    文章分类
    最新评论