-1

我对统一很陌生,我以一种特殊的方式使用它来创建非游戏 2D 应用程序所以我只使用 UI 元素。我有一些我想做的事情的问题。我有一个跟随手指(或鼠标)旋转的对象,但该对象不能离开“区域” 这是我现在的代码:

using UnityEngine;
using System.Collections;
public class SteeringWheel : MonoBehaviour
{
    public float angleMax = 90.0f;
    private float baseAngle = 0.0f;
    void OnMouseDown()
    {
         Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
         pos = Input.mousePosition - pos;
         baseAngle = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg;
         baseAngle -= Mathf.Atan2(transform.right.y, transform.right.x) * Mathf.Rad2Deg;
     }

     void OnMouseDrag()
     {
         Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
         pos = Input.mousePosition - pos;
         float ang = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg - baseAngle;
         Debug.Log("ang1 : " + ang);
         ang = Mathf.Clamp(ang, -90, 90);
         if (transform.eulerAngles.z >= 89 && transform.eulerAngles.z <= 271)
         {
             transform.rotation = new Quaternion(transform.rotation.x, transform.rotation.y, 0.7f, transform.rotation.w);
             return;
         }       
         transform.rotation = Quaternion.AngleAxis(ang, Vector3.forward);        
     }
 }

这是问题的 GIF:

http://img15.hostingpics.net/pics/324271Animation.gif

4

2 回答 2

0

感谢您的回答:) 我在 Unity Answer 上提出我的问题,有人回答我,我这样解决我的问题:

public class SteeringWheel : MonoBehaviour
{
    public float angleMax = 90.0f;
    private float baseAngle = 0.0f;

    void OnMouseDown()
    {
        Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
        pos = Input.mousePosition - pos;
        baseAngle = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg;
        baseAngle -= Mathf.Atan2(transform.right.y, transform.right.x) * Mathf.Rad2Deg;
    }

    void OnMouseDrag()
    {
        Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
        pos = Input.mousePosition - pos;
        //float ang = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg - baseAngle;
        float ang = Mathf.Atan2(Mathf.Max(pos.y, 0), pos.x) * Mathf.Rad2Deg - baseAngle;
        Debug.Log("ang1 : " + ang);
        ang = Mathf.Clamp(ang, -90, 90);           
        transform.rotation = Quaternion.AngleAxis(ang, Vector3.forward);
    }
}
于 2016-05-19T08:53:36.880 回答
0

删除 if 语句及其中的所有内容,并将 Mathf.Clamp 调用放在带有 baseAngle 的减法之前而不是之后。

  • if 语句是错误的,因为它在设置之前检查变换旋转。之前的轮换是什么并不重要,如果你还是要改变它。
  • 基本角度是在运行时计算的,因此将其限制在预定义的范围内是没有意义的。无论如何,钳位范围似乎更适合 baseAngle 减法之前的值。

我没有看到这两个更改无法解决的代码问题。

(顺便说一下,我假设 baseAngle 在轮子的中心。如果不是,你应该相应地改变你的范围。)

干杯!

于 2016-05-19T00:08:00.000 回答