最近在做一个模型展示的项目,我的想法是根据滑动屏幕的x方向差值和Y方向的差值,来根据世界坐标下的X轴和Y轴进行旋转,但是实习时候总是有一些卡顿。在观察unity编辑器下的旋转之后,发现编辑器下的旋转非常流畅。仔细观察之后发现unity编辑器下的旋转运算模式如下图所示,红色箭头方向为触控滑动方向,黑色箭头为模型旋转的轴。

  了解原理之后就是实现相关功能,具体实现还是粘代码吧。代码如下

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 using UnityEngine.UI;
 5 using UnityEngine.EventSystems;
 6
 7 //脚本挂在Modelshow GameObject下
 8 public class ModelViewControl : MonoBehaviour {
 9     private bool isClick = false;
10     private Vector3 startPos;       //点下开始位置
11     private Vector3 endPos;         //点下终点位置
12     private float Move_X;           //x方向上的移动距离
13     private float Move_Y;           //Y方向上的移动距离
14
15     //回调间距
16     float interval = 0.01f;
17     float clickBeginTime = 0.0f;
18     //模型引用
19     private Transform model;    //模型根节点
20     void Start () {
21         model = transform;
22
23     }
24     // Update is called once per frame
25     void Update () {
26 #if UNITY_STANDALONE_WIN
27         if (Input.GetMouseButtonDown(0))
28 #elif UNITY_ANDROID
29         if(Input.touchCount > 0 && !isClick)
30 #endif
31         {
32             isClick = true;
33 #if UNITY_STANDALONE_WIN
34             startPos = Input.mousePosition;
35 #elif UNITY_ANDROID
36             startPos = Input.touches[0].position;
37 #endif
38             clickBeginTime = Time.time;
39         }
40 #if UNITY_STANDALONE_WIN
41         if (Input.GetMouseButtonUp(0))
42 #elif UNITY_ANDROID
43         if (Input.touchCount == 0 && isClick)
44 #endif
45         {
46             isClick = false;
47         }
48         if (isClick && (Time.time - clickBeginTime) > interval)
49         {
50 #if UNITY_STANDALONE_WIN
51             endPos = Input.mousePosition;
52 #elif UNITY_ANDROID
53             endPos = Input.touches[0].position;
54 #endif
55             if ((endPos - startPos).magnitude < 5)
56             {
57                 return;
58             }
59             if(Mathf.Abs(endPos.x - startPos.x) < 5)
60             {
61                 endPos.x = startPos.x;
62             }
63             if (Mathf.Abs(endPos.y - startPos.y) < 5)
64             {
65                 endPos.y = startPos.y;
66             }
67             RotateModel(startPos,endPos);
68             startPos = endPos;
69         }
70     }
71     void RotateModel(Vector3 startPos , Vector3 endPos)
72     {
73         Vector3 direction = endPos - startPos;
74         Vector3 world_axis = Vector3.Cross(direction, Vector3.forward);
75         model.Rotate(world_axis.normalized, direction.magnitude * 0.3f, Space.World);
76     }
77 }

  因为这个项目是PC,但是我是做手机游戏的,写个什么程序都想在手机上跑一跑,因此有比较乱的平台编译宏,主要实现为获得滑动的方向,就相当于在世界坐标下的xoy面的上的一个向量,求direction与z轴所成的面的法向量,求得的法向量就是本次旋转的轴。再根据滑动的距离来设置相应的角度。项目传到了github。有需要的小伙伴自取https://github.com/gaoxu1994/RotateForUnity

转载于:https://www.cnblogs.com/gaoxu-1994/p/6600512.html

