在鼠标拖动时旋转和移动 2D 对象

Posted

技术标签:

【中文标题】在鼠标拖动时旋转和移动 2D 对象【英文标题】:Rotating and moving 2D-objects on mouse drag 【发布时间】:2021-08-08 11:44:21 【问题描述】:

我想重新创建一个游戏(七巧板),您可以在其中旋转和移动棋子。 游戏可以在这个网站上找到:https://de.mathigon.org/tangram

我找到了用于旋转和移动对象的脚本(一个 png 文件),但是当我将这两个脚本添加在一起时,对象会随机移动。作为程序,我使用 Unity。

移动脚本:

using UnityEngine;
using System.Collections;

public class DragDropScript : MonoBehaviour 
private Vector3 screenPoint;
     private Vector3 offset;
 
 
     void OnMouseDown()
     
         Debug.Log("mouse down");
         screenPoint = Camera.main.WorldToScreenPoint(transform.position);
         offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
     
 
     void OnMouseDrag()
     
         Debug.Log("mouse drag");
         Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
         Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
         transform.position = curPosition;
    
    

还有旋转脚本

using UnityEngine;
     using System.Collections;
     
     public class ObjectRotator : MonoBehaviour 
     
         
         private float _sensitivity;
         private Vector3 _mouseReference;
         private Vector3 _mouseOffset;
         private Vector3 _rotation;
         private bool _isRotating;
         
         void Start ()
         
             _sensitivity = 0.4f;
             _rotation = Vector3.zero;
         
         
         void Update()
         
             if(_isRotating)
             
                 // offset
                 _mouseOffset = (Input.mousePosition - _mouseReference);
                 
                 // apply rotation
                 _rotation.z = -(_mouseOffset.x + _mouseOffset.y) * _sensitivity;
                 
                 // rotate
                 transform.Rotate(_rotation);
                 
                 // store mouse
                 _mouseReference = Input.mousePosition;
             
         
         
         void OnMouseDown()
         
             // rotating flag
             _isRotating = true;
             
             // store mouse
             _mouseReference = Input.mousePosition;
         
         
         void OnMouseUp()
         
             // rotating flag
             _isRotating = false;
         
         
     

到目前为止,我一直在与 Unity 斗争。在我的学士论文中,我得到了一个 HoloLens2,并且可以使用真正有助于开发应用程序的 MRTK。提前谢谢你。 最后,游戏应该构建为 WebGL。

【问题讨论】:

【参考方案1】:

随机结果可能是由于尝试同时移动和旋转对象。一个简单的解决方法是在鼠标左键上移动并通过右键单击旋转,反之亦然。您可以使用Input.GetMouseButton 检查是否按下按钮并在脚本中插入检查以仅移动 OR 旋转。

更复杂的解决方案将涉及某种被拖动的“小部件”,这样您就可以使用不同的小部件进行拖动和旋转。

我还建议您学习一些几何学和三角学,以便能够理解发布的脚本。复制互联网的脚本只会让你走这么远。

【讨论】:

感谢您的回答。你知道如何让这个应用程序在触控设备上运行吗?关于 Input.GetTouch 的 Unitys 文档没有提供足够的信息,因为在触摸设备上,您无法选择鼠标左键或右键。我还尝试使用“小部件”的方法。因此,我创建了一个带有连接对象的线的圆圈。但不知何故,我在移动和旋转对象时遇到了困难,因为我找不到对象的正确层次顺序。 @LeeDatAR 我对统一性不够熟悉,无法提供任何具体建议。

以上是关于在鼠标拖动时旋转和移动 2D 对象的主要内容,如果未能解决你的问题,请参考以下文章

Cesium.js禁止三维球鼠标旋转、缩放、鼠标中键拖动

在opengl中,如何将鼠标跟随更改为鼠标单击、拖动和释放?

新人求教unity 2d 物体跟随鼠标移动的问题

OpenGL / GLUT中的鼠标拖动对象[关闭]

当摄像机旋转时,2d屏幕速度到3d世界速度

canvas里有一张图,怎么实现鼠标可以拖动该图片移动,放大缩小旋转