前述のように、タッチスクリーンを使用するという要求を突然変更したため、現在のプロジェクトではTouchScriptを使用しています。TouchScriptの元の機能はプロジェクトを満足させることができません。
インターネットで見つかった教えのほとんどは、スクリプトで他の関数を書く方法を述べていなかったので、私はそれを段階的に研究することしかできません。
まず、TouchScriptを理解していない場合は、この大きな説明を読むことができます。
TouchScript中国語—ジェスチャー-アルコバレーノ-CSDNブログ
次に、デモのピットについて話させてください
カメラ
CameraControllerに問題があります。つまり、「1本の指」と「2本の指」が同じGestureを使用し、同じGameObjectに接続されているため、2番目のピット
が発生します。これら2つのScreenTransformGesturesをnoneに変更してから、再起動するとアタッチすると、ジェスチャの1つが無効であることがわかります。元々、アタッチすると、ゲームオブジェクト内の最初の適格なゲームオブジェクトが自動的に追加されます。したがって、最初のジェスチャをアタッチした後、追加する前に、最初に次のScreenTransformGesture Move upを追加する必要があります(消すのが賢明です)、バグがデバッグされて、それが原因かどうかわからないことがあります。これが原因で時間が無駄になることがよくあります。
twoFingerTransformHandlerという名前の応答メソッドでは、実際に実行されるのは「1本の指」操作ですが、manipulationTransformedHandler応答メソッドは「2本の指」操作です。スクリプトを変更したとき、これは長い間立ち往生していました。。。
以下は、デモスクリプトを変更した結果です。
以前は非常に簡単だと思っていたので、プロジェクトに直接入れて変更しましたが、失敗し続けました。今回はまずデモで変更してみますが、これは変更と操作の成功の結果です。
回転の制限を追加して、上限と下限が一定の角度内に収まるようにしました。
(後でプロジェクトに移動したときに、そのような回転によってレンズが水平に傾くことがわかりました。これは後の
話です。)次に、ズームをレンズのFieldOfView値に変更しました。
マルチユーザー
これは実際には穴ではなく、後で記憶されないように書かれています。
マルチユーザーデモでは、RawImageを使用して画面を分割しませんが、CameraのDepthとViewPointのXYWHを使用して制御し、FullScreenレイヤーを追加するだけです。RawImageでも同じことを行う必要があります。RawImageを画面サイズに調整してから、Camera ViewPointのXYWHを変更してサイズを制御することをお勧めします。最後に、RawImageのRaycastターゲットをオフにすることを忘れないでください。
================================================= ==============
将来はとてもスムーズになると思いました、結果。。。
プロジェクトに移動した後、MoveGestureとRotateGestureは2つのレンズで使用され、ZoomGestureは両方のレンズで使用されるため、それらを分離する必要があります。今どのように行っても、同時に存在できるのはMoveGesture、RotateGesture、ZoomGestureのいずれか1つだけです。動作しますが、動作しません。
ここは最も厄介な場所です。ジェスチャは独立していて効果的です。また、独自のフレンドリージェスチャリストもありますが、どのように実行しても、毎回1つのジェスチャしか動作しません。自分
のコードロジックに問題があることに気づき、問題があると思って解決しました。解決しませんでした
また、RotateGestureは「1本指」で明確に操作され、「1本指」で効果がない場合もあります。このとき「2本指」操作は有効ですが、手を離すと「1本指」操作しか使えず、「2本指」操作は無効になります。 。
後で、なぜ大丈夫だったのかわかりません。
MoveGestureの効果は、垂直方向に上下に移動し、右クリックするだけで水平方向に移動することです。コード内で動的であるだけなので、問題
がManipulationGesture.DeltaScale
あると思います。
cam.transform.localPosition += Vector3.forward*(ManipulationGesture.DeltaScale - 1f)*ZoomSpeed;
================================================= =============
11分の19
さて、私はCameraController.csのコピーを作成し、私が欲しい機能を書き換える。最後に、2つのジェスチャーを同時に使用することができないという問題はありません。MoveGestureとRotateGestureを同じVoidに入れ、そうでない場合は区切ります。右クリック
に対する応答があるかどうかを確認する時間がないため、MoveGestureパーツは一時的に閉じられます。
Zoom and Rotationはプロジェクトの元のロジックを使用し、おそらく問題を解決しました。
float xDeg;
float yDeg;
private void OneFingerHandler(object sender, System.EventArgs e)
{
/*
var rotation = Quaternion.Euler(OneFingerGesture.DeltaPosition.y/Screen.height*RotationSpeed,
-OneFingerGesture.DeltaPosition.x/Screen.width*RotationSpeed,
OneFingerGesture.DeltaRotation);
pivot.localRotation *= rotation;
*/
if(rotationFlag != 0)
{
if (m_isFirstRotation)
{
m_isFirstRotation = false;
xDeg = Vector3.Angle(Vector3.right, pivot.right);
yDeg = Vector3.Angle(Vector3.up, pivot.up);
}
xDeg += (OneFingerGesture.DeltaPosition.x / Screen.width) * RotationSpeed;
yDeg -= (OneFingerGesture.DeltaPosition.y / Screen.height) * RotationSpeed / 2;
//Clamp the vertical axis for the orbit
yDeg = Mathf.Clamp(yDeg, yMinLimit, yMaxLimit);
pivot.rotation = Quaternion.Euler(yDeg, xDeg, 0);
}
else
{
//Zoom Gesture
}
}
private void Update()
{
if (Input.mouseScrollDelta.y != 0 && !Input.GetMouseButton(0) && !Input.GetMouseButton(1))
{
m_slider.value += Input.mouseScrollDelta.y;
OnSliderValueChanged(m_slider.value);
}
}
private void TwoFingerHandler(object sender, System.EventArgs e)
{
m_slider.value += (TwoFingerGesture.DeltaScale - 1f) * ZoomSpeed;
OnSliderValueChanged(m_slider.value);
}
public void OnSliderValueChanged(float value)
{
m_fieldOfView =
(value / 3) * (m_maxFieldOfView - m_minFieldOfView) + m_minFieldOfView;
cam.fieldOfView = m_fieldOfView;
IBMessenger.Broadcast(IBStrings.IB_STRING_FIELD_OF_VIEW_CHANGED);
ビルドが出た後、別の問題が見つかりました。
標準レイヤーに参加していなかったため、他のUGUI(ボタン、スライダーなど)をクリックできなかったため、追加してから使用できます。
このようにして、あなたは終わりを迎えることができます
ヾ( ̄▽ ̄)Bye〜Bye〜