-1

私はユニティにかなり慣れていないので、game2D 以外のアプリケーションを作成する特別な方法でそれを使用します。そのため、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 減算前の値の方が適しているようです。

あなたのコードには、これら 2 つの変更で修正できない問題は見当たりません。

(ちなみに、baseAngle はホイールの中心にあると想定しています。そうでない場合は、それに応じて範囲を変更する必要があります。)

乾杯!

于 2016-05-19T00:08:00.000 に答える