一、鼠标拾取物体的原理

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

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

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

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

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

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

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

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

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

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

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

关于Unity3D中鼠标移动指定物体的解决方案的更多相关文章

  1. Unity3D 中鼠标按下时OnMouseDown()、Input.GetMouseButtonDown()和EventType.MouseDown的响应验证

    初学unity3D,对于其中的事件响应不是很清楚,于是写了下面的代码来验证: 1.新建.cs文件,名为testMouse.cs: using UnityEngine; using System.Col ...

  2. (转)Unity3D中移动物体位置的几种方法

    1. 简介 在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position. 2. 通过Transform组件移动物体 Transform 组件用于描述物体在 ...

  3. unity3d中让物体显示和隐藏

    unity3d中让物体显示和隐藏的方法 gameObject.renderer.enabled //是控制一个物体是否在屏幕上渲染或显示  而物体实际还是存在的 仅仅是想当于隐身 而物体本身的碰撞体还 ...

  4. 关于Unity中鼠标选取物体的解决方案

    今天修改了之前写的飞机大战的代码,原来的不足之处是点击屏幕的任意一点都可以移动飞机,也就是没有检测鼠标到底有没有点到飞机上. 我先是用之前的3D拾取技术,发现没有反应,才意识到我这个plane飞机节点 ...

  5. Unity3D鼠标点击物体产生事件

    如果需要处理鼠标点击物体的情况, 可以当数据接触物体时,鼠标手势改变,然后点击后和NPC产生对话等: using UnityEngine; using System.Collections; publ ...

  6. unity3d中物体的控制

    一.物体的循环移动和旋转 思路:通过对时间的计算,每隔一段时间让物体旋转,实现来回移动. float TranslateSpeed = 0.02f; float TranslateSpeedTime ...

  7. Unity3D中事件函数的运行顺序

    Unity3D中脚本的生命周期是依照预先定义好的事件函数的运行流程来演化的,详细流程例如以下: Editor模式下Reset: 当脚本第一次被挂到GameObject上或用户点击Resetbutton ...

  8. Unity3D 中 Generic 动画导入设置和 Root Motion 之间的关系

    2条评论 Unity3D 的 Mecanim 动画系统可以直接复用 3DS MAX 中制作的动画文件中的位移,这个就是通过 applyRootMotion 来达成的,我们只需要在使用 Animator ...

  9. (转)Unity3d中的碰撞检测

    很多时候,当我们的主角与其他GameObject发生碰撞时, 我们需要做一些特殊的事情,比如:子弹击中敌人,敌人就得执行一系列的动作.这时,我们就需要检测到碰撞现象,即碰撞检测.这一篇,我来具体谈谈自 ...

随机推荐

  1. [svc]centos6上部署openvpn+gg二步认证

    最近又发现个新的vpn: wireguard 为了满足员工在家办公的需求.需要 openvpn+gg方案 在centos6上部署openvpn 参考 1.安装前准备 wget -O /etc/yum. ...

  2. GlobalConfig

    -- 0 - disable debug info, 1 - less debug info, 2 - verbose debug info DEBUG = EDITOR = false -- DEB ...

  3. vim学习笔记(9):vim显示文件名

    如何让vim在编辑模式下显示文件名 在根目录下:~/.vimrc 中追加一行: set laststatus=2 shell 下执行命令: echo "set laststatus=2&qu ...

  4. FTP主动模式和被动模式的区别【转】

    转自:http://www.cnblogs.com/xiaohh/p/4789813.html 基础知识: FTP只通过TCP连接,没有用于FTP的UDP组件.FTP不同于其他服务的是它使用了两个端口 ...

  5. 【Android】HAL分析

    HAL概述 以下是基于android4.0.3,对应其他低版本的代码,可能有所差异,但基本大同小异. Android的HAL是为了保护一些硬件提供商的知识产权而提出的,是为了避开linux的GPL束缚 ...

  6. 【ARM】2410裸机系列-流水灯

    开发环境   1.硬件平台:FS2410(s3c2410) 2.主机:Ubuntu 12.04 LTS LED原理图 LED的GPIO的配置 配置GPFCON寄存器,设置GPF4-7为输出 配置GPF ...

  7. 【Mysql】Fedora下 Mysql 安装及配置

    1.安装 Mysql Server # yum install mysql mysql-server 可以到mysql官网去下载,我下载的是通用版本.你需要下载下面四个文件就可以了. mysql-cl ...

  8. Eclipse报This version of the rendering library is more recent than your version of ADT ...

    http://blog.csdn.net/zhao_3546/article/details/12968295 最近使用 Help --> Check for Updates 升级了Eclips ...

  9. LeetCode: Pascal's Triangle II 解题报告

    Pascal's Triangle II Total Accepted: 19384 Total Submissions: 63446 My Submissions Question Solution ...

  10. fzu2157(树形dp)

    http://acm.fzu.edu.cn/problem.php?pid=2157 这是一道很水的树形dp吧,本来不想写它的题解的,不过比赛的时候,队友说要我做这个题目,但是由于我感觉另一个题目可以 ...