实现Unity编辑器模式下的旋转相关推荐

  1. UNITY编辑器模式下static变量的坑

    UNITY编辑器模式下static变量的坑 在unity中写编辑器扩展工具,如在编辑器中加个菜单,点击这个菜单项时执行打包功能. 类如下,其中的静态变量,如果每次进来不清空,则LIST会越来越大,打包 ...

  2. Unity动作表情工具(编辑器模式下一边播动作一边播表情)

    一直忙于学习技术和工作好久没写博客 这次分享一下我写的一个动作表情工具 先说一下需求:美术把一帧帧表情图导出来,一张张排好序号,然后放到编辑器里面打开一个工具界面可以选动作,同时切换对应的表情,在编辑 ...

  3. android返回后屏幕旋转了,Android recovery 模式下屏幕显示旋转

    Android recovery 模式下屏幕显示旋转 大家在网上搜索 Android屏幕旋转,成千上万的文章,但是没有几个是写recovery 模式的.难道你们只旋转正常模式下的屏幕方向,不管reco ...

  4. Unity 编辑器环境下加载任意处资源 Resources.LoadAssetAtPath方法

    1.Resources.LoadAssetAtPath 在Unity3D中如何实现动态加载资源的方法,就是把资源放在Resources目录下,使用Resources.Load方法即可动态加载资源. 但 ...

  5. Android recovery 模式下屏幕显示旋转

    Android recovery 模式下屏幕显示旋转 大家在网上搜索 Android屏幕旋转,成千上万的文章,但是没有几个是写recovery 模式的.难道你们只旋转正常模式下的屏幕方向,不管reco ...

  6. Unity Editor - 在编辑器模式下执行exe程序、打开文件、定位脚本行

    执行exe程序.打开文件 当我们想在Unity 编辑器下 通过exe程序打开指定脚本时我们可以调用以下API 这里我是通过vscode 打开 lua 脚本 并定位到具体某一行. static void ...

  7. Unity Playing模式下鼠标点击放置预制体

    Playing模式下鼠标点击事件需要在MonoBehaviour::Update里处理 预制体需要放在Resource目录下,通过Resource::Load加载,再通过GameObject::Ins ...

  8. Unity运行模式下修改代码保存后报错

    原因可能是,Unity偏好设置常规这里选择了第1个,推荐选择第2个,等编辑器停止运行后再重新编译 三个选项的含义: 重新编译并继续播放: 在完成播放后重新编译: 停止播放并重新编译:

  9. unity edit模式下停止运行

    EditorApplication.isPaused = true;,编辑器暂停,很方便.

最新文章

  1. 扎心!“我学了六个月 Python,怎么还是会找不到工作”
  2. 设备I/O之OVERLAPPED
  3. python读取文件中的内容_python 读取文件夹中的文件内容
  4. 位、字,字节与KB的关系
  5. 信息 按顺序打印commit_提高效率的 10 个 Git 小技巧
  6. 孩子忽悠家长充值?腾讯游戏在人脸识别中加入语音提醒
  7. 《华林科纳-半导体工艺》PVA 刷擦洗
  8. 跟着小马哥学系列之 Spring AOP(Spring 事务(源码分析)上)
  9. 微信小程序服务通知开发
  10. mini_c编译器的简单代码逻辑
  11. Java实现支付功能代码
  12. 大白菜U盘制作工具V3.0教程
  13. TCP局域网服务器简易搭建(eps-01s)
  14. 未成年人勿进 谨以献给1980~1990出生的人(四)
  15. Python-玩转数据-python网络编程
  16. JMeter 扩展开发:扩展 TCP 取样器
  17. python自动化框架:pywinauto实现博客之星自动化评论
  18. Follow your heart (189)---那些正话反说,反话正说的方向
  19. 〖ChatGPT实践指南 - 零基础扫盲篇⑥〗- OpenAI API 报错An error occurred during your request
  20. 联想ThinkSystem融合架构简介 - ThinkAgile SX for Nutanix

热门文章

  1. Linux:运行级别,root密码重置,救援模式,安装图形化界面
  2. 《从零开始学Swift》学习笔记(Day 6)——哎呀常量和变量都该什么时候用啊?...
  3. quick cocos2dx 3.x 配置win32工程
  4. 在centos 下安装配置基于gitosis 的git 服务
  5. Castle ActiveRecord学习实践(1):快速入门指南
  6. PMP考试的形式和试题分布
  7. Django H2 文档查看
  8. 【dmp文件还原到oralce数据库】
  9. 写代码如坐禅:你是哪一类程序员?
  10. 微云存照片会变模糊吗_保存照片的最佳方式是网盘、硬盘、SSD还是光盘?