关闭

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

标签: unity
3493人阅读 评论(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方面的文章会很少写了,抓紧时间学习虚幻引擎。

2
0
查看评论

Unity中鼠标左键按下,拖拽物体移动

把这段脚本拖给想要拖拽的物体,然后加上碰撞盒就可以了。   private Vector3 _vec3TargetScreenSpace;// 目标物体的屏幕空间坐标 private Vector3 _vec3TargetWorldSpace;// 目标物体的世界空间坐标 ...
  • Haohan_Meng
  • Haohan_Meng
  • 2014-01-20 14:23
  • 38870

unity3D C#脚本实现鼠标拖动物体

using System.Collections; public class clickmove : MonoBehaviour { // Use this for initialization void Start () { } // Update is ca...
  • tc1hen
  • tc1hen
  • 2013-01-02 20:26
  • 23536

unity鼠标拖动三维物体

鼠标拖动三维物体移动  private Vector3 _vec3TargetScreenSpace;// 目标物体的屏幕空间坐标  private Vector3 _vec3TargetWorldSpace;// 目标...
  • zdmqweasdzxc
  • zdmqweasdzxc
  • 2015-07-08 15:33
  • 278

Unity3D 入门小技巧——鼠标拾取并移动物体

一、鼠标拾取物体的原理 在Unity3D当中,想要在观察面(Aspect)中拾取物体(有碰撞属性)的方法一般如下: 1、声明一个观察的摄像机、一个从摄像机原点出发的射线Ray以及一个用于检测碰撞的RaycastHit; 2、将射线Ray定义为从摄像机原点出发并且指向当前鼠标所在的坐...
  • SYSUJackJiao
  • SYSUJackJiao
  • 2017-04-06 16:23
  • 3326

Unity3D中拖动物体移动脚本

  • 2013-10-11 19:25
  • 889B
  • 下载

Unity2D中使用鼠标拖动物体移动

昨天用unity开发了一个微信的飞机大战,效果图如下。期间遇到了很多问题都一一解决了,印象最深的问题就是如何用鼠标拖动飞机的移动。今天我就把我的方法拿出来分享。 我的方法是在飞机物体中写一个脚本。在Update中先检测鼠标是否按下。 代码是这样的: private bool isM...
  • u011185231
  • u011185231
  • 2015-11-20 16:50
  • 3804

Unity3D 鼠标拖动和旋转物体以及鼠标拖动图片

1.鼠标拖动物体Cube using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; /// /// 脚本挂到一个Cube上...
  • yang_sheng_21
  • yang_sheng_21
  • 2017-12-14 17:40
  • 166

unity 3d中简单巧妙的实现拖动鼠标旋转物体

using UnityEngine; using System.Collections; public class BaseRotate : MonoBehaviour { public Vector3 mousePos; IEnumerator OnMouseDown() ...
  • WF_unity
  • WF_unity
  • 2014-04-23 08:42
  • 2538

unity3d用鼠标拖动物体的一段代码

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25...
  • dlnuchunge
  • dlnuchunge
  • 2012-03-16 21:09
  • 4065

unity3D C#脚本实现鼠标拖动物体

using System.Collections;      public class clickmove : MonoBehaviour {      ...
  • huang9012
  • huang9012
  • 2014-05-28 14:08
  • 4846
    个人资料
    • 访问:155696次
    • 积分:1578
    • 等级:
    • 排名:千里之外
    • 原创:23篇
    • 转载:10篇
    • 译文:1篇
    • 评论:9条
    文章分类
    最新评论