http://blog.csdn.net/sysujackjiao/article/details/69396274

一、鼠标拾取物体的原理

Unity3D当中,想要在观察面(Aspect)中拾取物体(有碰撞属性)的方法一般如下:

1、声明一个观察的摄像机、一个从摄像机原点出发的射线Ray以及一个用于检测碰撞的RaycastHit;

2、将射线Ray定义为从摄像机原点出发并且指向当前鼠标所在的坐标(屏幕坐标);

3、定义碰撞RaycastHit为射线Ray与有碰撞属性的物体的碰撞点。

具体代码实现如下(C#代码):

  1. <span style="font-size:10px;">using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class camera : MonoBehaviour
  5. {
  6. public Camera ca;
  7. private Ray ra;
  8. private RaycastHit hit;
  9. // Use this for initialization
  10. void Start()
  11. {
  12. }
  13. // Update is called once per frame
  14. void Update()
  15. {
  16. ra = ca.ScreenPointToRay(Input.mousePosition);
  17. if (Physics.Raycast(ra, out hit))
  18. {
  19. }
  20. }
  21. }</span>

应用一:当鼠标按住不动时,移动被选定物体随鼠标一起移动

  1. <span style="font-size:10px;">using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class camera : MonoBehaviour
  5. {
  6. public Camera ca;
  7. private Ray ra;
  8. private RaycastHit hit;
  9. // Use this for initialization
  10. void Start()
  11. {
  12. }
  13. // Update is called once per frame
  14. void Update()
  15. {
  16. if (Input.GetMouseButton(0))
  17. {
  18. ra = ca.ScreenPointToRay(Input.mousePosition);
  19. if (Physics.Raycast(ra, out hit))
  20. {
  21. hit.collider.gameObject.transform.position = ca.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, hit.collider.gameObject.transform.position.z));
  22. }
  23. }
  24. }
  25. }</span>

应用二:当鼠标点击物体时,物体随鼠标一起移动;当鼠标再次点击时,放下物体。

  1. <span style="font-size:12px;">using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class camera : MonoBehaviour {
  5. public Camera ca;
  6. private Ray ra;
  7. private RaycastHit hit;
  8. private int flag = 0;
  9. // Use this for initialization
  10. void Start () {
  11. }
  12. // Update is called once per frame
  13. void Update () {
  14. if (Input.GetMouseButtonDown(0))
  15. {
  16. ra = ca.ScreenPointToRay(Input.mousePosition);
  17. if (Physics.Raycast(ra, out hit))
  18. {
  19. if (flag == 0)
  20. {
  21. flag = 1;
  22. } else
  23. {
  24. flag = 0;
  25. }
  26. }
  27. }
  28. if (flag == 1)
  29. {
  30. hit.collider.gameObject.transform.position = ca.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, hit.collider.gameObject.transform.position.z));
  31. }
  32. }
  33. }
  34. </span>

Unity3D鼠标坐标转世界坐标和局部坐标

鼠标坐标转世界坐标和局部坐标:
Vector3 MousePosition2Local () {
mousePosition = Input.mousePosition; //获取屏幕坐标
mouseWorldPos = Camera.main.ScreenToWorldPoint (mousePosition); //屏幕坐标转世界坐标
mouseLocalPos = transform.parent.transform.InverseTransformPoint (mouseWorldPos); //世界坐标转本地坐标 return CorrectPos(mouseLocalPos);
}

