【问题标题】:Rotating and moving 2D-objects on mouse drag在鼠标拖动时旋转和移动 2D 对象
【发布时间】: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。

【问题讨论】:

    标签: c# unity3d rotation move


    【解决方案1】:

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

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

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

    【讨论】:

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