補足ですが、ベクトルを算出したあとの挙動に関しては、ベクトル間の角度を求める Vector3.Angle() と 2つのベクトルに対して垂直なベクトルを求める Vector3.Cross() を用いると良いかもしれません。
以下は単純にタッチした方向に target を回転中心として speed(degree/s) でスティックの先端を向けるコードの例です。
csharp
1public class RotateAround : MonoBehaviour {
2
3 public Transform target;
4 public float speed = 10.0f;
5
6 float angle = 0.0f;
7 int clockWise = 1;
8
9 void Update()
10 {
11 // タッチしたとき
12 if (Input.GetMouseButtonDown(0))
13 {
14 // タッチした座標を取得
15 Vector3 touchPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition + new Vector3(0.0f, 0.0f, 10.0f));
16
17 // ターゲットからタッチした座標への正規化ベクトルを取得
18 Vector3 toTouchPosition = Vector3.Scale(touchPosition - target.position, new Vector3(1.0f, 1.0f, 0.0f)).normalized;
19
20 // ターゲットからスティックへの正規化ベクトルを取得
21 Vector3 toStick = Vector3.Scale(transform.position - target.position, new Vector3(1.0f, 1.0f, 0.0f)).normalized;
22
23 // 回転角度を取得
24 angle = Vector3.Angle(toStick, toTouchPosition);
25
26 // 外積より、角度の正負を求める(回転軸が Vector3.back のとき、時計回り:正、反時計回り:負)
27 Vector3 cross = Vector3.Cross(toStick, toTouchPosition);
28 clockWise = cross.z > 0.0f ? -1 : 1;
29 }
30
31 // 回転角度が設定されているとき、回転処理を行う
32 if (angle > 0.0f)
33 {
34 float deltaAngle = speed * Time.deltaTime;
35
36 // 回転がはみ出さないように
37 deltaAngle = Mathf.Min(deltaAngle, angle);
38
39 // 回転処理
40 transform.RotateAround(target.position, Vector3.back, deltaAngle * clockWise);
41
42 // 回転した分だけ減らす
43 angle -= deltaAngle;
44 }
45 }
46}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/14 09:29