【转】Unity3D 入门小技巧——鼠标拾取并移动物体的更多相关文章

  1. Unity3D使用小技巧

    原地址:http://unity3d.9tech.cn/news/2014/0411/40178.html 1.Crtl+f摄像机自动适配场景. 2.可以用一个立方体作为底盘. 3.人物角色可以直接引 ...

  2. iOS Xcode 小技巧,提升理解查询能力,Command + 点击鼠标右键 Jump to Definition等

    前言: 介绍下Xcode 小技巧,以及一下快捷键,让你调试程序更加出类拔萃,安排! Command + 点击鼠标右键 Jump to Definition,可能你平时也在用,但是你明白全部的用法吗,试 ...

  3. IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题

    IT咨询顾问:一次吐血的项目救火   年后的一个合作公司上线了一个子业务系统,对接公司内部的单点系统.我收到该公司的技术咨询:项目启动后没有规律的突然无法登录了,重新启动后,登录一断时间后又无法重新登 ...

  4. Python爬虫简单入门及小技巧

    刚刚申请博客,内心激动万分.于是为了扩充一下分类,随便一个随笔,也为了怕忘记新学的东西由于博主十分怠惰,所以本文并不包含安装python(以及各种模块)和python语法. 目标 前几天上B站时看到一 ...

  5. 《转》Unity3D研究院之UGUI一个优化效率小技巧

    无意间发现了一个小技巧.如下图所示,可以发现UGUI的Image组件的RaycastTarget勾选以后会消耗一些效率,为了节省效率就不要勾选它了,不仅Image组件Text组件也有这样的问题. 一般 ...

  6. GJM : Unity3D - UI - UI边缘流光特效小技巧 [转载]

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  7. Python入门:数据结构的3个小技巧

    这是关于Python的第11篇文章,主要介绍下数据结构的3个小技巧. 排序: 使用sorted函数实现排序. sorted函数按照长短.大小.英文字母的顺序给每个列表的元素进行排序.这个函数经常在数据 ...

  8. [Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手"

    [Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手" 我在学Unity3D,TankSniper(坦克狙击手)这个项目是用来练手的.游戏玩法来自这里(http://ww ...

  9. 【Xamarin挖墙脚系列:代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧(转)】

    正愁如何选择构建项目中的视图呢,现在官方推荐画板 Storybord...但是好像 xib貌似更胜一筹.以前的老棒子总喜欢装吊,用代码写....用代码堆一个HTML页面不知道你们尝试过没有.等页面做出 ...

随机推荐

  1. squid隐藏squid的版本号

    reply_header_access Via deny all reply_header_access Cache-Control deny all reply_header_access Serv ...

  2. 更换PostgreSql的data文件夹并重新服务器(此方法同样适用于系统崩溃后,找回数据的操作)

    *如果是系统崩溃,需要找回数据,PostgreSQL安装目录的data文件夹要存在 1.备份PostgreSQL安装目录到其他目录下 2.停止Postgres服务,可以在运行中输入services.m ...

  3. OO2019第四单元作业总结

    一.本单元两次作业的架构设计  1.第一次作业 第一次作业由于时间仓促,没有过多的架构设计,就直接补全了所给的MyUmlInteraction类,导致整个程序的代码风格和效率都不高,在强测中也因此失掉 ...

  4. React后台管理系统-file-uploader组件

    1.React文件上传组件github地址: https://github.com/SoAanyip/React-FileUpload 2.Util里边新建file-uploader文件夹,里边新建i ...

  5. Linux MySQL 修改密码

    修改root本地登录密码 修改root默认的密码(方法一)1. 启动mysql之后systemctl start mysqld.service2. 修改mysql的配置文件 vi /etc/my.cn ...

  6. oc数组遍历

    #import <Foundation/Foundation.h> //数组遍历(枚举)对集合中的元素依此不重复的进行遍历 int main(int argc, const char * ...

  7. elasticsearch 7 安装

    elasticsearch 安装 操作系统:CentOS Linux release 7.4 elasticsearch:elasticsearch-7.1.1 es7+centos7 1.软件下载 ...

  8. Laravel 命令行常用命令

    一.简介 1.Artisan 是 Laravel 自带的命令行接口名称,它为我们在开发过程中提供了很多有用的命令.想要查看所有可用的Artisan命令,可使用list命令: php artisan l ...

  9. 07.VUE学习之解决phpstorm不识别ECMASCRIPT6语法的问题

    此时已经识别:

  10. 826. Most Profit Assigning Work

    https://leetcode.com/problems/most-profit-assigning-work/description/ class Solution { public: int m ...