Unityを使って簡単な反復アプリケーションを作成するように求められました。このアプリケーションには、カメラに関する2つの主要機能があります。Unityのタッチコントロールとカメラのパンを組み合わせる
- 対象物に焦点を合わせるためにカメラを照合する。
- コントロールをユーザーに放棄して、ユーザーがオブジェクトを回ったりズームしたりできるようにします。
私はこれが初めてですが、これらの目標を孤立して達成する2つのスクリプトを作成しました。今私はそれらを合わせるのに苦労しています。
ユーザーの操作に関連するコードから始めます。
まず、TouchKitを使用して、各フレームのデルタ値を設定します(Start
)。
// set the delta on each frame for horizontal and vertical rotation
var oneTouch = new TKPanRecognizer();
oneTouch.gestureRecognizedEvent += (r) =>
{
HorizontalDelta += r.deltaTranslation.x * rotateSpeed * Time.deltaTime;
VerticalDelta -= r.deltaTranslation.y * rotateSpeed * Time.deltaTime;
};
// do the same for pinch
var pinch = new TKPinchRecognizer();
pinch.gestureRecognizedEvent += (r) =>
{
rotateDistance -= r.deltaScale * 200.0f * Time.deltaTime;
};
TouchKit.addGestureRecognizer(oneTouch);
TouchKit.addGestureRecognizer(pinch);
そしてUpdate
上:
VerticalDelta = Mathf.Clamp(VerticalDelta, verticalPivotMin, verticalPivotMax);
var direction = GetDirection(HorizontalDelta, VerticalDelta);
var currentTarget = targetsSwitched ? target2 : target;
transform.position = currentTarget.position - direction * rotateDistance;
transform.LookAt(currentTarget.position);
// ...
private Vector3 GetDirection(float x, float y)
{
Quaternion q = Quaternion.Euler(y, x, 0);
return q * Vector3.forward;
}
これは美しく動作し、私が欲しいまさにありません。問題は、カメラの移動スクリプトとこのコードを統合しようとするときに発生します。 (私はこれについて間違っている可能性があります)
void SetMoveToTarget(GameObject target)
{
if (currentlyMoving == false)
{
currentlyMoving = true;
fromRotation = currentTarget.transform.rotation;
currentTarget = target;
toRotation = currentTarget.transform.rotation;
timeStartedLerping = Time.time;
}
}
void FocusTarget(GameObject target)
{
float timeSinceStarted = Time.time - timeStartedLerping;
float percentageComplete = timeSinceStarted/(lerpSpeed);
transform.position = Vector3.MoveTowards(transform.position, target.transform.position, moveSpeed * Time.deltaTime);
transform.rotation = Quaternion.Lerp(fromRotation, toRotation, Mathf.Pow(percentageComplete, (float)1.2));
if (Vector3.Distance(transform.position, target.transform.position) < 0.1 && percentageComplete > 0.99)
{
transform.position = target.transform.position;
transform.rotation = target.transform.rotation;
currentlyMoving = false;
}
}
私は何をする必要があるかと思う:これは私がこれらは実際にカメラを移動する機能があるUpdate
コード
void Update()
{
if (currentlyMoving)
{
FocusTarget(currentTarget);
}
else
{
// accept user input if not moving
if (Input.GetKeyDown(KeyCode.Space))
{
SetMoveToTarget(mainTargetObject);
}
if (Input.GetKeyDown(KeyCode.Q))
{
SetMoveToTarget(subTargetObject1);
}
if (Input.GetKeyDown(KeyCode.E))
{
SetMoveToTarget(subTargetObject2);
}
}
}
を追加する場所を示しrotateDistance
は、2番目のスクリプトのcurrentTarget
と1番目のスクリプトのcurrentTarget
の差に設定されています。
ありがとうございます、私にとっては非常に難しいものです。